Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
511 commits
Select commit Hold shift + click to select a range
f754bf0
Merge pull request #61 from stickerdaniel/renovate/oven-sh-setup-bun-2.x
stickerdaniel Dec 24, 2025
82362f8
Merge pull request #58 from stickerdaniel/renovate/actions-checkout-6.x
stickerdaniel Dec 24, 2025
c4ed5fe
Merge pull request #57 from stickerdaniel/renovate/python-3.x
stickerdaniel Dec 24, 2025
de07c95
fix(ci): downgrade Python from 3.14 to 3.13
stickerdaniel Dec 25, 2025
dc17552
fix(ci): downgrade Python from 3.14 to 3.13 (#63)
stickerdaniel Dec 25, 2025
9ca1823
feat: Add MCP tool annotations for improved LLM integration
web-flow Dec 29, 2025
55ca244
feat: Add MCP tool annotations for improved LLM integration (#65)
stickerdaniel Dec 30, 2025
e0460c8
fix(vscode): correct entry point in VS Code tasks
stickerdaniel Jan 4, 2026
579aa7d
fix(vscode): correct entry point in VS Code tasks (#66)
stickerdaniel Jan 4, 2026
b942d15
fix(vscode): use --log-level DEBUG instead of --debug
stickerdaniel Jan 4, 2026
2285eb0
fix(vscode): use --log-level DEBUG instead of --debug (#67)
stickerdaniel Jan 4, 2026
f2b67c2
fix(deps): upgrade fastmcp to fix 307 redirect issue
stickerdaniel Jan 4, 2026
9710b52
fix(deps): upgrade fastmcp to fix 307 redirect issue (#68)
stickerdaniel Jan 4, 2026
625cef5
fix(logging): filter noisy fastmcp debug logs
stickerdaniel Jan 4, 2026
f3c488d
fix(logging): filter noisy fastmcp debug logs (#69)
stickerdaniel Jan 4, 2026
1e55480
docs: update tool status table for January 2026
stickerdaniel Jan 4, 2026
b4ae537
docs: update tool status table for January 2026 (#72)
stickerdaniel Jan 4, 2026
4dc2cbd
fix(docs): Refactor notes and tips formatting in README
stickerdaniel Jan 4, 2026
0212ee2
Merge pull request #73 from stickerdaniel/fix/readme-tips-formatting
stickerdaniel Jan 4, 2026
fcb61e2
chore(release): bump version to 1.4.1
stickerdaniel Jan 4, 2026
ef90ae1
chore(release): bump version to 1.4.1 (#74)
stickerdaniel Jan 4, 2026
22066f5
chore(dxt): update manifest.json version to v1.4.1 [skip ci]
github-actions[bot] Jan 4, 2026
67b1c16
chore(renovate): enhance config with grouping and automerge
stickerdaniel Jan 4, 2026
ad3be3f
chore(renovate): enhance config with grouping and automerge (#75)
stickerdaniel Jan 4, 2026
9ee0c0a
docs(references): add linkedin_scraper as a submodule for exploration
stickerdaniel Jan 9, 2026
4c7c97f
chore(dependencies): update linkedin-scraper to version 3.0.1 and add…
stickerdaniel Jan 9, 2026
b023081
refactor(scraper): migrate to Playwright for browser automation and e…
stickerdaniel Jan 10, 2026
6b3c31c
refactor(tools): remove dead retry code and add FastMCP progress repo…
stickerdaniel Jan 11, 2026
5fbb622
refactor(Dockerfile): optimize dependency sync with caching and enhan…
stickerdaniel Jan 11, 2026
8839f5d
refactor(docker-compose, README, setup.py, job.py): enhance session m…
stickerdaniel Jan 11, 2026
845a07a
style: use PEP 604 union syntax for type hints
stickerdaniel Jan 11, 2026
6c319a3
refactor(authentication, callbacks, browser, error_handler, cli_main,…
stickerdaniel Jan 11, 2026
5ecca33
refactor(callbacks): remove logging and error handling from MCPContex…
stickerdaniel Jan 11, 2026
e86cb7c
fix(vscode): update task configurations for MCP server
stickerdaniel Jan 11, 2026
9c6898d
fix(error_handler, browser): improve authentication error messages
stickerdaniel Jan 11, 2026
b45c828
feat(env): add .env.example file and integrate python-dotenv for envi…
stickerdaniel Jan 12, 2026
9daaedd
feat/migrate-to-v3 (#80)
stickerdaniel Jan 12, 2026
b97411a
chore: update version to 2.0.0 and enhance README formatting
stickerdaniel Jan 12, 2026
79b678b
chore(dxt): update manifest.json version to v2.0.0 [skip ci]
github-actions[bot] Jan 12, 2026
e162530
fix(docker): create uv cache dir before cache mount
stickerdaniel Jan 12, 2026
63ee8f4
chore: bump version to 2.0.1 in pyproject.toml to trigger auto releas…
stickerdaniel Jan 12, 2026
e0696ef
chore(dxt): update manifest.json version to v2.0.1 [skip ci]
github-actions[bot] Jan 12, 2026
993c618
fix(docker): remove cache mount causing CI permission errors
stickerdaniel Jan 12, 2026
d16322c
chore(dxt): update manifest.json version to v2.0.2 [skip ci]
github-actions[bot] Jan 12, 2026
b398e00
docs(installation): uvx is the first and recommended installation me…
stickerdaniel Jan 12, 2026
c98cbed
docs(README): shorter features sectino
stickerdaniel Jan 12, 2026
0fd12ae
docs(README): Add Playwright installation to README prerequisites
stickerdaniel Jan 12, 2026
edadcf1
fix(browser): validate session requires navigating to LinkedIn feed f…
stickerdaniel Jan 12, 2026
5696de0
docs(README): streamline command examples and remove star section
stickerdaniel Jan 12, 2026
a210849
feat(config): add configurable browser timeout
stickerdaniel Jan 12, 2026
ffebbe3
feat(config): enhance timeout validation and refactor browser setting…
stickerdaniel Jan 12, 2026
1b81ea9
docs(README): remove star history section from README
stickerdaniel Jan 12, 2026
a94fe37
Merge pull request #82 from stickerdaniel/feat/default-timeout-config…
stickerdaniel Jan 12, 2026
3c47f02
chore: bump version to 2.1.0
stickerdaniel Jan 12, 2026
0336687
chore(dxt): update manifest.json version to v2.1.0 [skip ci]
github-actions[bot] Jan 12, 2026
ed32fa0
fix(manifest): remove stale get_recommended_jobs tool reference
stickerdaniel Jan 12, 2026
da9cd11
fix(browser): pass config options to BrowserManager
stickerdaniel Jan 12, 2026
d38a5ba
fix(manifest): remove stale get_recommended_jobs tool reference (#84)
stickerdaniel Jan 12, 2026
0bb3148
fix(dxt): use ${HOME} instead of tilde in Docker volume mount
stickerdaniel Jan 12, 2026
d442832
Update browser.py
stickerdaniel Jan 12, 2026
36e2ba3
fix(dxt): use ${HOME} instead of tilde in Docker volume mount (#88)
stickerdaniel Jan 12, 2026
f6fa2b4
fix(browser): pass config options to BrowserManager (#86)
stickerdaniel Jan 12, 2026
70fb1c7
docs(readme): reorder badges to match section order
stickerdaniel Jan 12, 2026
35b1327
docs(readme): reorder badges to match section order (#89)
stickerdaniel Jan 12, 2026
e42fb58
chore: bump version to 2.1.1
stickerdaniel Jan 12, 2026
f638375
chore(dxt): update manifest.json version to v2.1.1 [skip ci]
github-actions[bot] Jan 12, 2026
54f3cbf
fix(dxt): update manifest descriptions and remove invalid compatibili…
stickerdaniel Jan 12, 2026
2a7bc42
fix(dxt): update manifest descriptions and remove invalid compatibili…
stickerdaniel Jan 12, 2026
ee39269
ci(docker): auto-update Docker Hub description on release
stickerdaniel Jan 12, 2026
5d565b9
ci(docker): auto-update Docker Hub description on release (#91)
stickerdaniel Jan 12, 2026
40b8ef4
docs(readme): update documentation for consistency and accuracy
stickerdaniel Jan 12, 2026
e7ef87a
docs(readme): update documentation for consistency and accuracy (#92)
stickerdaniel Jan 12, 2026
4350e34
chore: bump version to 2.1.2
stickerdaniel Jan 12, 2026
c23112d
chore: bump version to 2.1.2 (#93)
stickerdaniel Jan 12, 2026
e0d9621
chore(dxt): update manifest.json version to v2.1.2 [skip ci]
github-actions[bot] Jan 12, 2026
063fa72
docs(README): mention Docker should be running, not just installed
stickerdaniel Jan 12, 2026
9ba87be
chore(deps): pin dependencies
renovate[bot] Jan 15, 2026
3606dec
Merge pull request #76 from stickerdaniel/renovate/pin-dependencies
stickerdaniel Jan 16, 2026
c8819ce
chore(deps): update oven-sh/setup-bun digest to db6bcf6
renovate[bot] Jan 16, 2026
c25ff4b
docs(README): add incognito cookie retrieval instructions for LinkedIn
stickerdaniel Jan 16, 2026
41eca80
Merge pull request #96 from stickerdaniel/renovate/oven-sh-setup-bun-…
stickerdaniel Jan 16, 2026
5475c26
chore(deps): update oven-sh/setup-bun digest to 3d26778
renovate[bot] Jan 16, 2026
b5fa7eb
chore(deps): update anthropics/claude-code-action digest to a017b83
renovate[bot] Jan 17, 2026
b48ee95
Merge pull request #97 from stickerdaniel/renovate/oven-sh-setup-bun-…
stickerdaniel Jan 17, 2026
cc90793
Merge pull request #98 from stickerdaniel/renovate/anthropics-claude-…
stickerdaniel Jan 17, 2026
77e159f
refactor(config): centralize validation in schema classes
stickerdaniel Jan 18, 2026
324b217
refactor(config): centralize validation in schema classes (#99)
stickerdaniel Jan 18, 2026
de8d7a5
perf(docker): reduce image size by using slim base and Chromium-only
stickerdaniel Jan 18, 2026
7ab6bf9
perf(docker): reduce image size by using slim base and Chromium-only …
stickerdaniel Jan 18, 2026
129abf0
chore(deps): pin dependencies
renovate[bot] Jan 18, 2026
8a31fad
docs(agents): llm documentation and multi agent code review flow
stickerdaniel Jan 18, 2026
ea78f26
docs(agents): llm documentation and multi agent code review flow (#102)
stickerdaniel Jan 18, 2026
8760c63
chore(release): bump version to 2.2.0
stickerdaniel Jan 18, 2026
e51cea9
chore(dxt): update manifest.json version to v2.2.0 [skip ci]
github-actions[bot] Jan 18, 2026
12785f6
docs: update env vars documentation and add version fallback
stickerdaniel Jan 18, 2026
55efe88
docs: update env vars documentation and add version fallback (#103)
stickerdaniel Jan 18, 2026
31d9bc0
chore(deps): update stickerdaniel/linkedin-mcp-server:latest docker d…
renovate[bot] Jan 18, 2026
37c5f56
chore(deps): pin dependencies (#101)
stickerdaniel Jan 18, 2026
893d297
chore(deps): update python docker tag to v3.14
renovate[bot] Jan 18, 2026
408603b
chore(deps): update stickerdaniel/linkedin-mcp-server:latest docker d…
stickerdaniel Jan 18, 2026
8756603
docs: update .env.example to clarify transport mode options
stickerdaniel Jan 18, 2026
c59d63d
chore(release): bump version to 2.2.1
stickerdaniel Jan 18, 2026
58376ca
chore(dxt): update manifest.json version to v2.2.1 [skip ci]
github-actions[bot] Jan 18, 2026
4a117bb
chore(deps): update stickerdaniel/linkedin-mcp-server:latest docker d…
renovate[bot] Jan 18, 2026
6283ddc
docs(btca): add btca for better dependency documentation access
stickerdaniel Jan 19, 2026
9e5d2b5
docs(btca): add btca for better dependency documentation access (#106)
stickerdaniel Jan 19, 2026
7be81ab
chore(docs): Cleanup old submodule setup.
stickerdaniel Jan 19, 2026
9eafeec
chore(docs): Cleanup old submodule setup. (#107)
stickerdaniel Jan 19, 2026
06d9575
feat(scraper): upgrade to linkedin-scraper 3.1.0
stickerdaniel Jan 19, 2026
9e147f7
feat(scraper): upgrade to linkedin-scraper 3.1.0 (#108)
stickerdaniel Jan 19, 2026
5cfa259
fix small issues
stickerdaniel Jan 19, 2026
06be4e0
fix small issues (#109)
stickerdaniel Jan 19, 2026
4d33973
Merge pull request #105 from stickerdaniel/renovate/stickerdaniel-lin…
stickerdaniel Jan 19, 2026
8daa715
chore: bump version to 2.3.0 for linkedin-mcp-server
stickerdaniel Jan 19, 2026
77d1773
chore(dxt): update manifest.json version to v2.3.0 [skip ci]
github-actions[bot] Jan 19, 2026
24a525e
fix(dxt): add pre-pull instructions to avoid docker pull timeout
stickerdaniel Jan 23, 2026
6b12533
fix(dxt): add pre-pull instructions to avoid docker pull timeout (#113)
stickerdaniel Jan 23, 2026
9e8074a
chore(deps): update anthropics/claude-code-action digest to f642197
renovate[bot] Jan 23, 2026
dbd5f5c
refactor: pin docker-compose.yml to version tag instead of digest
stickerdaniel Jan 24, 2026
6609c05
refactor: pin docker-compose.yml to version tag instead of digest (#116)
stickerdaniel Jan 24, 2026
4f10463
feat: add --chrome-path flag for custom browser executable
stickerdaniel Jan 24, 2026
0fa9068
feat: add --chrome-path flag for custom browser executable Add --chro…
stickerdaniel Jan 24, 2026
aed1cce
chore: update agent model configs
stickerdaniel Jan 24, 2026
aedb4f6
chore: update agent model configs (#120)
stickerdaniel Jan 24, 2026
20a4ec2
chore: disable renovate for self-referential docker image
stickerdaniel Jan 24, 2026
35ae625
chore: disable renovate for self-referential docker image (#121)
stickerdaniel Jan 24, 2026
725fb67
Merge pull request #112 from stickerdaniel/renovate/anthropics-claude…
stickerdaniel Jan 24, 2026
c301fca
chore(deps): update lockfile for Python 3.14 compatibility
stickerdaniel Jan 24, 2026
492c1f3
fix: resolve type errors for ty 0.0.13 compatibility
stickerdaniel Jan 24, 2026
048292f
Merge pull request #77 from stickerdaniel/renovate/all-minor-patch
stickerdaniel Jan 24, 2026
f8bf528
test: add minimal testing suite with CI integration
stickerdaniel Jan 24, 2026
29bb73f
test: add minimal testing suite with CI integration (#122)
stickerdaniel Jan 24, 2026
381092b
chore(deps): update ghcr.io/astral-sh/uv:latest docker digest to 143b40f
renovate[bot] Jan 27, 2026
f48d360
chore(deps): update anthropics/claude-code-action digest to 231bd75
renovate[bot] Jan 27, 2026
d0e2777
Merge pull request #124 from stickerdaniel/renovate/anthropics-claude…
stickerdaniel Jan 27, 2026
103353c
Merge pull request #123 from stickerdaniel/renovate/ghcr.io-astral-sh…
stickerdaniel Jan 27, 2026
8e29eba
fix(deps): update linkedin-scraper to 3.1.1 to fix --get-session hang
stickerdaniel Jan 27, 2026
90d5549
fix(deps): update linkedin-scraper to 3.1.1 to fix --get-session hang…
stickerdaniel Jan 27, 2026
7182ca9
chore(release): bump version to 2.3.1
stickerdaniel Jan 27, 2026
1a875e2
chore(release): bump version to 2.3.1 (#126)
stickerdaniel Jan 27, 2026
94d14ee
chore: update manifest.json and docker-compose.yml to v2.3.1 [skip ci]
github-actions[bot] Jan 27, 2026
dda0d3e
fix(docker): remove non-existent /opt/python from chmod
stickerdaniel Jan 27, 2026
5174359
fix(docker): remove non-existent /opt/python from chmod (#127)
stickerdaniel Jan 27, 2026
a184788
chore: update manifest.json and docker-compose.yml to v2.3.2 [skip ci]
github-actions[bot] Jan 27, 2026
7188157
chore(renovate): reduce PR noise with aggressive grouping
stickerdaniel Feb 1, 2026
7d02c83
feat(ci): add automated PyPI publishing with Trusted Publishing
stickerdaniel Feb 1, 2026
2aa09b2
feat(ci): add automated PyPI publishing with Trusted Publishing (#133)
stickerdaniel Feb 1, 2026
1980ac0
chore: bump version to 2.3.3
stickerdaniel Feb 1, 2026
cce68f1
chore: update manifest.json and docker-compose.yml to v2.3.3 [skip ci]
github-actions[bot] Feb 1, 2026
d707115
fix: regenerate uv.lock for new package name
stickerdaniel Feb 1, 2026
f2f58dc
chore: bump version to 2.3.4
stickerdaniel Feb 1, 2026
caca786
chore: update manifest.json and docker-compose.yml to v2.3.4 [skip ci]
github-actions[bot] Feb 1, 2026
67fe1cf
fix: add linkedin-scraper-mcp CLI alias for cleaner uvx usage
stickerdaniel Feb 1, 2026
59de989
chore: bump version to 2.3.5
stickerdaniel Feb 1, 2026
a3daff5
chore: update manifest.json and docker-compose.yml to v2.3.5 [skip ci]
github-actions[bot] Feb 1, 2026
7ae5b94
chore(deps): update ci dependencies
renovate[bot] Feb 6, 2026
78c5d17
Merge pull request #134 from stickerdaniel/renovate/ci-dependencies
stickerdaniel Feb 6, 2026
96b932d
chore(deps): update ci dependencies
renovate[bot] Feb 9, 2026
6a00243
Merge pull request #138 from stickerdaniel/renovate/ci-dependencies
stickerdaniel Feb 9, 2026
d5de8ef
fix(deps): use linkedin_scraper fork with rate limit fix
stickerdaniel Feb 12, 2026
6b6315e
fix(deps): use linkedin_scraper fork with rate limit fix (#139)
stickerdaniel Feb 12, 2026
3a29591
chore: update manifest.json and docker-compose.yml to v2.3.6 [skip ci]
github-actions[bot] Feb 12, 2026
f1331c7
fix(docker): install git for git-based dependency resolution
stickerdaniel Feb 12, 2026
c1bfaf4
fix(docker): install git for git-based dependency resolution (#140)
stickerdaniel Feb 12, 2026
d9decd0
chore: bump version to 2.3.7
stickerdaniel Feb 12, 2026
76ea004
chore: bump version to 2.3.7 (#141)
stickerdaniel Feb 12, 2026
4a8c1ee
chore: update manifest.json and docker-compose.yml to v2.3.7 [skip ci]
github-actions[bot] Feb 12, 2026
6337d88
feat!: Switch to patchright with persistent browser context
stickerdaniel Feb 12, 2026
48d9547
polish the implementation
stickerdaniel Feb 12, 2026
5fc21cb
feat!: Switch to patchright with persistent browser context (#143)
stickerdaniel Feb 12, 2026
03f0e44
chore: bump version to 3.0.0
stickerdaniel Feb 12, 2026
fd0f524
chore: bump version to 3.0.0 (#144)
stickerdaniel Feb 12, 2026
e6a5540
chore: update manifest.json and docker-compose.yml to v3.0.0 [skip ci]
github-actions[bot] Feb 12, 2026
994f983
fix(deps): use person scraper fix
stickerdaniel Feb 12, 2026
57adbfa
fix(deps): use person scraper fix (#145)
stickerdaniel Feb 13, 2026
8f9cf97
chore: bump version to 3.0.1
stickerdaniel Feb 13, 2026
e47da7c
chore: bump version to 3.0.1 (#146)
stickerdaniel Feb 13, 2026
030c1bb
chore: update manifest.json and docker-compose.yml to v3.0.1 [skip ci]
github-actions[bot] Feb 13, 2026
e3ffbe9
fix(deps)!: switch to linkedin-scraper-patchright from PyPI
stickerdaniel Feb 13, 2026
c6f1677
fix(deps)!: switch to linkedin-scraper-patchright from PyPI (#148)
stickerdaniel Feb 13, 2026
0122904
chore: update manifest.json and docker-compose.yml to v3.0.2 [skip ci]
github-actions[bot] Feb 13, 2026
0b7eb46
feat: add cookie bridge for cross-platform Docker portability
stickerdaniel Feb 13, 2026
595e4a5
chore: bump version to 3.0.3
stickerdaniel Feb 13, 2026
3854933
chore: bump linkedin-scraper-patchright to 3.1.3
stickerdaniel Feb 13, 2026
ab37a36
feat: add cookie bridge for cross-platform Docker portability (#149)
stickerdaniel Feb 13, 2026
05efe7a
chore: update manifest.json and docker-compose.yml to v3.0.3 [skip ci]
github-actions[bot] Feb 13, 2026
16c5795
fix(docker): copy profile to temp dir for cross-platform cookie bridge
stickerdaniel Feb 13, 2026
76a3650
fix(docker): copy profile to temp dir for cross-platform cookie bridg…
stickerdaniel Feb 13, 2026
8598ab6
chore: bump version to 3.0.4
stickerdaniel Feb 13, 2026
5b42e1c
chore: bump version to 3.0.4 (#151)
stickerdaniel Feb 13, 2026
3e4f59f
chore: update manifest.json and docker-compose.yml to v3.0.4 [skip ci]
github-actions[bot] Feb 13, 2026
8480a89
docs(README): Update status of get_company_profile to 'Issues'
stickerdaniel Feb 15, 2026
91c71c8
docs(README): Revise breaking change notice in README
stickerdaniel Feb 15, 2026
e9c3032
chore(deps): lock file maintenance
renovate[bot] Feb 16, 2026
8f3b70d
feat(scraper): refactored scraping tools to use innerText extraction …
stickerdaniel Feb 16, 2026
0f156ba
refactor(cli): update command from --get-session to --login across do…
stickerdaniel Feb 16, 2026
02004a6
feat(scraper): enhance LinkedIn scraping functionality and error hand…
stickerdaniel Feb 16, 2026
bd8d455
feat(scraper): enhance section parsing and error reporting in LinkedI…
stickerdaniel Feb 16, 2026
e17334b
chore(deps): update ci dependencies
renovate[bot] Feb 16, 2026
f950882
feat(scraper): improve overlay extraction and retry logic in LinkedIn…
stickerdaniel Feb 16, 2026
b3b9bb8
02-16-feat_scraper_refactored_scraping_tools_to_use_innertext_extract…
stickerdaniel Feb 16, 2026
e307176
chore: update manifest.json and docker-compose.yml to v4.0.0 [skip ci]
github-actions[bot] Feb 16, 2026
47a7d1a
Fix Anthropic LinkedIn link in README
stickerdaniel Feb 16, 2026
2778096
Merge pull request #153 from stickerdaniel/renovate/ci-dependencies
stickerdaniel Feb 16, 2026
8c5e8b4
Merge pull request #154 from stickerdaniel/renovate/lock-file-mainten…
stickerdaniel Feb 16, 2026
1317f29
docs(README): Revise client configuration and add transport modes
stickerdaniel Feb 16, 2026
5b17c95
docs(README): Clarify uvx setup instructions and Docker profile mounting
stickerdaniel Feb 16, 2026
0687d1f
fix(cli): polish stdio startup flow
stickerdaniel Feb 17, 2026
06981e7
Apply suggestions from code review
stickerdaniel Feb 17, 2026
18c1a12
docs(README): Remove redundant note on default transport for MCP clie…
stickerdaniel Feb 17, 2026
5dc8909
fix(cli): polish stdio startup flow (#156)
stickerdaniel Feb 17, 2026
794d44c
feat(tools): add search_people tool
ConnorMoss02 Feb 20, 2026
a76b271
style: fix ruff formatting in test_tools
ConnorMoss02 Feb 20, 2026
1e75f36
docs(README/Docker): add 'search_people' feature to README and Docker…
stickerdaniel Feb 20, 2026
9749577
Merge pull request #157 from ConnorMoss02/feat/search-people
stickerdaniel Feb 20, 2026
178b69c
chore: bump version to 4.1.0
stickerdaniel Feb 20, 2026
fc08682
docs(README): update contributing guidelines to encourage issue discu…
stickerdaniel Feb 20, 2026
a35072a
docs(README): consolidate contributing guidelines and remove redundan…
stickerdaniel Feb 20, 2026
56c7a46
chore: bump version to 4.1.0 (#158)
stickerdaniel Feb 20, 2026
7fc7564
ci(release): bypass branch protection for bot push
stickerdaniel Feb 20, 2026
e3a9a0d
ci(release): require PRs and enforce admins on main
stickerdaniel Feb 20, 2026
29666df
Merge branch 'main' into 02-20-chore_bump_version_to_4.1.0
stickerdaniel Feb 20, 2026
0c3a616
Merge pull request #159 from stickerdaniel/02-20-chore_bump_version_t…
stickerdaniel Feb 20, 2026
a04be8e
chore: bump version to 4.1.1
stickerdaniel Feb 20, 2026
907502a
Merge pull request #161 from stickerdaniel/02-20-chore_bump_version_t…
stickerdaniel Feb 20, 2026
e472680
fix(release): avoid YAML heredoc issue in restore step
stickerdaniel Feb 20, 2026
0efde8b
fix(release): avoid YAML heredoc issue in restore step (#162)
stickerdaniel Feb 20, 2026
3294888
fix(release): use PAT for branch protection API calls
stickerdaniel Feb 20, 2026
7f7e5c6
fix(release): use PAT for branch protection API calls (#163)
stickerdaniel Feb 20, 2026
3ec7a5b
chore: update manifest.json and docker-compose.yml to v4.1.2 [skip ci]
github-actions[bot] Feb 20, 2026
5e13063
feat(saved-jobs): fix pagination, embed job IDs, and add progress rep…
IfThingsThenStuff Feb 26, 2026
e7217f0
fix(saved-jobs): use actual page count for progress reporting
IfThingsThenStuff Feb 26, 2026
63f455f
fix(saved-jobs): cap total_pages, add nav delay, use Set for O(1) loo…
IfThingsThenStuff Feb 26, 2026
5e68717
docs(saved-jobs): add docs, expose max_pages, use Set in JS dedup
IfThingsThenStuff Feb 26, 2026
29b3288
Merge branch 'main' into feat/saved-jobs-fix-and-progress
IfThingsThenStuff Apr 8, 2026
62797de
feat(saved-jobs): fix pagination, embed job IDs, and add progress rep…
IfThingsThenStuff Feb 26, 2026
dabea7f
fix(saved-jobs): use actual page count for progress reporting
IfThingsThenStuff Feb 26, 2026
e74d145
fix(saved-jobs): cap total_pages, add nav delay, use Set for O(1) loo…
IfThingsThenStuff Feb 26, 2026
a8750de
docs(saved-jobs): add docs, expose max_pages, use Set in JS dedup
IfThingsThenStuff Feb 26, 2026
1235625
fix(saved-jobs): remove stale scraper override
IfThingsThenStuff Apr 8, 2026
12a8332
Make tests involving file paths pass on windows
IfThingsThenStuff Apr 8, 2026
fdf12c5
fix(tests): clean saved jobs tests
IfThingsThenStuff Apr 8, 2026
607ba41
Merge remote-tracking branch 'upstream/main'
IfThingsThenStuff Apr 8, 2026
fbbc714
Merge branch 'main' into feat/saved-jobs-fix-and-progress-v2
IfThingsThenStuff Apr 8, 2026
6af8d56
Test fixes
IfThingsThenStuff Apr 8, 2026
1ccb9f9
fix(saved-jobs): address PR review feedback
IfThingsThenStuff Apr 8, 2026
ed3ae1e
Merge remote-tracking branch 'upstream/main' into feat/saved-jobs-fix…
IfThingsThenStuff Apr 9, 2026
814ef0d
merge: update branch from main
IfThingsThenStuff Apr 10, 2026
e01d256
Merge branch 'main' into feat/saved-jobs-fix-and-progress-v2
IfThingsThenStuff Apr 10, 2026
40839a1
Merge branch 'main' into feat/saved-jobs-fix-and-progress-v2
IfThingsThenStuff Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
---
name: Bug Report
about: Create a report to help us improve the LinkedIn MCP server
title: '[BUG] '
labels: ['bug']
assignees: ''

---

## Installation Method
- [ ] Docker (specify docker image version/tag): _._._
- [ ] Claude Desktop DXT extension (specify docker image version/tag): _._._
- [ ] Local Python setup

## When does the error occur?
- [ ] At startup
- [ ] During tool call (specify which tool):
- [ ] get_person_profile
- [ ] get_company_profile
- [ ] get_job_details
- [ ] get_saved_jobs
- [ ] search_jobs
- [ ] close_session

## MCP Client Configuration

**Claude Desktop Config** (`/Users/[username]/Library/Application Support/Claude/claude_desktop_config.json`):
```json
{
"mcpServers": {
"linkedin": {
// Your configuration here (remove sensitive credentials)
}
}
}
```

## MCP Client Logs
**Claude Desktop Logs** (`/Users/[username]/Library/Logs/Claude/mcp-server-LinkedIn MCP Server.log`):
```
Paste relevant log entries here
```

## Error Description
What went wrong and what did you expect to happen?
50 changes: 50 additions & 0 deletions .github/ISSUE_TEMPLATE/documentation_issue.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
---
name: Documentation Issue
about: Report problems with README, setup instructions, or other documentation
title: '[DOCS] '
labels: ['documentation']
assignees: ''

---

## Documentation Problem
**What documentation issue did you find?**
- [ ] Incorrect/outdated setup instructions
- [ ] Missing information
- [ ] Unclear/confusing explanations
- [ ] Broken links
- [ ] Example code doesn't work
- [ ] Missing prerequisites
- [ ] Inconsistent information
- [ ] Typos/grammar issues
- [ ] Other: ___________

## Location
**Where is the documentation issue?**
- [ ] README.md
- [ ] Code comments
- [ ] Error messages
- [ ] CLI help text
- [ ] Other: ___________

**Specific section/line:**
___________

## Current Documentation
**What does the documentation currently say?**
```
Paste the current text or link to the specific section
```

## Problem Description
**What's wrong or confusing about it?**
A clear description of why this documentation is problematic.

## Suggested Fix
**What should it say instead?**
```
Suggested replacement text or improvements
```

## Additional Context
Add any other context, screenshots, or examples that would help improve the documentation.
20 changes: 20 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
name: Feature Request
about: Suggest an idea for the LinkedIn MCP server
title: '[FEATURE] '
labels: ['enhancement']
assignees: ''

---

## Feature description
Describe what you want to happen.

## Use case
Why this feature is useful.

## Suggested implementation
If you have a specific idea for how to implement this feature, please describe it here.

## Additional context
Add any other details that would help.
49 changes: 49 additions & 0 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Claude Code

on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
pull_request_review:
types: [submitted]

jobs:
claude:
if: |
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 1

- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@68cfeead1890300cc87935dbe2c023825be87b8a # v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}

# This is an optional setting that allows Claude to read CI results on PRs
additional_permissions: |
actions: read

# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
# prompt: 'Update the pull request description to include a summary of changes.'

# Optional: Add claude_args to customize behavior and configuration
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://code.claude.com/docs/en/cli-reference for available options
# claude_args: '--allowed-tools Bash(gh pr:*)'
2 changes: 1 addition & 1 deletion CLAUDE.md
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ Through this LinkedIn MCP server, AI assistants like Claude can connect to your
| `search_jobs` | Search for jobs with keywords and location filters | working |
| `search_people` | Search for people by keywords and location | working |
| `get_job_details` | Get detailed information about a specific job posting | working |
| `get_saved_jobs` | Get saved/bookmarked jobs from your LinkedIn job tracker | [#330](https://github.com/stickerdaniel/linkedin-mcp-server/issues/330) |
| `close_session` | Close browser session and clean up resources | working |

<br/>
Expand Down
1 change: 1 addition & 0 deletions docs/docker-hub.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ A Model Context Protocol (MCP) server that connects AI assistants to LinkedIn. A
- **Company Profiles**: Extract comprehensive company data
- **Job Details**: Retrieve job posting information
- **Job Search**: Search for jobs with keywords and location filters
- **Saved Jobs**: Get saved/bookmarked jobs from your LinkedIn job tracker
- **People Search**: Search for people by keywords and location
- **Person Posts**: Get recent activity/posts from a person's profile
- **Company Posts**: Get recent posts from a company's LinkedIn feed
Expand Down
158 changes: 158 additions & 0 deletions linkedin_mcp_server/scraping/extractor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from dataclasses import dataclass
import logging
import re
from collections.abc import Awaitable, Callable
from typing import TYPE_CHECKING, Any, Literal
from urllib.parse import parse_qs, quote_plus, urljoin, urlparse

Expand Down Expand Up @@ -2129,6 +2130,163 @@ async def search_jobs(
result["section_errors"] = section_errors
return result

_EXTRACT_JOB_IDS_JS = """() => {
const seen = new Set();
const ids = [];
document.querySelectorAll('a[href*="/jobs/view/"]').forEach(a => {
const match = a.href.match(/\\/jobs\\/view\\/(\\d+)/);
if (match && !seen.has(match[1])) { seen.add(match[1]); ids.push(match[1]); }
});
return ids;
}"""

_EXTRACT_MAIN_TEXT_JS = """() => {
const main = document.querySelector('main');
return main ? main.innerText : document.body.innerText;
}"""

_EXTRACT_MAX_PAGE_JS = """() => {
const pageNumbers = Array.from(
document.querySelectorAll('button[aria-label^="Page "]')
)
.map(button => {
const label = button.getAttribute('aria-label') || '';
const match = label.match(/^Page (\\d+)$/);
return match ? Number(match[1]) : null;
})
.filter(page => Number.isInteger(page));
return pageNumbers.length ? Math.max(...pageNumbers) : 1;
}"""

async def scrape_saved_jobs(
self,
max_pages: int = 10,
on_progress: Callable[[int, int, str], Awaitable[None]] | None = None,
) -> dict[str, Any]:
"""Scrape the user's saved/bookmarked jobs from the jobs tracker page.

Automatically paginates through all pages using numbered page buttons.
Extracts job IDs from link hrefs (``/jobs/view/<id>/``) since they are
not present in the page's innerText.

Args:
max_pages: Safety cap on pages to scrape (default 10).
on_progress: Optional async callback ``(page, total, message)``
invoked after each page is scraped.

Returns:
{url, sections: {name: text}, job_ids: list[str]}
"""
url = "https://www.linkedin.com/jobs-tracker/"
extracted = await self.extract_page(url, "saved_jobs")

all_text_parts: list[str] = []
all_job_ids: list[str] = []

if extracted.text:
all_text_parts.append(extracted.text)

# Collect job IDs from page 1.
page_ids: list[str] = await self._page.evaluate(self._EXTRACT_JOB_IDS_JS)
all_job_ids.extend(page_ids)
logger.info("Page 1: found %d job IDs", len(page_ids))

# LinkedIn can render a sliding window of numbered buttons, so refresh
# the largest visible page number as pagination advances.
total_pages = min(
max(await self._page.evaluate(self._EXTRACT_MAX_PAGE_JS), 1),
max_pages,
)
logger.info("Total pages detected: %d", total_pages)

if on_progress:
await on_progress(1, total_pages, "Fetched saved jobs page 1")

# Paginate through remaining pages using numbered page buttons.
for page_num in range(2, max_pages + 1):
page_btn = self._page.locator(f'button[aria-label="Page {page_num}"]')
if not await page_btn.count():
logger.info(
"No page %d button found — stopping at page %d",
page_num,
page_num - 1,
)
break

logger.info("Navigating to saved jobs page %d", page_num)
prev_ids = set(all_job_ids)
await page_btn.scroll_into_view_if_needed()
await page_btn.click()
await asyncio.sleep(_NAV_DELAY)

# Wait for the DOM to reflect new job links.
try:
await self._page.wait_for_function(
"""(prevIds) => {
const prev = new Set(prevIds);
const links = document.querySelectorAll('a[href*="/jobs/view/"]');
for (const a of links) {
const match = a.href.match(/\\/jobs\\/view\\/(\\d+)/);
if (match && !prev.has(match[1])) return true;
}
return false;
}""",
arg=list(prev_ids),
timeout=15000,
)
except PlaywrightTimeoutError:
logger.info("No new job IDs appeared on page %d — stopping", page_num)
break

await scroll_to_bottom(self._page, pause_time=0.5, max_scrolls=3)

raw = await self._page.evaluate(self._EXTRACT_MAIN_TEXT_JS)
if raw:
cleaned = strip_linkedin_noise(raw)
if cleaned:
all_text_parts.append(cleaned)

page_ids = await self._page.evaluate(self._EXTRACT_JOB_IDS_JS)
new_ids = [jid for jid in page_ids if jid not in prev_ids]
logger.info("Page %d: found %d new job IDs", page_num, len(new_ids))
if not new_ids:
break
all_job_ids.extend(new_ids)

total_pages = max(
total_pages,
page_num,
min(
max(await self._page.evaluate(self._EXTRACT_MAX_PAGE_JS), 1),
max_pages,
),
)

if on_progress:
await on_progress(
page_num, total_pages, f"Fetched saved jobs page {page_num}"
)

# Append a summary of job IDs so they are always visible in the text.
id_summary = "\n".join(
f"- Job ID: {jid} (https://www.linkedin.com/jobs/view/{jid}/)"
for jid in all_job_ids
)
if id_summary:
all_text_parts.append(f"--- Saved Job IDs ---\n{id_summary}")

sections: dict[str, str] = {}
if all_text_parts:
sections["saved_jobs"] = "\n\n".join(all_text_parts)

logger.info("Total saved jobs found: %d across all pages", len(all_job_ids))

return {
"url": url,
"sections": sections,
"job_ids": all_job_ids,
}

async def search_people(
self,
keywords: str,
Expand Down
Loading
Loading