Skip to content

feat(messaging): add inbox, conversation, search, and send tools#235

Draft
5queezer wants to merge 654 commits into
stickerdaniel:mainfrom
5queezer:feature/234-messaging-tools
Draft

feat(messaging): add inbox, conversation, search, and send tools#235
5queezer wants to merge 654 commits into
stickerdaniel:mainfrom
5queezer:feature/234-messaging-tools

Conversation

@5queezer
Copy link
Copy Markdown

Summary

Adds 4 new messaging tools to the LinkedIn MCP server (#234):

  • get_inbox — list recent conversations from messaging inbox
  • get_conversation — read a specific thread by username or thread_id
  • search_conversations — search messages by keyword
  • send_message — send a message to a LinkedIn user

Checklist

Code

  • Add extractor methods to LinkedInExtractor (scraping/extractor.py)
  • Add messaging.py tool registration (tools/messaging.py)
  • Register tools in create_mcp_server() (server.py)
  • Add "messaging" reference kind (scraping/link_metadata.py)

Tests

  • Add mock methods to _make_mock_extractor (tests/test_tools.py)
  • Add TestMessagingTools class (tests/test_tools.py)
  • Add TestMessaging class (tests/test_scraping.py)
  • Add messaging URL classification tests (tests/test_link_metadata.py)
  • Update TestToolTimeouts.tool_names tuple

Docs

  • Update tool table in README.md
  • Update features list in docs/docker-hub.md
  • Add tools to manifest.json

Verify

  • uv run pytest --cov — 297 passed, 74.32% coverage
  • uv run ruff check . && uv run ruff format .
  • uv run ty check
  • uv run pre-commit run --all-files
  • Live test get_inbox
  • Live test get_conversation
  • Live test search_conversations
  • Live test send_message

Test plan

  • Start server: uv run -m linkedin_mcp_server --transport streamable-http --log-level DEBUG
  • Verify get_inbox returns conversation list
  • Verify get_conversation with a known username returns messages
  • Verify search_conversations returns filtered results
  • Verify send_message sends to a test account (⚠️ destructive — first write tool)

Notes

  • send_message is the first write operation in the server. It uses readOnlyHint: false and openWorldHint: true to signal MCP clients to confirm before sending.
  • Messaging tools don't follow the section-config pattern in fields.py — each method navigates directly.
  • LinkedIn may restrict messaging to 1st-degree connections. The tool handles "Message" button absence with a clear error.

Generated with Claude Opus 4.6. Prompt: Implement the following plan: LinkedIn Messaging Tools

🤖 Generated with Claude Code

github-actions Bot and others added 30 commits January 27, 2026 11:52
- Add weekly schedule (Monday 6am)
- Group all GitHub Actions and Docker images as 'CI dependencies'
- Group all major updates together
- Remove automerge (insufficient test coverage)
- Change package name to linkedin-scraper-mcp for PyPI availability
- Add PyPI metadata (authors, license, keywords, classifiers, URLs)
- Add id-token permission and publish steps to release workflow
- Update README with new uvx install commands and PyPI badge
- Update AGENTS.md with uvx command
- Create py.typed marker for type checker support

Users can now install with: uvx linkedin-scraper-mcp
…kerdaniel#133)

- Change package name to linkedin-scraper-mcp for PyPI availability
- Add PyPI metadata (authors, license, keywords, classifiers, URLs)
- Add id-token permission and publish steps to release workflow
- Update README with new uvx install commands and PyPI badge
- Update AGENTS.md with uvx command
- Create py.typed marker for type checker support

Users can now install with: uvx linkedin-scraper-mcp
…ependencies

chore(deps): update ci dependencies
…ependencies

chore(deps): update ci dependencies
Point dependency at stickerdaniel/linkedin_scraper fork
(fix/rate-limit-false-positive) to fix detect_rate_limit()
false-firing on React RSC payloads.

Also update docs with detailed release workflow notes and
bump opencode agent models to gpt-5.3-codex.

See also: joeyism/linkedin_scraper#278
…el#139)

Point dependency at stickerdaniel/linkedin_scraper fork
(fix/rate-limit-false-positive) to fix detect_rate_limit()
false-firing on React RSC payloads.

Also update docs with detailed release workflow notes and
bump opencode agent models to gpt-5.3-codex.

See also: joeyism/linkedin_scraper#278
Replace Playwright with Patchright (anti-detection fork) and use
launch_persistent_context(user_data_dir=...) for full Chromium profile
persistence. This fixes cross-platform session issues where sessions
created on macOS failed in Docker (Linux, headless).

BREAKING CHANGE: Old session.json files and LINKEDIN_COOKIE env var
are no longer supported. Users must re-run --get-session to create a
new persistent browser profile at ~/.linkedin-mcp/profile/.
…aniel#143)

feat!: Switch to patchright with persistent browser context

Replace Playwright with Patchright (anti-detection fork) and use
launch_persistent_context(user_data_dir=...) for full Chromium profile
persistence. This fixes cross-platform session issues where sessions
created on macOS failed in Docker (Linux, headless).

BREAKING CHANGE: Old session.json files and LINKEDIN_COOKIE env var
are no longer supported. Users must re-run --get-session to create a
new persistent browser profile at ~/.linkedin-mcp/profile/.

polish the implementation
stickerdaniel and others added 25 commits March 13, 2026 09:14
…ocker-bridge-debug

Feature/220 docker bridge debug
Search results pages load a placeholder first, then fill in the actual
results via JavaScript. The extractor reads innerText before content
loads, causing search_people to return empty sections intermittently.

Add wait_for_function for /search/results/ URLs (same pattern as the
activity feed fix in stickerdaniel#203). Wait up to 10s for main.innerText > 100
chars before extracting.

Tested locally: 100% success rate vs ~60% before the fix.

Made-with: Cursor
…ts-content-wait

fix(scraping): wait for search results content before extracting
…im_agents.md_to_behavioral_guidance_clean_readme_docker_section

docs: Trim AGENTS.md to behavioral guidance, clean README Docker section
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [anthropics/claude-code-action](https://redirect.github.com/anthropics/claude-code-action) ([changelog](https://redirect.github.com/anthropics/claude-code-action/compare/26ec041249acb0a944c0a47b6c0c13f05dbc5b44..df37d2f0760a4b5683a6e617c9325bc1a36443f6)) | action | digest | `26ec041` → `df37d2f` |
| [astral-sh/setup-uv](https://redirect.github.com/astral-sh/setup-uv) ([changelog](https://redirect.github.com/astral-sh/setup-uv/compare/5a095e7a2014a4212f075830d4f7277575a9d098..37802adc94f370d6bfd71619e3f0bf239e1f3b78)) | action | digest | `5a095e7` → `37802ad` |
| ghcr.io/astral-sh/uv | final | digest | `10902f5` → `3472e43` |
| [oven-sh/setup-bun](https://redirect.github.com/oven-sh/setup-bun) ([changelog](https://redirect.github.com/oven-sh/setup-bun/compare/ecf28ddc73e819eb6fa29df6b34ef8921c743461..0c5077e51419868618aeaa5fe8019c62421857d6)) | action | digest | `ecf28dd` → `0c5077e` |
| python | stage | digest | `5404df0` → `55e465c` |
| [softprops/action-gh-release](https://redirect.github.com/softprops/action-gh-release) ([changelog](https://redirect.github.com/softprops/action-gh-release/compare/a06a81a03ee405af7f2048a818ed3f03bbf83c7b..153bb8e04406b158c6c84fc1615b65b24149a1fe)) | action | digest | `a06a81a` → `153bb8e` |

---

### Configuration

📅 **Schedule**: Branch creation - "before 6am on Monday" (UTC), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/stickerdaniel/linkedin-mcp-server).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42Ni40IiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->
Closes stickerdaniel#234

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants