LinkedIn MCP Server
MCP Server for LinkedIn
免責事項: これは独立したコミュニティプロジェクトです。LinkedIn Corporation や Microsoft と提携しておらず、承認、推奨、スポンサーは一切受けていません。「LinkedIn」は LinkedIn Corporation の登録商標であり、このソフトウェアが相互運用する第三者のサービスを識別するという説明目的でのみ使用されています。
Claude のような AI アシスタントが、あなた自身のログイン済みブラウザセッションを通じて LinkedIn のデータを読み取れるようにする MCP サーバーです。プロフィールや企業へのアクセス、求人検索、求人詳細の取得ができます。
スポンサー
この MCP サーバーは無料かつオープンソースであり、Unipile のサポートを受けています。ローカル環境で、あなた自身のブラウザセッションを使用して動作します。Unipile はフルマネージドのクラウド代替サービスで、Classic、Sales Navigator、Recruiter 向けのホスト型 LinkedIn API を提供し、認証、セッション、インフラストラクチャをすべて処理します。7日間無料でお試しください →
Related MCP server: LinkedIn MCP
Installation Methods - MCP Server for LinkedIn

ツール | 説明 | ステータス |
| 明示的なセクション選択(experience、education、interests、honors、languages、certifications、skills、projects、contact_info、posts)でプロフィール情報を取得 | |
| 認証済みユーザー自身のLinkedInプロフィールを取得(get_person_profileと同じセクション) | |
| コネクションリクエストを送信、または受信したリクエストを承認(任意のメモ付き) | |
| プロフィールページのサイドバーおすすめセクション(「More profiles for you」「Explore premium profiles」「People you may know」)からプロフィールURLを抽出 | 動作中 |
| LinkedInメッセージの受信トレイから最近の会話を一覧表示 | 動作中 |
| ユーザー名またはスレッドIDで特定のメッセージ会話を読み取る | 動作中 |
| キーワードでメッセージを検索 | 動作中 |
| LinkedInユーザーにメッセージを送信(確認が必要) | |
| 明示的なセクション選択(posts、jobs)で会社情報を抽出。aboutセクションの参照には、LinkedInの人物検索 | 動作中 |
| 会社のLinkedInフィードから最近の投稿を取得 | 動作中 |
| キーワードでLinkedIn上の会社を検索 | 動作中 |
| /people/ページから会社の従業員を一覧表示(任意のキーワードフィルター付き) | 動作中 |
| キーワードと場所のフィルターで求人を検索 | 動作中 |
| 認証済みユーザーが保存した求人情報を一覧表示 | 動作中 |
| キーワード、場所、コネクションの次数(1st/2nd/3rd)、現在の会社で人物を検索 | |
| 特定の求人情報の詳細を取得 | 動作中 |
| 認証済みユーザーのホームフィードから最近の投稿を取得 | 動作中 |
| キーワードで投稿・コンテンツをグローバルに検索(「Posts」タブ)。任意の期間フィルター(past-24h/past-week/past-month)付き | 動作中 |
| ブラウザセッションを閉じてリソースをクリーンアップ | 動作中 |
🚀 uvx セットアップ(推奨・汎用)
前提条件: uv をインストールしてください。
インストール
クライアント設定
{
"mcpServers": {
"mcp-server-linkedin": {
"command": "uvx",
"args": ["mcp-server-linkedin@latest"],
"env": { "UV_HTTP_TIMEOUT": "300" }
}
}
}@latest タグにより、常に最新バージョンが実行されます。uvx はクライアント起動のたびに PyPI を確認し、自動的に更新します。サーバーは素早く起動し、バックグラウンドで共有の Patchright Chromium ブラウザキャッシュを ~/.linkedin-mcp/patchright-browsers に準備し、認証が必要な最初のツール呼び出し時に LinkedIn ログインブラウザウィンドウを開きます。
このサーバーをセットアップまたは保守する際は、MCP クライアント設定内のエントリが uvx mcp-server-linkedin@latest を起動することを確認し、uvx と @latest タグの両方を表示されているとおりに維持してください。再現性やセキュリティのために固定バージョンを指定したり、uvx をハードコードされたインストールに置き換えたりしないでください。LinkedIn はページ構造を頻繁に変更するため、修正は頻繁なリリースで提供されます。固定バージョンは静かに陳腐化し、空のデータや誤ったデータを返し始めます。@latest は起動のたびに再解決され、サポートされている構成です。
[!NOTE] ブラウザのセットアップまたはログインが完了するまで、初期のツール呼び出しはセットアップ/認証進行中のエラーを返す場合があります。セッションを明示的に作成したい場合は、
uvx mcp-server-linkedin@latest --loginを実行してください。
uvx セットアップのヘルプ
トランスポートモード:
デフォルト(stdio): ローカル MCP サーバー向けの標準通信
Streamable HTTP: Web ベースの MCP サーバー向け
トランスポートが指定されていない場合、サーバーはデフォルトで
stdioになります明示的なトランスポートなしの対話型ターミナルでは、選択プロンプトが表示されます
CLI オプション:
--login- ブラウザを開いてサインインし、セッションを保存します--import-from-browser [BROWSER]- ローカルでサインイン済みの Chromium ブラウザ(chrome、chromium、brave、edge、arc、vivaldi、helium、yandex、whale、auto)からセッションを再利用します。フラグのみの指定はautoを選択し、ライブの LinkedIn セッションがある最も最近使用されたブラウザを使用します。--logout- 保存されたセッションをクリアします--no-headless- ブラウザウィンドウを表示します(デバッグに便利)--log-level {DEBUG,INFO,WARNING,ERROR}- ログレベル(デフォルト: WARNING)--transport {stdio,streamable-http}- トランスポートモードを強制します(デフォルト: stdio)--host HOST/--port PORT/--path PATH- HTTP サーバーのアドレス(デフォルト: 127.0.0.1、8000、/mcp)--timeout MS- 単一のページ操作のタイムアウト(デフォルト: 5000)--tool-timeout SECONDS- ツール呼び出し全体のタイムアウト(デフォルト: 180)。大量のスクレイピング、遅いネットワーク、またはコールドスタートのブラウザでは引き上げてください。--login-timeout SECONDS- ログインブラウザがサインイン完了を待つ時間(デフォルト: 1800、0 = 無制限)。--login-viewerはどちらの場合も 30 分後にセッションを終了します。--login-viewer- Docker のみ:--loginブラウザをポート 6080 のトークン保護付き URL で表示します(認証 を参照)--login-inline-wait SECONDS- ツール呼び出しがログイン完了を待ってからモデルに再試行を指示するまでの時間(デフォルト: 25、最大 45、0 = 即座に返す)--browser-wait SECONDS- 別のサーバープロセスが共有ブラウザを引き渡すのを待つ時間(デフォルト: 25、最大 45、0 = 即座にビジーを報告)。複数の MCP クライアントを同時に実行している場合にのみ関係します。--browser-min-hold SECONDS- このプロセスが共有ブラウザを引き渡す前に保持する最短時間(デフォルト: 20)。--browser-waitより 3 秒短くクランプされるため、それと一緒に引き上げてください。値を大きくするとブラウザの再起動は減りますが、他のクライアントの待ち時間は長くなります。--browser-idle-timeout SECONDS- ツール呼び出しがないままこの時間が経過すると、アイドル状態のブラウザを閉じてプロファイルを解放します(デフォルト: 600、0 = 開いたままにする)--auto-import/--no-auto-import- 最初のツール呼び出しで、手動ログインにフォールバックする前に、サインイン済みのローカルブラウザからセッションをインポートします(デフォルト: オン)。Docker、プロキシ経由、非ループバック HTTP バインドではスキップされます。macOS ではキーチェーンが一度プロンプトを表示する場合があります。--user-data-dir PATH- ブラウザプロファイルディレクトリ(デフォルト: ~/.linkedin-mcp/profile)。セッションのローテーションまたはクリアでは、このディレクトリ とその親ディレクトリ(保存された Cookie と派生プロファイルを保持)が削除されます。--claim-profile-root- サーバーが単独では取得しないプロファイルディレクトリ(親ディレクトリに他のファイルがすでにあるものなど)を取得します。ディレクトリごとに 1 回必要です。--chrome-path PATH- Chrome/Chromium 実行ファイルへのパス--proxy-server URL-scheme://host:portとしてブラウザトラフィックをプロキシ経由でルーティングします。パスワードはPROXY_PASSWORDで設定します。これによりプロセスリストからパスワードが除外されます。
日常使用のブラウザからセッションをインポート:
Chrome、Chromium、Brave、Edge、Arc、Vivaldi、Helium、Yandex、または Naver Whale で LinkedIn にすでにサインインしている場合、手動の --login ステップをスキップしてそのセッションを再利用できます:
# Auto-pick the most recently used browser with a live LinkedIn session
uvx mcp-server-linkedin@latest --import-from-browser
# Or target a specific browser
uvx mcp-server-linkedin@latest --import-from-browser braveこれによりブラウザの LinkedIn Cookie が読み取られ、フィードに対して検証され、--login が書き込むのと同じ場所である ~/.linkedin-mcp/profile/ に保存されます。注意点:
複数のサインイン済みブラウザがある場合、最も最近使用されたライブ LinkedIn セッションが最初に試行されます。LinkedIn がそれを拒否した場合(失効またはリモートログアウト)、次に最近のものが自動的に試行され、サーバーが受け入れた最初のものがインポートされます。選択プロンプトはありません。特定のブラウザを対象にするにはブラウザ名を渡してください。
macOS では、OS のキーチェーンがブラウザの Safe Storage へのアクセス許可を求める場合があります。最も確実に読み取るには、最初にソースブラウザを閉じてください。
Chrome 127+ のアプリバウンド暗号化(
v20)で保護された Cookie は、OS の昇格なしでは復号できません。その場合は代わりに--loginを使用してください。インポートされた Cookie は、実際のログインのディスク上のセットと一致します。ローカルサーバーは保存されたプロファイルからそれらを完全に読み戻します。Docker ブリッジは、通常のセッションで使用するのと同じ最小限の認証サブセットに絞り込みます。
基本的な使用例:
# Run with debug logging
uvx mcp-server-linkedin@latest --log-level DEBUGHTTP モードの例(Web ベースの MCP クライアント向け):
uvx mcp-server-linkedin@latest --transport streamable-http --host 127.0.0.1 --port 8080 --path /mcpランタイムサーバーログは FastMCP/Uvicorn によって出力されます。
ツール呼び出しは、共有 LinkedIn ブラウザセッションを保護するために、単一のサーバープロセス内と複数のプロセス間の両方で直列化されます。複数の MCP クライアントを同時に実行する場合、各クライアントが独自のサーバープロセスを開始し、一度にブラウザを使用するのはそのうちの 1 つだけです。他のクライアントは短時間待機し、呼び出しが完了するとすぐに引き継ぎます。待ち時間が長すぎるクライアントは「ブラウザはビジーです」というメッセージを受け取り、単純に再試行できます。待機/取得/解放のログを確認するには --log-level DEBUG を使用してください。
これは同じマシン上および同じランタイム内のプロセスを対象としています。同じ ~/.linkedin-mcp ディレクトリを共有するホストと Docker コンテナ間には拡張されないため、コンテナの実行中にホスト上で --login または --logout を実行しないでください。
mcp inspector でテスト:
mcp inspector をインストールして実行します
bunx @modelcontextprotocol/inspector事前入力されたトークン URL をクリックして、ブラウザでインスペクタを開きます
Transport TypeとしてStreamable HTTPを選択しますURLをhttp://localhost:8080/mcpに設定します接続します
ツールをテストします
インストールの問題:
uv がインストールされていることを確認してください:
curl -LsSf https://astral.sh/uv/install.sh | shuv のバージョンを確認してください:
uv --version(0.4.0 以上である必要があります)初回実行時、
uvxはすべての Python 依存関係をダウンロードします。低速接続では、uv のデフォルトの 30 秒 HTTP タイムアウトが短すぎる場合があります。上記の推奨設定では、これを回避するためにすでにUV_HTTP_TIMEOUT=300(秒)が設定されています。Windows で
DLL load failed while importing _greenletが発生する場合: greenlet 3.5.5 以降に移行してください。公開されている Windows ホイールには C++ ランタイムが拡張機能内に再び含まれています。新しいuvx実行で自動的に解決されます。依存関係を固定する環境ではuv lock --upgrade-package greenletが必要です。MSVCP140.dllが必要なのは greenlet 3.3.1 から 3.5.4 のみで、python.org インストーラもuv管理ビルドもこれを提供しておらず、ソースからビルドされた greenlet はどのバージョンでも必要になる可能性があります。バージョンを変更できない場合は、Microsoft Visual C++ 再頒布可能パッケージ がその DLL を提供します。greenlet#525 として報告され、greenlet#526 で修正されました。
セッションの問題:
ブラウザプロファイルは
~/.linkedin-mcp/profile/に保存されます管理されたブラウザのダウンロードは
~/.linkedin-mcp/patchright-browsers/にキャッシュされますブラウザキャッシュが増え続ける場合: サーバーのアップグレードで新しい Chromium リビジョンが導入されることがあり、Patchright はインストールされているバージョンがまだ参照している限り古いものを保持します。
uvxは実行したことのあるバージョンごとに 1 つのアーカイブを保持するため、それぞれがそのような参照を保持し、古いリビジョンは残り続けます。サーバーは保持しているリビジョンとその容量を警告としてログに記録します。領域を回復するには、すべての LinkedIn MCP Server インスタンスを停止し、~/.linkedin-mcp/patchright-browsers/を削除して、次の起動で現在のブラウザをダウンロードさせてください。同時にアクティブな LinkedIn セッションは 1 つだけにしてください
ログインの問題:
LinkedIn は
--loginの際に LinkedIn モバイルアプリでのログイン確認を要求する場合がありますLinkedIn はログイン中にキャプチャチャレンジを表示する場合があります。
uvx mcp-server-linkedin@latest --loginを実行するとブラウザが開き、手動で解決できます。
タイムアウトの問題:
ページ操作の失敗(要素が見つからない、ナビゲーションがハングする): ブラウザのページ操作タイムアウトを増やしてください —
--timeout 10000またはTIMEOUT=10000(ミリ秒、デフォルト 5000)。ツール呼び出し全体のタイムアウト(例: 複数セクションのプロフィール、コールドスタートの Chromium、低速コンテナ): ツールごとの実行タイムアウトを増やしてください —
--tool-timeout 300またはTOOL_TIMEOUT=300(秒、デフォルト 180)。セッションなしでの最初のツール呼び出し: ローカルでログイン済みのブラウザにライブの LinkedIn セッションがある場合、サーバーは手動ログインを強制する代わりにそれを自動インポートします(
AUTO_IMPORT_FROM_BROWSER/--auto-importを参照)。macOS ではキーチェーンが Safe Storage アクセスを一度要求する場合があります。インポート可能なブラウザセッションが存在しない場合は、ログインウィンドウを開くフォールバックに移行し、LOGIN_INLINE_WAIT秒(デフォルト 25、最大 45、--login-inline-wait)待機して、迅速なサインインが 1 回の呼び出しで解決されるようにします。待機時間が経過すると、ツールは保留シグナルを返し、モデルは約 30 秒後に再試行します。自動インポートもインライン待機も、Docker 下またはサーバーが非ループバック HTTP ホストにバインドされている場合には適用されません。ホスト上で--loginを使用してセッションを作成するか、明示的な Docker コマンド--login --login-viewerを使用してください。低速接続のユーザーは、いずれかの値を高くする必要がある場合があります。
すでに実行したのにホスト上で --login を実行するよう指示された場合:
コンテナではないマシンでツール呼び出しが「Docker で有効な LinkedIn セッションがありません」と応答する場合、ランタイムが誤検出されています。これは、無関係なサービス用に Docker デーモンを実行している Linux ホストで発生しました。
LINKEDIN_MCP_CONTAINER=falseを設定して検出を上書きしてください。trueは逆を強制します。
プロキシの使用:
ほとんどの人は使用すべきではありません。 セキュリティチャレンジを減らすための LinkedIn 自身のガイダンスは、VPN やプロキシを避けることであり、セッションがサインインするアドレスをスコアリングします。何年も使用してきた自宅の接続は信頼シグナルです。履歴が見えない商用の出口ノードはそうではなく、それに切り替えること自体がチェックポイントをトリガーする種類の変更です。プロキシが価値があるのは 1 つのケースです。サーバーがアドレスが明らかにデータセンターである場所、またはアカウントの履歴とは異なる国で実行されている場合です。それでも、自宅のネットワーク上の WireGuard または Tailscale の出口ノードは、アドレスが本当に自分のものであるため、有料プロバイダーよりも優れています。購入する場合は、ローテーションする住宅用プールではなく、専用の静的 ISP アドレスを取得して維持してください。
--proxy-server http://host:portでブラウザをプロキシ経由にルーティングします(http、https、socks4、socks5が利用可能)。ルーティングされるのはブラウザトラフィックのみで、MCP トランスポートは対象外です。認証情報は
PROXY_USERNAMEとPROXY_PASSWORDに指定します。意図的に--proxy-passwordフラグは用意していません。コマンドライン引数はマシンの他のユーザー全員から読み取れるためです。PROXY_SERVERは、多くのプロバイダーが発行するhttp://user:pass@host:port形式の結合形も受け付けます。Chromium は SOCKS プロキシへの認証ができないため、認証情報が必要な場合は
http(s)エンドポイントが必要です。プロバイダーが認証付き SOCKS5 のみを提供している場合は、認証情報を保持するローカルリレーを実行し、サーバーをそのリレーに向けてください。ローカルアドレスもプロキシ経由になります。プロキシ設定時は
localhostへの通常の直接ルートが削除されるため、ローカルターゲットに直接到達する必要がある場合はPROXY_BYPASS=localhost,127.0.0.1,::1を追加してください。プロキシ設定中は自動インポートはスキップされます。ローカルブラウザから取得したセッションは実際のアドレスで作成されたものであり、それをプロキシに移すことがチェックポイントを誘発するまさにその変更となるためです。
--loginを使用してください。プロキシパスワードの誤りはエラーとして報告されません。Chromium はページがタイムアウトするまで認証チャレンジを再試行するため、タイムアウトまたはサインイン失敗として表面化します。プロキシを追加した直後にセッションが機能しなくなった場合は、セッションの期限切れを疑う前に認証情報を確認してください。
セッションを作成する前にプロキシを設定してください。 プロキシを設定した状態で
--loginを実行してください。既存のプロファイルにプロキシを有効にすると、ログイン済みセッションが新しい IP に移動され、これが LinkedIn のチェックポイントを誘発します。同じ理由で、実際の IP で作成されたセッションをインポートする--import-from-browserにも同じことが当てはまります。ローテーション方式のプールではなく、スティッキーセッションを使用してください。
カスタム Chrome パス:
Chrome が標準以外の場所にインストールされている場合は、
--chrome-path /path/to/chromeを使用します。環境変数
CHROME_PATH=/path/to/chromeでも設定できます。macOS と Linux では、ブラウザはプロファイルを最後に開いたブラウザと同じかそれより新しいバージョンである必要があり、そうでない場合、サーバーは起動を拒否します。(Windows では該当しません。Windows では起動せずにブラウザのバージョンを確認できないため、このチェックは無効になっています)。古いブラウザは、新しいブラウザが書き込んだストア(保存済みセッションを含む)を静かに削除する可能性があり、その場合、障害はログイン期限切れとまったく同じように見えます。メッセージには両方のバージョンが表示されます。新しい Chrome を一度実行した後にバンドル版の Chromium に戻すと、この問題が発生することがよくあります。どちらのブラウザでもよいので新しい方を再度実行するか、
--loginを実行してください。これにより、保存済みセッションが退避され、現在のブラウザで新規にサインインします。--logoutもセッションをクリアしますが、回復可能な形で保持するのではなく破棄し、ターミナルで確認を求めるため、MCP クライアントが起動したサーバーからは使用できません。この比較が行われるのは Chrome、Chromium、Chrome for Testing のみです。フォークはバージョン番号の付け方が異なるため(Vivaldi は 7.x、Edge のビルド番号は同じメジャーでも Chrome よりはるかに低い)、
CHROME_PATHをフォークに向けると、拒否が発生するのではなくチェックが無効になります。
📦 Claude Desktop MCP バンドル (旧 DXT)
前提条件: Claude Desktop。
Claude Desktop ユーザー向けのワンクリックインストール:
リリース から最新の
.mcpbアーティファクトをダウンロードします。ダウンロードした
.mcpbファイルをクリックして Claude Desktop にインストールします。LinkedIn ツールを呼び出します。
起動時に、MCP バンドルは共有の Patchright Chromium ブラウザキャッシュの準備をバックグラウンドで開始します。早すぎるタイミングでツールを呼び出すと、Claude はセットアップ進行中のエラーを表示します。認証が必要な最初のツール呼び出しで、サーバーは LinkedIn ログインブラウザウィンドウを開き、サインイン後に再試行するよう求めます。
MCP バンドルセットアップのヘルプ
初回セットアップ時の動作:
Claude Desktop はバンドルをすぐに起動します。ブラウザのセットアップはバックグラウンドで続行されます。
Patchright Chromium ブラウザのダウンロードがまだの場合は、しばらく待ってからツールを再試行してください。
管理対象ブラウザのダウンロードは
~/.linkedin-mcp/patchright-browsers/に共有されます。ブラウザキャッシュは増え続けます: Patchright は、インストールされているバージョンが参照している限り古い Chromium リビジョンを保持するため、アップグレード後に両方がディスクに残ることがあります。サーバーは保持している内容をログに警告として記録します。容量を解放するには、すべての LinkedIn MCP サーバーインスタンスを停止し、
~/.linkedin-mcp/patchright-browsers/を削除して、次回起動時に現在のブラウザをダウンロードさせてください。Windows で、バンドルが
DLL load failed while importing _greenletで終了する場合: Microsoft Visual C++ 再頒布可能パッケージ をインストールするか、greenlet 3.5.5 以降を固定したバンドルを再インストールしてください。公開されている Windows ホイールには C++ ランタイムが拡張機能内に再び含まれています。greenlet 3.3.1 から 3.5.4 を固定したバンドルでは、その再頒布可能パッケージのMSVCP140.dllが必要です。これは python.org のインストーラにもuv管理のビルドにも含まれておらず、ソースからビルドされた greenlet はどのバージョンでも必要になる可能性があります。サーバーは起動時にこれを自動的に通知し、ローダーがその DLL を生成できないことを確認した後にのみ通知します。greenlet#525 として報告されており、greenlet#526 で修正されています。
ログインの問題:
同時にアクティブな LinkedIn セッションが 1 つだけであることを確認してください。
LinkedIn は
--loginの際に LinkedIn モバイルアプリでのログイン確認を要求する場合があります。ログイン中に LinkedIn がキャプチャチャレンジを表示する場合があります。
uvx mcp-server-linkedin@latest --loginを実行すると、ブラウザが開き、手動でキャプチャを解決できます。前提条件については uvx セットアップ を参照してください。
タイムアウトの問題:
ページ操作の失敗(要素が見つからない、ナビゲーションがハングする): ブラウザのページ操作タイムアウトを増やします —
--timeout 10000またはTIMEOUT=10000(ミリ秒、デフォルト 5000)。ツール呼び出し全体のタイムアウト(例: 複数セクションのプロフィール、コールドスタートの Chromium、遅いコンテナ): ツールごとの実行タイムアウトを増やします —
--tool-timeout 300またはTOOL_TIMEOUT=300(秒、デフォルト 180)。セッションがない場合の最初のツール呼び出し: ローカルにログインしているブラウザに有効な LinkedIn セッションがある場合、サーバーは手動ログインを強制する代わりに、そのセッションを自動インポートします(
AUTO_IMPORT_FROM_BROWSER/--auto-importを参照)。macOS では、キーチェーンが Safe Storage アクセスを一度だけ要求する場合があります。インポート可能なブラウザセッションがない場合は、ログインウィンドウを開き、LOGIN_INLINE_WAIT秒(デフォルト 25、最大 45、--login-inline-wait)待機してから、すばやいサインインで 1 回の呼び出しで解決できるようにします。待機時間が経過すると、ツールは保留シグナルを返し、モデルは約 30 秒後に再試行します。自動インポートとインライン待機の両方とも、Docker 内またはサーバーがループバック以外の HTTP ホストにバインドされている場合は適用されません。ホスト上で--loginを使用してセッションを作成するか、明示的な Docker の--login --login-viewerコマンドを使用してください。低速な接続のユーザーは、どちらの場合もより高い値が必要になる場合があります。
すでに実行したのにホストで --login を実行するように言われた場合:
コンテナではないマシンでツール呼び出しが「No valid LinkedIn session is available in Docker」と応答する場合、ランタイムが誤検出されています。これは、無関係なサービス用の Docker デーモンが実行されている Linux ホストで発生しました。
LINKEDIN_MCP_CONTAINER=falseを設定して検出を上書きします。trueは逆を強制します。
🐳 Docker セットアップ
前提条件: Docker がインストールされ、実行されていることを確認します。
認証
一度ログインします。コンテナが LinkedIn ログインブラウザを開きます。これは、お使いのブラウザのタブから操作します。
# Create the directory first so the container can save your session into it
mkdir -p ~/.linkedin-mcp
docker run -it --rm \
-v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
-p 127.0.0.1:6080:6080 \
stickerdaniel/linkedin-mcp-server:latest \
--login --login-viewerコマンドが出力する完全な URL(アクセストークンが含まれています)を開き、サインインします。ビューアはその後自動的に閉じます。セッションが完全に保存されるように、コマンドが自然に終了するのを待ちます。30 分でタイムアウトします。
後続のすべての docker run で -v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp マウントを維持してください。そうしないと、サーバーはセッションを見つけることができません。
Docker で Claude Desktop を設定する
{
"mcpServers": {
"mcp-server-linkedin": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "~/.linkedin-mcp:/home/pwuser/.linkedin-mcp",
"stickerdaniel/linkedin-mcp-server:latest"
]
}
}
}[!NOTE] セッションは時間の経過とともに期限切れになります。ツール呼び出しで認証を求められるようになったら、上記のログインコマンドを再実行するか、ホスト上で
uvx mcp-server-linkedin@latest --loginを実行してください。
Docker セットアップのヘルプ
トランスポートモード:
デフォルト (stdio): ローカル MCP サーバー用の標準通信
ストリーミング可能な HTTP: Web ベースの MCP サーバー用
トランスポートが指定されていない場合、サーバーはデフォルトで
stdioになります。明示的なトランスポートのない対話型ターミナルには、選択プロンプトが表示されます。
CLI オプション:
--log-level {DEBUG,INFO,WARNING,ERROR}- ログレベル(デフォルト: WARNING)--transport {stdio,streamable-http}- トランスポートモードを強制します(デフォルト: stdio)--host HOST/--port PORT/--path PATH- HTTP サーバーアドレス(デフォルト: 127.0.0.1、8000、/mcp)--logout- 保存されたセッションとそこから派生したすべてのプロファイルをクリアします。--timeout MS- 単一のページ操作のタイムアウト(デフォルト: 5000)--tool-timeout SECONDS- ツール呼び出し全体のタイムアウト(デフォルト: 180)。大量のスクレイピング、低速なネットワーク、コールドスタートのブラウザの場合は増やしてください。--login-timeout SECONDS- ログインブラウザがサインイン完了を待機する時間(デフォルト: 1800、0 = 制限なし)。--login-viewerはどちらの場合も 30 分でセッションを終了します。--login-viewer---loginと一緒に使用すると、ポート 6080 のトークン保護された URL でログインブラウザを表示します。認証 のプロファイルマウントが必要です。--login-inline-wait SECONDS- モデルに再試行を指示する前に、ツール呼び出しがログインの完了を待機する時間(デフォルト: 25、最大 45、0 = すぐに返す)--browser-wait SECONDS- 共有ブラウザの引き継ぎを別のサーバープロセスが行うのを待機する時間(デフォルト: 25、最大 45、0 = すぐにビジーを報告)。複数の MCP クライアントを同時に実行している場合にのみ関係します。--browser-min-hold SECONDS- このプロセスが共有ブラウザを引き継ぐ前に保持する最小時間(デフォルト: 20)。--browser-waitの 3 秒下にクランプされるため、一緒に引き上げてください。値が大きいほどブラウザの再起動は少なくなりますが、他のクライアントの待ち時間は長くなります。--browser-idle-timeout SECONDS- ツール呼び出しがないままこの時間が経過すると、アイドル状態のブラウザを閉じてプロファイルを解放します(デフォルト: 600、0 = 開いたままにする)--auto-import/--no-auto-import- 手動ログインにフォールバックする前に、最初のツール呼び出しでサインイン済みのローカルブラウザからセッションをインポートします(Docker では無視されます)。macOS ではキーチェーンが一度だけプロンプトを表示する場合があります。--user-data-dir PATH- ブラウザのプロファイルディレクトリ(デフォルト: ~/.linkedin-mcp/profile)。セッションのローテーションまたはクリアにより、このディレクトリとその親ディレクトリ(保存された Cookie と派生プロファイルを保持)が削除されます。--claim-profile-root- サーバーが単独では取得しないプロファイルディレクトリ(親に他のファイルがすでにあるディレクトリなど)を引き継ぎます。ディレクトリごとに 1 回必要です。--chrome-path PATH- Chrome/Chromium 実行可能ファイルへのパス(Docker ではほとんど必要ありません)--proxy-server URL-scheme://host:portとして、プロキシ経由でブラウザトラフィックをルーティングします。パスワードはPROXY_PASSWORDで設定します。これにより、プロセスリストにパスワードが表示されなくなります。
[!NOTE] 通常の
--loginは Docker ではウィンドウが表示されません。--login-viewerを追加し、127.0.0.1:6080:6080をワンショットのログインコマンドにのみ公開してください。Docker はデフォルトですでにヘッドフルであるため、--no-headlessは何も変更しません。実験的な--daemonは、その所有者が仮想ディスプレイより長生きする可能性があるため、Docker では無視されます。
HTTP モードの例(Web ベースの MCP クライアント用):
docker run -it --rm \
-v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
-p 127.0.0.1:8080:8080 \
stickerdaniel/linkedin-mcp-server:latest \
--transport streamable-http --host 0.0.0.0 --port 8080 --path /mcpその両方が必要で、役割は異なります。--host 0.0.0.0 はサーバーをコンテナ内部から到達可能にします。コンテナ内で 127.0.0.1 にバインドされたプロセスは、公開ポート経由ではまったく到達できないからです。-p の前にある 127.0.0.1: は、外部をこのマシンに限定するためのものです。このプレフィックスを外すと、Docker はすべてのインターフェースで公開し、認証のないエンドポイントがネットワーク上にさらされます。サーバーはこの2つを区別できないため、どちらの場合でも警告を出します。
ループバック公開は、これをコンテナではなくマシンに限定します。同じホスト上の他のコンテナは、host.docker.internal が解決される場所であれば、そこを通じて到達できます。これは Docker Desktop と OrbStack ではデフォルトですが、ネイティブの Linux Docker ではそうではありません。
ランタイムサーバーログは FastMCP/Uvicorn によって出力されます。
HTTP サーバーは localhost またはバインド先のアドレス宛のリクエストに応答し、それ以外は 421 で拒否します。これにより、あなたが訪れただけの Web サイトが、このサーバーにドメインを向けて、あなた自身のブラウザ経由で LinkedIn セッションを利用することを防ぎます。
他の名前でサーバーに到達しようとすると拒否されます。ネットワーク上のマシン名や、リバースプロキシの前にある公開名も含みます。プロキシが上流の Host をバックエンドアドレスに書き換えるか、配信するホスト名を指定してください:
FASTMCP_HTTP_ALLOWED_HOSTS='["mcp.example"]'これにより、その名前だけが許可され、それ以外はすべて拒否され続けます。エンドポイントには依然として認証がないため、自分のマシン以外から到達可能なものはすべて、認証を提供する何かの背後に置く必要があります。
mcp inspector でテストする:
mcp inspector をインストールして実行する
bunx @modelcontextprotocol/inspector事前入力されたトークン URL をクリックして、ブラウザで inspector を開く
Transport TypeとしてStreamable HTTPを選択するURLをhttp://localhost:8080/mcpに設定する接続する
ツールをテストする
Docker の問題:
Docker がインストールされていることを確認する
Docker が実行中か確認する:
docker ps~/.linkedin-mcpの権限エラー: 古い rootful Docker 実行でディレクトリが root として作成された可能性があります。sudo chown -R "$(id -u):$(id -g)" ~/.linkedin-mcpで修正してください。
ログインの問題:
同時にアクティブな LinkedIn セッションが1つだけであることを確認する
LinkedIn は
--loginの際に LinkedIn モバイルアプリでのログイン確認を要求する場合がありますLinkedIn はログイン中にキャプチャチャレンジを表示する場合があります。
uvx mcp-server-linkedin@latest --loginを実行するとブラウザが開き、手動でキャプチャを解決できます。前提条件については uvx セットアップ を参照してください。ホストで再ログインした後に Docker 認証が古くなった場合は、Docker を一度再起動して、新しいソースセッション世代から新しくブリッジできるようにしてください。
タイムアウトの問題:
ページ操作の失敗 (要素が見つからない、ナビゲーションがハングする): ブラウザのページ操作タイムアウトを増やす —
--timeout 10000またはTIMEOUT=10000(ミリ秒、デフォルト 5000)。ツール呼び出し全体のタイムアウト (複数セクションのプロフィール、コールドスタートの Chromium、遅いコンテナなど): ツールごとの実行タイムアウトを増やす —
--tool-timeout 300またはTOOL_TIMEOUT=300(秒、デフォルト 180)。セッションがない状態での最初のツール呼び出し: ローカルにログインしたブラウザにライブの LinkedIn セッションがある場合、サーバーは手動ログインを強制する代わりにそれを自動インポートします (
AUTO_IMPORT_FROM_BROWSER/--auto-importを参照)。macOS では、キーチェーンが Safe Storage アクセスを一度だけ要求する場合があります。インポート可能なブラウザセッションが存在しない場合は、ログインウィンドウを開くフォールバックに移行し、LOGIN_INLINE_WAIT秒 (デフォルト 25、最大 45、--login-inline-wait) 待機して、素早いサインインが1回の呼び出しで解決できるようにします。待機時間が経過すると、ツールは保留シグナルを返し、モデルは約30秒後に再試行します。自動インポートもインライン待機も、Docker 環境下やサーバーが非ループバックの HTTP ホストにバインドされている場合は適用されません。ホスト上で--loginを使用してセッションを作成するか、明示的な Docker コマンド--login --login-viewerを使用してください。遅い接続のユーザーは、どちらもより高い値が必要な場合があります。
すでに実行したのにホストで --login を実行するよう指示された場合:
コンテナではないマシンでツール呼び出しが「No valid LinkedIn session is available in Docker」と応答する場合、ランタイムが誤検出されています。これは、無関係なサービス用に Docker デーモンが実行されている Linux ホストで発生しました。
LINKEDIN_MCP_CONTAINER=falseを設定して検出を上書きしてください。trueは逆を強制します。
プロキシを使用する場合:
ほとんどの人は使用すべきではありません。 セキュリティチャレンジを減らすための LinkedIn 自身のガイダンスは、VPN やプロキシを避けることです。また、セッションがサインインするアドレスをスコアリングします。何年も使用してきた自宅の接続は信頼シグナルです。履歴が見えない商用の出口ノードはそうではなく、そこに切り替えること自体がチェックポイントを引き起こす種類の変更です。 プロキシが価値があるのは1つのケースです。サーバーが明らかにデータセンターのアドレスを持つ場所、またはアカウントの履歴とは異なる国で実行されている場合です。それでも、自宅のネットワーク上の WireGuard や Tailscale の出口ノードは、アドレスが本当にあなたのものだからです。有料プロバイダーより優れています。購入する場合は、ローテーションする住宅用プールではなく、専用の静的 ISP アドレスを取得して維持してください。
--proxy-server http://host:portでブラウザをプロキシ経由でルーティングします (http、https、socks4、socks5が受け入れられます)。ルーティングされるのはブラウザトラフィックのみで、MCP トランスポートは対象外です。認証情報は
PROXY_USERNAMEとPROXY_PASSWORDに入れます。--proxy-passwordフラグは意図的にありません。コマンドライン引数はマシン上の他のすべてのユーザーが読めるからです。PROXY_SERVERは、ほとんどのプロバイダーが発行するhttp://user:pass@host:portの複合形式も受け入れます。Chromium は SOCKS プロキシに対して認証できないため、認証情報には
http(s)エンドポイントが必要です。プロバイダーが認証付き SOCKS5 のみを提供している場合は、認証情報を保持するローカルリレーを実行し、サーバーをそこに向けてください。ローカルアドレスもプロキシ経由になります。プロキシが設定されると、
localhostに対する Chromium の通常の直接ルートが削除されるため、ローカルターゲットに直接到達する必要がある場合はPROXY_BYPASS=localhost,127.0.0.1,::1を追加してください。プロキシが設定されている間は自動インポートがスキップされます。ローカルブラウザから取得したセッションは実際のアドレスで作成されたものであり、それをプロキシに移すことはチェックポイントを引き起こすまさにその変更だからです。
--loginを使用してください。プロキシパスワードの誤りは自己報告されません。Chromium はページがタイムアウトするまで認証チャレンジを再試行するため、タイムアウトまたはサインイン失敗として表面化します。プロキシを追加した直後にセッションが機能しなくなった場合は、セッションの期限切れを想定する前に認証情報を確認してください。
セッションを作成する前にプロキシを設定してください。 プロキシがすでに設定された状態で
--loginを実行してください。既存のプロファイルにプロキシをオンにすると、ログイン済みセッションが新しい IP に移動し、それが LinkedIn のチェックポイントを引き起こします。同じ理由で、実際の IP で作成されたセッションをインポートする--import-from-browserにも同じことが当てはまります。同じ理由で、ローテーションプールではなくスティッキーセッションを使用してください。
カスタム Chrome パス:
Chrome が標準以外の場所にインストールされている場合は、
--chrome-path /path/to/chromeを使用してください環境変数でも設定できます:
CHROME_PATH=/path/to/chromemacOS と Linux では、ブラウザはプロファイルを最後に開いたブラウザと少なくとも同じくらい新しいバージョンである必要があり、そうでない場合サーバーは起動を拒否します。(Windows では該当しません。Windows のブラウザは起動せずにバージョンを尋ねることができないため、チェックはオフになっています。) 古いブラウザは、新しいブラウザが書き込んだストア (保存されたセッションを含む) を黙って破棄する可能性があり、その失敗は期限切れのログインとまったく同じように見えます。メッセージは両方のバージョンを明示します。新しい Chrome を一度実行した後にバンドルされた Chromium に戻るのが、これを満たす通常の方法です。どちらであれ、新しい方のブラウザを再度実行するか、
--loginを実行してください。--loginは保存されたセッションを脇に移動し、手元のブラウザで新しくサインインします。--logoutもセッションをクリアしますが、回復可能な状態で保持するのではなく古いセッションを破棄し、ターミナルで確認を求めるため、MCP クライアントが起動したサーバーからは使用できません。この比較が行われるのは Chrome、Chromium、Chrome for Testing のみです。フォークはバージョン番号の付け方が異なるため (Vivaldi は 7.x、Edge のビルド番号は同じメジャーで Chrome よりはるかに低い)、
CHROME_PATHをフォークに向けると、満たすことのできない拒否を生成するのではなく、チェックがオフになります。ドキュメント化された Docker セットアップでは、このチェックは適用されません。コンテナは
--loginで作成したプロファイルを開くことはなく、クッキーから独自のプロファイルを導出し、デフォルトでは起動のたびにゼロから再構築するため、古いイメージがダウングレードするものは何もありません。EXPERIMENTAL_PERSIST_DERIVED_RUNTIMEを使用すると導出プロファイルが保持され、後方に移動するイメージタグはそれを破棄して再導出します。これもあなたが何かする必要はありません。このチェックが重要になるのはホスト上で、サーバーがそのプロファイルを直接開く場合です。--login自体の間は該当しません。--loginはブラウザを起動する前に古いプロファイルを脇に移動するため、決してトリップしません。
🐍 ローカルセットアップ (開発 & コントリビュート)
コントリビュートを歓迎します! アーキテクチャのガイドラインとチェックリストについては CONTRIBUTING.md を参照してください。PR を送信する前に、まず issue を開いて 機能やバグ修正について話し合ってください。
インストール
# 1. Clone repository
git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server
# 2. Install UV package manager (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Install dependencies
uv sync
uv sync --group dev
# 4. Install pre-commit hooks
uv run pre-commit install
# 5. Start the server
uv run -m linkedin_mcp_serverローカルサーバーは MCPB や uvx と同じ管理ランタイムフローを使用します。バックグラウンドで Patchright Chromium ブラウザキャッシュを準備し、最初の認証が必要なツール呼び出しで LinkedIn ログインを開きます。セッションを明示的に作成したい場合は、uv run -m linkedin_mcp_server --login を実行することもできます。
ローカルセットアップのヘルプ
CLI オプション:
--login- ブラウザを開いてサインインし、セッションを保存する--import-from-browser [BROWSER]- ローカルにサインインしている Chromium ブラウザ (chrome、chromium、brave、edge、arc、vivaldi、helium、yandex、whale、auto) のセッションを再利用する。フラグのみの指定はautoを選択し、ライブの LinkedIn セッションがある最も最近使用されたブラウザを選びます。--status- 保存されたセッションが有効かどうかを確認して終了する--logout- 保存されたセッションをクリアする--no-headless- ブラウザウィンドウを表示する (デバッグに便利)--log-level {DEBUG,INFO,WARNING,ERROR}- ログレベル (デフォルト: WARNING)--transport {stdio,streamable-http}- トランスポートモードを強制する (デフォルト: stdio)--host HOST/--port PORT/--path PATH- HTTP サーバーアドレス (デフォルト: 127.0.0.1、8000、/mcp)--timeout MS- 単一のページ操作のタイムアウト (デフォルト: 5000)--tool-timeout SECONDS- ツール呼び出し全体のタイムアウト (デフォルト: 180)。大量のスクレイピング、遅いネットワーク、コールドスタートのブラウザでは引き上げてください。--user-data-dir PATH- ブラウザプロファイルディレクトリ (デフォルト: ~/.linkedin-mcp/profile)。セッションのローテーションやクリアは、このディレクトリとその親を削除します。親には保存されたクッキーと導出プロファイルが保持されています。--claim-profile-root- サーバーが単独では取得しないプロファイルディレクトリ (親に他のファイルがすでにあるものなど) を引き継ぐ。ディレクトリごとに1回必要です。--slow-mo MS- ブラウザアクション間の遅延 (デフォルト: 0、デバッグに便利)--viewport WxH- ビューポートサイズ (デフォルト: 1280x720)。ウィンドウレスモードのみに適用されます。ヘッド付き起動では実際のウィンドウサイズが使用されます。--chrome-path PATH- Chrome/Chromium 実行ファイルへのパス--proxy-server URL-scheme://host:portとしてブラウザトラフィックをプロキシ経由でルーティングする。パスワードはPROXY_PASSWORDで設定します。これによりプロセスリストからパスワードが隠されます。--help- ヘルプを表示する
注: ほとんどの CLI オプションには環境変数の同等物があります。詳細は
.env.exampleを参照してください。
HTTP モードの例 (Web ベースの MCP クライアント用):
uv run -m linkedin_mcp_server --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcpClaude Desktop:
{
"mcpServers": {
"mcp-server-linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-mcp-server", "run", "-m", "linkedin_mcp_server"]
}
}
}この設定ではデフォルトで stdio が使用されます。
ログインの問題:
同時にアクティブなLinkedInセッションを1つだけにしてください
LinkedInはモバイルアプリでのログイン確認を要求する場合があります。
--loginコマンドは手動で解決できるブラウザを開きます。LinkedInはログイン中にCAPTCHAチャレンジを表示する場合があります。
--loginコマンドは手動で解決できるブラウザを開きます。
スクレイピングの問題:
--no-headlessを使用してブラウザの動作を確認し、スクレイピングの問題をデバッグします--log-level DEBUGを追加して、より詳細なログを表示します
セッションの問題:
ブラウザプロファイルは
~/.linkedin-mcp/profile/に保存されます管理されたブラウザのダウンロードは
~/.linkedin-mcp/patchright-browsers/にキャッシュされ、uvxおよびMCPバンドルインストールと共有されますブラウザキャッシュが増え続ける場合:Patchrightは、インストールされているバージョンがまだ参照している限り、古いChromiumリビジョンを保持します。
uvアーカイブやセカンドワークツリーもそのような参照になります。サーバーは保持しているものを示す警告をログに記録します。スペースを解放するには、すべてのLinkedIn MCPサーバーインスタンスを停止し、~/.linkedin-mcp/patchright-browsers/を削除して、次回の起動時に現在のブラウザをダウンロードさせてください。--logoutを使用してプロファイルをクリアし、新しく開始します
Python/Patchrightの問題:
Pythonバージョンを確認:
python --version(3.12以上である必要があります)Patchrightを再インストール:
uv run patchright install chromium依存関係を再インストール:
uv sync --reinstall
タイムアウトの問題:
ページ操作が失敗する場合(要素が見つからない、ナビゲーションがハングする):ページ操作のタイムアウトを増やします —
--timeout 10000またはTIMEOUT=10000(ミリ秒、デフォルトは5000)ツール呼び出し全体がタイムアウトする場合(例:複数セクションのプロファイル、コールドスタートのChromium、遅いコンテナ):ツールごとの実行タイムアウトを増やします —
--tool-timeout 300またはTOOL_TIMEOUT=300(秒、デフォルトは180)セッションなしでの最初のツール呼び出し:ローカルでログインしたブラウザにライブのLinkedInセッションがある場合、サーバーは手動ログインを強制する代わりにそれを自動インポートします(
AUTO_IMPORT_FROM_BROWSER/--auto-importを参照)。macOSでは、キーチェーンがSafe Storageアクセスを一度だけ要求する場合があります。インポート可能なブラウザセッションが存在しない場合、ログインウィンドウを開くフォールバックが発生し、LOGIN_INLINE_WAIT秒(デフォルト25、最大45、--login-inline-wait)待機して、クイックサインインを1回の呼び出しで解決します。待機が経過すると、ツールは保留シグナルを返し、モデルは約30秒後に再試行します。自動インポートもインライン待機も、Docker環境やサーバーが非ループバックHTTPホストにバインドされている場合には適用されません。ホスト上で--loginを使用してセッションを作成するか、明示的なDocker--login --login-viewerコマンドを使用してください。遅い接続のユーザーは、どちらの値も増やす必要がある場合があります。
--login を既に実行したのにホスト上で実行するように指示された場合:
ツール呼び出しが「Dockerで有効なLinkedInセッションがありません」と応答するが、マシンがコンテナではない場合、ランタイムが誤検出されています。これは、無関係なサービス用のDockerデーモンが動作しているLinuxホストで発生しました。
LINKEDIN_MCP_CONTAINER=falseを設定して検出を上書きします。trueは逆を強制します。
プロキシの使用:
ほとんどの人はプロキシを使うべきではありません。 LinkedIn自身のガイダンスでは、セキュリティチャレンジを減らすためにVPNやプロキシを避けることを推奨しており、セッションのサインイン元アドレスを評価します。長年使用している自宅の接続は信頼シグナルです。履歴が見えない商用の出口ノードはそうではなく、切り替え自体がチェックポイントをトリガーする種類の変更です。 プロキシが価値があるのは1つのケースです:サーバーが明らかにデータセンターのアドレスで実行されている場合、またはアカウントの履歴と異なる国で実行されている場合です。その場合でも、自宅ネットワーク上のWireGuardやTailscaleの出口ノードが、どの有料プロバイダーよりも優れています。購入する場合は、ローテーションする住宅用プールではなく、専用の静的ISPアドレスを選んで維持してください。
--proxy http://host:portでブラウザをプロキシ経由でルーティングします(http、https、socks4、socks5が受け入れられます)。ルーティングされるのはブラウザトラフィックのみで、MCPトランスポートは対象外です。認証情報は
PROXY_USERNAMEとPROXY_PASSWORDに設定します。--proxy-passwordフラグは意図的に存在しません:コマンドライン引数はマシン上の他のすべてのユーザーから読み取り可能だからです。PROXY_SERVERは、ほとんどのプロバイダーが提供する結合形式http://user:pass@host:portも受け入れます。ChromiumはSOCKSプロキシへの認証ができないため、認証情報が必要な場合は
http(s)エンドポイントが必要です。プロバイダーが認証付きSOCKS5のみを提供する場合は、認証情報を保持するローカルリレーを実行し、サーバーをそのリレーに向けてください。ローカルアドレスもプロキシを経由します。プロキシが設定されると、
localhostへのChromiumの通常の直接ルートが削除されるため、ローカルターゲットに直接到達する必要がある場合はPROXY_BYPASS=localhost,127.0.0.1,::1を追加してください。プロキシが設定されている間は自動インポートはスキップされます:ローカルブラウザから取得したセッションは実際のアドレスで作成されたものであり、それをプロキシに移動することはチェックポイントをトリガーするまさにその変更だからです。
--loginを使用してください。プロキシのパスワードが間違っていても自己報告されません:Chromiumはページがタイムアウトするまで認証チャレンジを再試行し続けるため、タイムアウトやサインイン失敗として表面化します。プロキシを追加した直後にセッションが動作しなくなった場合は、セッションが期限切れになったと決めつける前に、まず認証情報を確認してください。
セッションを作成する前にプロキシを設定してください。 既存のプロファイルでプロキシをオンにすると、ログイン済みセッションが新しいIPに移動され、それがLinkedInのチェックポイントをトリガーします。
--import-from-browserで実際のIPで作成されたセッションをインポートする場合も同様です。ローテーションするプールではなく、スティッキーセッションを使用してください。
カスタムChromeパス:
Chromeが非標準の場所にインストールされている場合は、
--chrome-path /path/to/chromeを使用します環境変数でも設定可能:
CHROME_PATH=/path/to/chromemacOSとLinuxでは、ブラウザはプロファイルを最後に開いたものと同じかそれ以上に新しいバージョンである必要があります。そうでない場合、サーバーは起動を拒否します。(Windowsでは該当しません:そこではバージョンを起動せずに確認する方法がないため、チェックはオフになっています。)古いブラウザは、新しいブラウザが書き込んだ保存セッションをサイレントにドロップする可能性があり、失敗は期限切れのログインとまったく同じように見えます。メッセージは両方のバージョンを明示します。新しいChromeを一度実行した後にバンドルされたChromiumに戻るのは、この問題を解決する通常の方法です。新しいブラウザを再度実行するか、
--loginを実行してください。--loginは保存されたセッションを脇に移動し、現在のブラウザで新しくサインインします。--logoutも同様にクリアしますが、回復可能な状態で保持するのではなく破棄し、ターミナルで確認を求めるため、MCPクライアントが開始したサーバーからは使用できません。比較されるのはChrome、Chromium、Chrome for Testingのみです。フォークは異なるバージョン番号を持ちます(Vivaldiは7.x、Edgeのビルド番号は同じメジャーでChromeよりはるかに低い)ため、
CHROME_PATHをフォークに向けると、チェックがオフになり、満たせない拒否を生成する代わりになります。
[!IMPORTANT] FAQ
これは安全に使えますか?アカウントが停止されますか? このツールは実際のブラウザセッションを制御します。未公開のAPIを悪用したり、認証を回避したりするものではありません。LinkedInの利用規約は自動化されたアクセスを禁止しており、自動化ツールを使用するアカウントは制限や停止の対象となる可能性があります。自己責任で使用してください。アカウントの安全性は保証されません。問題が発生した場合は、Discussions でお知らせください。
エージェントが多すぎるアクションを実行したらどうなりますか? ツール呼び出しはキューを通じて順次実行されます。実行する自動化の量に対する責任はあなたにあります。控えめに使用し、エージェントに責任あるプロンプトを与えてください。
謝辞
FastMCP と Patchright で構築されています。
LinkedInの利用規約 に従って使用してください。自動化されたアクセスはLinkedInの規約に違反する可能性があり、アカウント制限につながる恐れがあります。このツールは個人使用のみを目的としており、いかなる種類の保証もありません。
ライセンス
このプロジェクトはApache 2.0ライセンスの下でライセンスされています。
Available Tools
19 toolsclose_sessionClose SessionADestructive
Close the current browser session and clean up resources.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already signals this is a destructive action, and the description confirms it by saying 'Close' and 'clean up resources'. It adds some scope detail ('current browser session') but does not describe side effects such as invalidating cookies, logging out the user, or making the session unusable. Since the annotations carry much of the safety signal, a mid-range score is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is a single, front-loaded sentence with no redundant words. It states the action and consequence efficiently, earning a top score for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, destructive tool with an output schema and annotation coverage, the description is complete enough for an agent to know what will happen. The absence of an alternative, zero parameters, and existing destructiveHint mean no additional operational context is essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is empty with 100% coverage, so there are no parameter semantics for the description to clarify. With no params, the baseline is 4, and the description does not need to add parameter-level explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Close') and names the resource ('current browser session') plus a clear secondary purpose ('clean up resources'). It is well-distinguished from all sibling tools, which focus on profiles, searches, messaging, and feed actions, not session lifecycle.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context that this tool ends the current browser session, implying it should be used when the session is no longer needed. There are no sibling tools providing an alternative session-close action, so explicit exclusions are unnecessary. A fully explicit 'use this when you are done' statement would improve clarity, but the context is already strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_with_personConnect With PersonADestructive
Send a LinkedIn connection request or accept an incoming one.
The tool is annotated with destructiveHint so MCP clients will prompt for user confirmation before execution.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note to include with the invitation | |
| linkedin_username | Yes | LinkedIn username (e.g., "stickerdaniel", "williamhgates") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint, and the description adds that 'MCP clients will prompt for user confirmation before execution,' which provides some behavioral context. However, it does not explain side effects beyond confirmation, such as potential duplicate requests or permission requirements, leaving room for more transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. It leads with the primary purpose and then notes the annotation implication. Every word earns its place, making it appropriately concise and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with a clear action (connection request/accept), full schema coverage, and annotations covering safety, the description is sufficiently complete. It doesn't need to elaborate on return values since an output schema exists, and the action is straightforward. Minor gaps like error handling or idempotency could be added, but they aren't essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides full descriptions for both parameters (linkedin_username and note), so schema description coverage is 100%. The description itself adds no extra parameter meaning beyond what is already in the schema, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Send a LinkedIn connection request or accept an incoming one.' This specifies the verb (send/accept) and resource (connection request), and distinguishes it from siblings like send_message and get_inbox, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by stating its purpose, but it does not explicitly provide context or alternatives. There is no mention of when not to use it or comparisons to similar tools, so the guidance is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_employeesGet Company EmployeesARead-only
List employees at a company from the LinkedIn /people/ page, including the demographics aggregate that this view exposes: where employees live, where they studied, and a function breakdown (Engineering, Sales, Operations, etc.). The demographics are unique to this tool.
For filtered search by network degree (1st/2nd/3rd) or location, prefer search_people with current_company set to the company URN id. That path also returns more result pages than the /people/ tab.
The optional keywords filter narrows results by name, title, or skill.
company_name must be the exact LinkedIn URL slug (the path segment after /company/), not the display name. LinkedIn assigns unique slugs and the display name often does not match. For example, the AI lab Anthropic lives at /company/anthropicresearch/, not /company/anthropic/. If you are unsure of the slug, call search_companies first and pick the slug from the returned references.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | No | Optional filter by name, job title, or skill (e.g., "engineer", "sales") | |
| company_name | Yes | LinkedIn company URL slug (e.g., "docker", "anthropicresearch", "microsoft") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds behavioral context: it derives data from a specific LinkedIn page, exposes unique demographics, and warns about fewer result pages compared to search_people. It also clarifies the slug requirement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is multi-paragraph and detailed, but every sentence adds value—use cases, alternatives, parameter constraints, and an example. While slightly longer than strictly necessary, it's efficiently structured around purpose, usage, and uniqueness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given annotations (readOnlyHint, openWorldHint), the description covers all necessary behavioral context: output includes aggregates, page limits relative to search_people, and the surprising slug mismatch. With an output schema and both params documented, no critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema describes both parameters with examplesags: company_name is a slug, keywords is optional filter. The description elaborates on the slug format and gives an example, but doesn't fully detail keyword matching semantics beyond 'name, title, or skill.' Schema coverage is 100% and description reinforces it, so a high score is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource:
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs users to search_people for filtered searches by degree/location and notes the /people/ tab limitation, providing clear exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_postsGet Company PostsARead-only
Get recent posts from a company's LinkedIn feed.
| Name | Required | Description | Default |
|---|---|---|---|
| company_name | Yes | LinkedIn company name (e.g., "docker", "anthropic", "microsoft") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds no extra context about authentication, rate limits, or side effects. It does not contradict the annotations, but it also does not provide additional behavioral details beyond what the annotations already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no unnecessary words or repetition. It is well-structured and directly states the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and the description sufficiently covers its purpose. Since an output schema exists (per context signals), the description does not need to explain return values, and no additional context is required for this straightforward operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides a description for the only parameter (company_name) with examples. The tool description does not add further semantic meaning beyond the schema, and since the schema coverage is high, the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('get') and the resource ('recent posts from a company's LinkedIn feed'). It effectively differentiates from sibling tools like 'get_company_profile' or 'get_company_employees' by specifying the data type (posts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not explicitly state when to use this tool versus alternatives, nor does it provide conditions or exclusions. However, the purpose is so straightforward that the usage context is implicitly clear for someone familiar with LinkedIn tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_profileGet Company ProfileARead-only
Get a specific company's LinkedIn profile.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Comma-separated list of extra sections to scrape. The about page is always included. Available sections: posts, jobs Examples: "posts", "posts,jobs" Default (None) scrapes only the about page. | |
| company_name | Yes | LinkedIn company name (e.g., "docker", "anthropic", "microsoft") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations (readOnlyHint=true, openWorldHint=true) already indicate a read-only, side-effect-free operation. The description does not contradict these hints and adds no additional behavioral detail such as rate limits or authentication requirements, which would have improved transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately conveys the tool's purpose. It is front-loaded and free of unnecessary wording, making it efficiently scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool, the description is adequate. It conveys the core function, and the schema covers parameter details. However, it might slightly benefit from mentioning that it scrapes the profile (as implied in the schema), but this is not essential for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides high coverage (100%) with detailed descriptions for both parameters, including examples and defaults. The description itself adds no extra meaning beyond the schema, so it does not enhance parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get a specific company's LinkedIn profile.' It uses a specific verb ('Get') and resource ('company's LinkedIn profile'), which distinguishes it from sibling tools like get_company_posts and get_company_employees.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus the sibling tools. It does not mention any conditions or alternatives, leaving the user to infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationGet ConversationA
Read a specific messaging conversation.
Provide either linkedin_username or thread_id to identify the conversation.
When looked up by linkedin_username, resolution searches the messaging inbox for the participant's display name and click-visits every matching row to capture its thread ID — LinkedIn's sidebar has no anchor hrefs or thread-id attributes, so this is the only available path. Each visit selects the row in the LinkedIn UI and may mark it as read. Pass thread_id directly to skip this enumeration.
| Name | Required | Description | Default |
|---|---|---|---|
| index | No | 0-based selector for which thread to open when the participant has multiple threads (e.g. an organic 1-on-1 plus an InMail). Ignored when thread_id is provided. To enumerate thread IDs first, call search_conversations. | |
| thread_id | No | LinkedIn messaging thread ID | |
| linkedin_username | No | LinkedIn username of the conversation participant |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that visiting UI rows 'may also mark them as read' (unusual if no read hint provided). It also explains how the UI's restrictions make enumeration necessary, and the side effect makes the agent more informed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense, layered description that explains LinkedIn UI limitations and the match between the index and thread IDs. Each sentence adds information, but it's somewhat lengthy as it packs in all behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Input schema is complete, output schema, openWorldHint, descriptions of parameter semantics, but no mention of errors, permissions, or result shape (output schema fills that). Adequate for given complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documentation is 100% covered and describes 'index' behavior with 0-based selection and its precedence relationship to thread_id; the description of the lookup parameters adds contextual nuance beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear action ('read a specific conversation') and distinguishes it as one conversation by username or ID. Sibling tools like get_inbox list all messages, so the 'specific' scope is evident. It lacks explicit sibling differentiation, but the verb+object is specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the linkedin_username lookup path, what it does (enumerating rows), and when to pass thread_id directly 'to skip this enumeration'. It says it's 'the only available path' to justify behavior. No explicit alternatives list, but usage implication is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_feedGet FeedARead-only
Get posts from the authenticated user's LinkedIn feed.
| Name | Required | Description | Default |
|---|---|---|---|
| num_posts | No | Number of posts to fetch (1-50, default 10). Posts are loaded in batches of ~5 as the page scrolls, so the actual count may slightly exceed the target. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description does not disclose behavioral traits beyond the annotations: it only says 'Get posts', which is consistent with readOnlyHint=true but adds no new behavioral context. Notable behavior like batched loading and count overshooting appears only in the schema property description, not in the tool description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, front-loading the action and resource. It is concise without sacrificing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only feed fetch with one optional parameter and an output schema, the description plus schema provide all necessary information. The feed scope is clear, and nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the num_posts parameter fully documented including default, range, and batch behavior. The tool description itself adds no parameter detail, but the schema already carries the full semantic burden, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb 'Get' and a specific resource 'posts from the authenticated user's LinkedIn feed', which clearly distinguishes it from sibling tools like get_company_posts and search_posts. The phrase 'authenticated user' pins the scope unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use — fetching the current user's LinkedIn feed — is reasonably implied by the description, but there is no explicit guidance about when to choose this over alternative tools such as search_posts or get_company_posts. No exclusions or routing hints are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inboxGet InboxARead-only
List recent conversations from the LinkedIn messaging inbox.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of conversations to load (1-50, default 20) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=true) and the volatility expectation (openWorldHint=true), lowering the bar. The description adds modest behavioral value by specifying a recency ordering and inbox scope, but it does not disclose pagination behavior or whether ordering is guaranteed beyond the word 'recent.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with zero filler: the verb is front-loaded, the resource and scope are named immediately, and no structured information from the schema or annotations is redundantly repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one fully documented optional parameter, an output schema, and safety annotations, almost nothing an agent needs to call it is missing. The only slight gap is pinning down the meaning of 'recent' and the ordering guarantee, which is minor at this complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the single parameter (limit) has its type, numeric range, default, and meaning fully documented in the schema. The description contributes no parameter-level detail, so the baseline 3 for fully covered schemas applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List') and a well-defined resource ('recent conversations from the LinkedIn messaging inbox'). It distinguishes cleanly from the sibling tools get_conversation (a single thread's messages) and search_conversations (query-driven search), so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: this is the default, recency-ordered browsing entry point for inbox conversations. However, it never names the alternatives or states when not to use it — especially relevant given the closely related search_conversations and get_conversation siblings — so the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_detailsGet Job DetailsARead-only
Get job details for a specific job posting on LinkedIn.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | LinkedIn job ID (e.g., "4252026496", "3856789012") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to restate basic safety. The description adds no meaningful behavioral context beyond the annotations, such as what kind of details are returned or whether the job must be publicly accessible. It is consistent with the annotations, so no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence with no filler. It front-loads the action and resource, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity—one parameter, full schema coverage, output schema present, and read-only annotations—the description is nearly complete. The only minor gap is lack of explicit guidance on when to choose this over search_jobs, but the 'specific job posting' wording covers the core usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage for the single parameter, including an example format for job_id. The description does not add additional parameter meaning beyond what the schema already provides, but with full schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Get'), the resource ('job details'), and the scope ('for a specific job posting on LinkedIn'). It distinguishes itself from sibling tools like search_jobs and get_saved_jobs by emphasizing a specific job ID rather than searching or listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for a specific job posting' implies this tool should be used when you already have a job_id and need details, as opposed to searching for jobs. However, it does not explicitly state when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_profileGet My ProfileARead-only
Get the authenticated user's own LinkedIn profile.
Navigates to /in/me/ and resolves the redirect to obtain the real username before scraping, so the url field in the result is the actual profile URL (e.g. linkedin.com/in/johndoe/) rather than /in/me/.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Comma-separated list of extra sections to scrape. The main profile page is always included. Available sections: experience, education, interests, honors, languages, certifications, skills, projects, contact_info, posts Examples: "experience,education", "contact_info", "skills,projects" Default (None) scrapes only the main profile page. | |
| max_scrolls | No | Maximum pagination attempts per section (same as get_person_profile). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds valuable behavioral context by explaining that the tool navigates to /in/me/, follows the redirect, and returns the canonical profile URL instead of the /in/me/ placeholder.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, and the second sentence adds a single high-value behavioral detail about redirect resolution. There is no filler, repetition of schema content, or tangential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, full schema coverage, and presence of an output schema, the description provides everything needed to invoke the tool correctly. The redirect-resolution note closes the only likely source of confusion about the returned url field.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the input schema already documents sections and max_scrolls with defaults, examples, and constraints. The tool description does not add additional parameter meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets the authenticated user's own LinkedIn profile, using a specific verb and resource. It also distinguishes itself from sibling tools like get_person_profile by emphasizing 'own' profile, and adds a concrete detail about resolving /in/me/ to the real URL.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this tool is for the authenticated user's own profile, which differentiates it from get_person_profile. It does not explicitly name alternatives or enumerate when-not-to-use, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_person_profileGet Person ProfileARead-only
Get a specific person's LinkedIn profile.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Comma-separated list of extra sections to scrape. The main profile page is always included. Available sections: experience, education, interests, honors, languages, certifications, skills, projects, contact_info, posts Examples: "experience,education", "contact_info", "skills,projects", "honors,languages", "posts" Default (None) scrapes only the main profile page. | |
| max_scrolls | No | Maximum pagination attempts per section to load more content. On detail sections (experience, certifications, skills, etc.) this is the max number of "Show more" button clicks. On activity/posts it is the max scroll-to-bottom iterations. Applies to all sections in this call. Default (None) uses 5 for detail sections and 10 for posts. Increase when a profile has many items in a section (e.g., 30+ certifications, max_scrolls=20). To avoid slowing down other sections, request heavy sections in a separate call. | |
| linkedin_username | Yes | LinkedIn username (e.g., "stickerdaniel", "williamhgates") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and openWorldHint=true, so the safety profile is clear. The description adds context about optional sections and pagination behavior (max_scrolls) which helps set expectations. It doesn't repeat annotation info, adding value on how the tool scrapes sections, though it could be more explicit about potential side effects (none) or rate limiting. Given annotations cover read-only nature, a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single clear sentence, front-loaded with the action. It's concise, but it lacks detail on options that the schema covers, making it slightly under-specified as a standalone description. However, given the schema's richness, it's appropriately brief. It earns a 4 for efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema (100% param coverage) and an output schema present, the description doesn't need to explain return values. The description covers the primary purpose and the schema handles details. It is complete enough for a straightforward read operation, though it doesn't mention error scenarios. Given the annotations, a 4 is fair.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides 100% coverage of parameters with detailed descriptions (e.g., sections format, max_scrolls behavior). The description doesn't add additional parameter meaning beyond what's in the schema, so baseline 3 is justified. It does mention the main parameter implicitly in 'specific person', but that's minimal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves a specific person's LinkedIn profile using a username, which distinguishes it from siblings like get_my_profile and get_company_profile. It is specific verb+resource with the required parameter noted.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a profile by username, and the schema adds context on optional sections. However, it doesn't explicitly contrast with sibling tools like search_people or get_sidebar_profiles, but the purpose is clear enough for an agent to select it when a known username is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_saved_jobsGet Saved JobsARead-only
List job postings saved by the authenticated LinkedIn user.
Returns job_ids that can be passed to get_job_details for full info.
| Name | Required | Description | Default |
|---|---|---|---|
| max_pages | No | Maximum number of saved-jobs pages to load (1-10, default 3) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare readOnlyHint and openWorldHint, so the safety profile is already covered. The description adds value by clarifying that the result is limited to the authenticated user's saved job postings and that it returns job_ids, not full job details—an important behavioral distinction from get_job_details. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the action and scope, and the second sentence provides the important downstream usage detail about feeding job_ids into get_job_details. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional parameter and an output schema, the description is complete. It identifies the authenticated-user scope, the return value, and the logical next step. The annotations cover read-only and open-world behavior, and the schema covers the only parameter. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents max_pages with type, default, range, and description, so the description does not need to repeat it. The tool has only one optional parameter, and the schema coverage is 100%. The description adds no parameter-specific meaning, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('job postings saved by the authenticated LinkedIn user'), which precisely distinguishes this tool from the sibling search_jobs and get_job_details. It also states the key output type (job_ids) and how they connect to another tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the right usage context: it is for the authenticated user's own saved jobs, not general job search. It also gives explicit guidance that the returned job_ids should be passed to get_job_details for full information, which effectively routes the agent to the correct follow-up tool. It does not explicitly list when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sidebar_profilesGet Sidebar ProfilesARead-only
Get profile links from sidebar recommendation sections on a LinkedIn profile page.
Extracts profiles from "More profiles for you", "Explore premium profiles", and "People you may know" sidebar sections. Follows "Show all" links to return the full list from each section. Sections that redirect to linkedin.com/premium are skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedin_username | Yes | LinkedIn username of the profile page to scrape (e.g., "stickerdaniel", "williamhgates") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation is respected—the description only retrieves data and does not imply any modification. It clearly states the actions (follows links, skips premium sections) and avoids contradicting the annotation. Since annotations already indicate read-only, the description adds value by detailing the exact procedural behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using two sentences to convey the core function and key details. It avoids redundancy, though the first sentence is somewhat generic and could be merged with the specifics, but overall it is well-structured and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one input, and the description adequately explains the output (profile links) and key behaviors (following 'Show all', skipping premium). It lacks explicit error handling or edge-case mentions, but given the simplicity and absence of an output schema, it is sufficiently complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the single parameter (linkedin_username) with a clear example. The description adds no additional semantic nuance beyond what is already in the schema, so the baseline of 3 applies given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts profile links from specific sidebar sections, using precise section names. It distinguishes itself from sibling tools like get_person_profile or search_people by focusing on sidebar recommendations, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for obtaining profile recommendations from a page's sidebar, but does not explicitly contrast with alternatives like get_person_profile or search_people. However, the detailed behavior (following 'Show all', skipping premium) provides implicit context for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesSearch CompaniesBRead-only
Search for companies on LinkedIn.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Search keywords (e.g., "fintech", "anthropic", "electric vehicles") |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses no behavioral traits beyond what 'search' and 'LinkedIn' naturally imply. Annotations already declare readOnlyHint and openWorldHint, but the description adds no further context about result limits, matching behavior, or ordering. It is not contradictory, but it is also not informative beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence that wastes no words and immediately states the core action and target resource. It is appropriately sized for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema and safety annotations, the description is minimally adequate. However, it does not clarify edge behavior, result scope, or how it differs from nearby company-related tools, so an agent may still need to infer intent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents the only parameter, keywords, with a useful example. The description adds no additional semantic detail beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the verb ('Search') and resource ('companies on LinkedIn'), so an agent can understand the basic function. However, it does not differentiate itself from sibling tools like get_company_profile or search_people, leaving some ambiguity about scope or result type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool instead of search_people, get_company_profile, or get_company_employees. The description implies keyword-based discovery but provides no explicit context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_conversationsSearch ConversationsC
Search messages by keyword.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of search-result rows to enumerate as conversation references (1-50, default 20). Each enumeration selects the row in LinkedIn's UI and may mark it as read, so a low cap is preferable for noisy queries. | |
| keywords | Yes | Search keywords to filter conversations |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is openWorldHint, so the description carries most of the behavioral disclosure burden. It does not mention that enumerating results may mark conversations as read (noted only in the limit parameter description), nor does it disclose result-shaping behavior. 'Search' implies a read operation, but side effects are hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact, front-loaded sentence with no filler. It is easy to parse, but it is so terse that it contributes little beyond the tool name and parameter names, making it less effective than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema and fully described parameters, the description is minimally adequate for invocation. However, it lacks usage guidance, scope clarification, and behavioral disclosures, so an agent cannot fully judge when to use it or what side effects may occur.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already fully documents keywords and limit. The description adds no new parameter semantics beyond restating the keyword filter; it does not provide format details, examples, or constraints beyond what the schema offers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (search) and resource (messages), making the tool's core purpose clear. It is somewhat distinct from sibling search tools by focusing on messages, but it does not explicitly differentiate itself from related tools like get_inbox, get_conversation, or search_posts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as get_inbox, get_conversation, or search_posts. There is no mention of scope, prerequisites, or situations where another tool should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_jobsSearch JobsARead-only
Search for jobs on LinkedIn.
Returns job_ids that can be passed to get_job_details for full info.
| Name | Required | Description | Default |
|---|---|---|---|
| sort_by | No | Sort results (date, relevance) | |
| job_type | No | Filter by job type, comma-separated (full_time, part_time, contract, temporary, volunteer, internship, other) | |
| keywords | Yes | Search keywords (e.g., "software engineer", "data scientist") | |
| location | No | Optional location filter (e.g., "San Francisco", "Remote") | |
| max_pages | No | Maximum number of result pages to load (1-10, default 3) | |
| work_type | No | Filter by work type, comma-separated (on_site, remote, hybrid) | |
| easy_apply | No | Only show Easy Apply jobs (default false) | |
| date_posted | No | Filter by posting date (past_hour, past_24_hours, past_week, past_month) | |
| experience_level | No | Filter by experience level, comma-separated (internship, entry, associate, mid_senior, director, executive) |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and open-world. The description adds value by stating that the tool returns job_ids that serve as inputs to get_job_details, which is useful contextual behavior. It does not discuss pagination, max_pages behavior, or filtering limits, but the schema covers those details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The primary purpose is front-loaded, and the follow-up guidance about job_ids is immediately useful. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with a rich, fully documented schema and an output schema present, the description is sufficient: it states the purpose and the relationship to get_job_details. It does not need to explain parameters or return values in depth because those are already structured elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the heavy lifting is already done by the input schema. The description adds no additional meaning about parameters beyond what the schema documents, matching the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Search') on a specific resource ('jobs on LinkedIn') and adds the key behavioral result: it returns job_ids intended for get_job_details. This differentiates it from sibling search tools like search_people and search_companies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: use this tool when you want to search LinkedIn jobs, and use the returned IDs with get_job_details for fuller information. It does not explicitly list exclusions or compare against alternatives like get_saved_jobs, but the intended use case is obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_peopleSearch PeopleARead-only
Search for people on LinkedIn.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Optional connection-degree filter. Each element is one of "F" (1st-degree), "S" (2nd-degree), "O" (3rd-degree and beyond). Example: ["F"] to only return 1st-degree connections. | |
| keywords | Yes | Search keywords (e.g., "software engineer", "recruiter at Google") | |
| location | No | Optional location filter (e.g., "New York", "Remote") | |
| current_company | No | Optional current-employer filter. LinkedIn's currentCompany facet only filters on the numeric company URN id (e.g. "1115" for SAP); plain company names are accepted by the URL but ignored by LinkedIn and return the unfiltered result set. Look up a company's URN via get_company_profile -- it is exposed under references["about"]. For company-wide employee demographics (location/education/function breakdown) plus a slug-based lookup, use get_company_employees instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only and open-world nature of this tool. The schema adds a useful caveat that plain company names are silently ignored by LinkedIn's currentCompany filter, but the main description discloses no additional behavioral traits such as result limits, pagination, or network-scope behavior. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no wasted words. It is appropriately concise, though it sacrifices useful context that could have been included without much bloat, keeping it just below a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully documents all parameters, annotations cover safety and open-world behavior, and an output schema exists, so the definition is mostly sufficient for invocation. The main gap is the lack of explicit sibling differentiation in the description itself, but the tool name and parameter guidance compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented and the baseline is 3. The tool description itself adds no parameter-level meaning. The detailed current_company guidance lives in the schema, not in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a verb and resource: it searches for people on LinkedIn. This distinguishes it from other search tools like search_companies and search_jobs, though it does not explicitly contrast it with person-related siblings such as get_sidebar_profiles or get_person_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear use case: finding people. The current_company parameter description adds valuable routing guidance, directing agents to get_company_profile for URN lookup and get_company_employees for company-wide demographics. However, the tool description itself does not provide a broader when-not-to-use statement versus other people lookup tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_postsSearch PostsARead-only
Search LinkedIn posts/content globally by keyword (the "Posts" tab).
Use this to catch informal hiring posts ("we're hiring", "Buscamos ...", "estamos contratando", "join our team") that often appear before a formal job listing exists. This is global content search, distinct from get_feed (your own home feed) and get_company_posts (one company's page).
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | Search keywords (e.g., "Buscamos Unity", "AI automation hiring") | |
| max_pages | No | Scroll depth as result "pages" of ~5 scrolls each (1-10, default 3). Content search is an infinite scroll, so this caps how far the page is scrolled rather than fetching discrete pages. | |
| date_posted | No | Optional recency filter. One of "past-24h", "past-week", "past-month"; the "past_24_hours" / "past_week" / "past_month" spellings used by search_jobs are accepted too. Omit for any time. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and openWorldHint already present, the description adds useful context: this is a global content search, not a feed or company-scoped search. It also implies results may include informal/unofficial hiring language, which is relevant behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: one sentence defines the action, the next gives a concrete use case, and the final sentence distinguishes it from siblings. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 100% parameter schema coverage, the presence of an output schema, and annotations covering safety and openness, the description covers all essential decision factors. It tells the agent what the tool does, when to use it, what alternatives exist, and how to craft effective queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by providing richer keyword examples and clarifying that content search is global rather than scoped, supplementing the schema's parameter descriptions. It meaningfully supports keyword selection without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'Search LinkedIn posts/content globally by keyword.' It also explicitly differentiates itself from get_feed and get_company_posts, so an agent can immediately identify what this tool is and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete use case—catching informal hiring posts before formal job listings exist—and provides example keyword patterns. It also names the two sibling alternatives and explains why they are different, making the selection decision explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageSend MessageADestructive
Send a message to a LinkedIn user.
The recipient must be directly messageable from the profile page. This is a write operation when confirm_send is True.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | The message text to send | |
| profile_urn | No | Optional profile URN (e.g. ACoAAB...) to construct the compose URL directly. Providing this bypasses the Message-button lookup and is more reliable when available. Obtain via get_person_profile. Note: inbox may not always show all messages; use search_conversations as a fallback. | |
| confirm_send | Yes | Must be True to send the message | |
| linkedin_username | Yes | LinkedIn username of the recipient |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint and openWorldHint), the description clarifies that the write happens only when confirm_send is True, which is a safeguard. It also adds the requirement for direct messageability. This extra context helps the agent understand the tool's behavior without relying solely on annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that immediately state the purpose and key constraint. It front-loads the core function and avoids unnecessary elaboration, making it easy for an agent to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write operation, the description covers the essential behavioral prerequisites (messageability, confirm_send flag) and relies on the schema for parameter details. It does not mention authentication or output, but those are supplied by annotations and the presence of an output schema. The description is adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides complete descriptions for all four parameters (100% coverage), so the tool description does not need to repeat them. It does not add any additional meaning beyond what the schema gives, which is the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (send) and target (a LinkedIn user), with an important qualifier about direct messageability from the profile page. This establishes the tool's core purpose and differentiates it from read-only LinkedIn tools by explicitly labeling it a write operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite (the recipient must be directly messageable) and notes that the send only occurs when confirm_send is True, implicitly advising caution. However, it does not mention when to choose this tool over alternatives like connecting first or using the inbox, so guidance on context and exclusions is limited.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
19 tool updates
v4.22.0- First observed
close_session - First observed
connect_with_person - First observed
get_company_employees - First observed
get_company_posts - First observed
get_company_profile - First observed
get_conversation - First observed
get_feed - First observed
get_inbox - First observed
get_job_details - First observed
get_my_profile - First observed
get_person_profile - First observed
get_saved_jobs - First observed
get_sidebar_profiles - First observed
search_companies - First observed
search_conversations - First observed
search_jobs - First observed
search_people - First observed
search_posts - First observed
send_message
TDQS
Scored across 19 tools
Each tool targets a distinct resource/action: people, companies, jobs, messaging, feed, and session management. Overlapping tools like get_feed/search_posts/get_company_posts and get_company_employees/search_people are explicitly differentiated in their descriptions, so an agent should not misselect.
All tool names follow a verb_noun snake_case pattern, primarily get_* and search_*, with a few clear action verbs like send_message, connect_with_person, and close_session. The naming is predictable and consistent across the full set.
At 19 tools, the server is in the 16-25 range that feels heavy, even though the LinkedIn domain is broad. Some niche helpers like get_sidebar_profiles and close_session could be considered non-essential, but the count is not extreme enough to be chaotic.
Core workflows are covered end-to-end: search people, companies, and jobs; retrieve details; connect; message; and read feeds/inbox. Obvious gaps are modest, such as no ability to post content, manage connections, or apply to jobs, but these are not central to the apparent sales/recruiting use case.
Related MCP Connectors
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
LinkedIn jobs, companies and people for AI agents, plus messages and invites via your own account.
Live LinkedIn data for AI agents: profiles, companies, jobs, posts, email finding. No account risk.
Full LinkedIn access for AI agents: leads, messaging, and campaigns with activity limits built in.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI assistants to interact with LinkedIn by scraping profiles, companies, job postings, and getting personalized job recommendations using authenticated browser automation.178,301 PyPI4,119Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to securely search your LinkedIn network, contacts, and DMs to find warm leads, intro paths, and hidden opportunities.35MIT
- AlicenseAqualityCmaintenanceEnables AI assistants to access LinkedIn data through the user's logged-in browser session, supporting profiles, companies, job searches, messaging, and feed/posts.21Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI assistants to browse profiles and companies, manage messages and inboxes, and search jobs, posts, and people through a locally logged-in browser session. All actions run on the user's own machine.19Apache 2.0