Open-source MCP server for LinkedIn. Give Claude and any MCP-compatible AI agent access to profiles, companies, jobs, and messages.
This report summarizes scanner evidence for stickerdaniel/linkedin-mcp-server, a Python project with 3,821 GitHub stars. SynthScan examined 259,413 lines of code across 388 source files, recording 7050 pattern matches distributed across 21 syntactic categories. The legacy adjusted pattern signal is 29.1 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 5911 finding(s).
Are imports declared and package/API names verified? 566 finding(s).
Are wrappers, guards, and repeated structures necessary? 5979 finding(s).
Which changes need focused human review? 7050 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 7050 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | linkedin_mcp_server/bootstrap.py | 395 | def reset_bootstrap_for_testing() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 442 | def configure_browser_environment() -> Path: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 465 | def _patchright_registry_entries() -> tuple[Mapping[str, Any], ...] | None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 490 | def _patchright_install_targets() -> dict[str, str] | None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 515 | def _installer_auxiliary_names(browser_selected: bool) -> tuple[str, ...]: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 654 | def _report_retained_browser_revisions() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 789 | def _schedule_retained_browser_revision_report() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 803 | async def _report_retained_browser_revisions_safely() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 830 | async def _report_retained_browser_revisions_if_ready() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 851 | def report_retained_browser_revisions_if_ready() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 867 | async def stop_background_browser_setup() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 898 | async def start_background_browser_setup_if_needed() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1005 | def browser_setup_in_progress() -> bool: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1011 | def browser_setup_failure_pending() -> bool: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1034 | def _discard_browser_install_metadata() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1039 | def _mark_browser_setup_invalid() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1061 | def _owned_browser_setup_ready() -> bool: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1113 | def _mark_background_setup_timed_out(reason: str) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1118 | async def _run_background_browser_setup(deadline_at: float | None = None) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1129 | def record_installer_activity() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1172 | def _start_browser_setup_task_locked(deadline_at: float) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1231 | def _capture_windows_process_wait( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1281 | def _windows_wait_unregistered(future: asyncio.Future[Any]) -> bool: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1294 | async def _prove_windows_wait_unregistered( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1351 | async def _wait_for_direct_process_exit(proc: _InstallerProcess) -> int: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1358 | async def _wait_for_direct_process_exit_within( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1371 | async def _cleanup_assigned_windows_job_once( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1411 | def _assigned_windows_cleanup( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1444 | def _installer_stop_remaining(deadline: float) -> float: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1638 | def _installer_supervisor_command(worker_target: list[str]) -> list[str]: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1691 | async def _start_installer_supervisor( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1813 | def _installer_extraction_paths( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1850 | def _refuse_unmeasurable_scan(error: OSError) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1863 | def _installer_download_snapshot( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1934 | def _configured_browsers_path(environment: Mapping[str, str]) -> Path: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1939 | def _refuse_oversized_install( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1962 | async def _watch_installer_activity( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2006 | def _configured_installer_temp_dir() -> str | None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2015 | def _installer_temporary_parent() -> Path: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2076 | def _create_installer_temporary_root() -> _InstallerTemporaryRoot: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2174 | def _close_installer_temporary_root_pin( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2190 | def _remove_installer_temporary_root(temporary_root: _InstallerTemporaryRoot) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2279 | def _await_installer_temporary_root_cleanups() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2300 | def _start_installer_temporary_root_cleanup( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2329 | def _clean_installer_temporary_root(temporary_root: _InstallerTemporaryRoot) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2338 | def _installer_bound_breached(activity: asyncio.Task[None]) -> bool: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2374 | async def _install_under_supervision( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2701 | def _log_handlers_follow_the_live_region( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2772 | def _print_whatever_the_stream_takes( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3176 | def _configured_download_hosts() -> tuple[str, ...]: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3764 | async def _ensure_browser_installed( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3848 | async def _refresh_background_task_state() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3901 | def _consume_background_setup_failure() -> str | None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3922 | async def ensure_tool_ready_or_raise( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3994 | def _raise_if_docker_auth_missing() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 4097 | async def _announce_auto_import_once(ctx: Context | None) -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 4486 | async def invalidate_auth_and_trigger_relogin( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 4656 | def _force_move_auth_state_aside( | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 4663 | def _move_invalid_auth_state_aside( | CODE |
| LOW | linkedin_mcp_server/process_protocol.py | 33 | def read_authenticated_status( | CODE |
| 5335 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | linkedin_mcp_server/browser_import/extract.py | 246 | Layout: ``b'v10' || nonce(12) || ciphertext || tag(16)``. Store version >= 24 | STRING |
| HIGH⚡ | linkedin_mcp_server/tools/person.py | 32 | ``network`` is published as ``anyOf: [array, null]``, which is a correct | STRING |
| HIGH | linkedin_mcp_server/core/auth.py | 55 | picker: document.querySelector(picker) !== null, | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 49 | return key ? key[1] : null; | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 73 | while (node && node !== document.body) { | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 78 | found.push(node); | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 109 | let picked = null; | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 111 | if (!picked || node.contains(picked)) picked = node; | CODE |
| HIGH⚡ | linkedin_mcp_server/core/utils.py | 143 | let picked = null; | CODE |
| HIGH⚡ | linkedin_mcp_server/core/utils.py | 145 | if (!picked || node.contains(picked)) picked = node; | CODE |
| HIGH⚡ | linkedin_mcp_server/core/utils.py | 151 | const rail = kept && tied.includes(kept) ? kept : picked; | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 250 | _NEW_HOLDER_JS = "() => ({rail: null})" | CODE |
| HIGH | linkedin_mcp_server/daemon/startup.py | 544 | os.dup2(null, 0) | CODE |
| HIGH | linkedin_mcp_server/daemon/startup.py | 546 | os.close(null) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 35 | const visibility = element && getComputedStyle(element).visibility; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 40 | (element.offsetWidth || element.offsetHeight || element.getClientRects().length) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 158 | const visibility = element && getComputedStyle(element).visibility; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 163 | (element.offsetWidth || element.offsetHeight || element.getClientRects().length) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 170 | return /^[A-Za-z0-9_-]+$/.test(identifier) ? identifier : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 174 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 184 | (url.port && url.port !== '443') || | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 187 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 190 | return match ? `/in/${match[1]}/` : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 192 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 204 | (url.port && url.port !== '443') || | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 211 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 219 | : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 221 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 426 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 434 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 444 | ownedMessage: null, | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 520 | if (state.rendered !== null) { | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 525 | if (!requireVisible) return body !== null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 526 | return body !== null && body.innerText === state.rendered; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 529 | element => !requireVisible || visible(element) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 536 | other => other !== element && element.contains(other) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 670 | : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 675 | return rendered !== null && body !== null && body.innerText === rendered; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 683 | other => other !== element && element.contains(other) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 829 | if (candidates.length === 1 && admittedTransition(markers[0], scope)) { | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 836 | return confirmed ? {path: window.location.pathname} : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 845 | for (const element of (state?.scope || arg.owner)?.querySelectorAll( | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 926 | return state.editor.isConnected && document.activeElement === state.editor; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 932 | const visibility = element && getComputedStyle(element).visibility; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 937 | (element.offsetWidth || element.offsetHeight || element.getClientRects().length) | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 944 | return /^[A-Za-z0-9_-]+$/.test(identifier) ? identifier : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 948 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 958 | (url.port && url.port !== '443') || | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 961 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 964 | return match ? `/in/${match[1]}/` : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 966 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 978 | (url.port && url.port !== '443') || | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 985 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 993 | : null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 995 | return null; | CODE |
| HIGH⚡ | linkedin_mcp_server/linkedin/message_sender.py | 1003 | scopes.push(ancestor); | CODE |
| HIGH | linkedin_mcp_server/linkedin/message_sender.py | 60 | (url.port && url.port !== '443') || | CODE |
| HIGH | linkedin_mcp_server/linkedin/message_sender.py | 76 | return /^[A-Za-z0-9_-]+$/.test(identifier) ? identifier : null; | CODE |
| HIGH | linkedin_mcp_server/linkedin/message_sender.py | 79 | normalized.every(item => item !== null && item === normalized[0]); | CODE |
| HIGH | linkedin_mcp_server/linkedin/message_sender.py | 108 | (composeAnchors.length === 1 && visibleComposeAnchors.length !== 1) | CODE |
| 125 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | linkedin_mcp_server/bootstrap.py | 3879 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL | linkedin_mcp_server/bootstrap.py | 3895 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL | linkedin_mcp_server/bootstrap.py | 4394 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL | linkedin_mcp_server/dependencies.py | 18 | from linkedin_mcp_server.core.exceptions import AuthenticationError, NetworkError | CODE |
| CRITICAL | linkedin_mcp_server/tools/post.py | 19 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL⚡ | linkedin_mcp_server/tools/person.py | 18 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | linkedin_mcp_server/tools/company.py | 16 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | linkedin_mcp_server/tools/job.py | 15 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | linkedin_mcp_server/tools/feed.py | 18 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | linkedin_mcp_server/daemon/auth_repair.py | 53 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL⚡ | linkedin_mcp_server/linkedin/message_sender.py | 19 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/person.py | 13 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/company.py | 10 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/connection_actions.py | 40 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/job_pages.py | 20 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/identifiers.py | 48 | from linkedin_mcp_server.core.exceptions import InvalidReferenceError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/feed.py | 14 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/jobs.py | 13 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/content.py | 10 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | linkedin_mcp_server/linkedin/navigation.py | 21 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_action_signals_dom.py | 42 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/test_core_browser.py | 16 | from linkedin_mcp_server.core.exceptions import NetworkError | CODE |
| CRITICAL | tests/test_cli_main.py | 14 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL⚡ | tests/test_profile_lease_integration.py | 83 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_proxy_errors.py | 12 | from linkedin_mcp_server.core.exceptions import NetworkError, ProxyConnectionError | CODE |
| CRITICAL | tests/test_daemon_auth.py | 30 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL | tests/test_bootstrap.py | 49 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError, NetworkError | CODE |
| CRITICAL | tests/test_bootstrap.py | 9629 | from linkedin_mcp_server.core.exceptions import ProxyConnectionError | CODE |
| CRITICAL | tests/test_bootstrap.py | 9662 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/test_core_utils.py | 7 | from linkedin_mcp_server.core.exceptions import RateLimitError | CODE |
| CRITICAL | tests/test_invite_dialog_dom.py | 16 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/test_tools.py | 316 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/test_tools.py | 521 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_tools.py | 813 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/test_tools.py | 873 | from linkedin_mcp_server.core.exceptions import AccountRestrictedError | CODE |
| CRITICAL | tests/test_tools.py | 1592 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL | tests/test_tools.py | 1864 | from linkedin_mcp_server.core.exceptions import InvalidReferenceError | CODE |
| CRITICAL⚡ | tests/test_error_handler.py | 157 | from linkedin_mcp_server.core.exceptions import LinkedInOperationError | CODE |
| CRITICAL⚡ | tests/test_error_handler.py | 169 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL⚡ | tests/test_error_handler.py | 176 | from linkedin_mcp_server.core.exceptions import ElementNotFoundError | CODE |
| CRITICAL | tests/test_off_linkedin_landing_dom.py | 33 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/differential/test_auth_repair.py | 144 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/linkedin/test_facade_contracts.py | 17 | from linkedin_mcp_server.core.exceptions import InvalidReferenceError | CODE |
| CRITICAL | tests/linkedin/test_feed.py | 17 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/linkedin/test_policy_traces.py | 18 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/linkedin/test_facade_results.py | 7 | from linkedin_mcp_server.core.exceptions import InvalidReferenceError | CODE |
| CRITICAL | tests/linkedin/test_document_reads.py | 18 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/linkedin/test_capture.py | 17 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/linkedin/test_capture.py | 134 | from linkedin_mcp_server.core.exceptions import RateLimitError | CODE |
| CRITICAL | tests/linkedin/test_capture.py | 1940 | from linkedin_mcp_server.core.exceptions import RateLimitError | CODE |
| CRITICAL | tests/linkedin/test_jobs.py | 14 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| CRITICAL | tests/linkedin/test_message_sender.py | 16 | from linkedin_mcp_server.core.exceptions import InvalidReferenceError | CODE |
| CRITICAL | tests/linkedin/test_message_sender.py | 207 | from linkedin_mcp_server.core.exceptions import OffLinkedInLandingError | CODE |
| CRITICAL | tests/linkedin/test_job_pages.py | 12 | from linkedin_mcp_server.core.exceptions import AuthenticationError | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | linkedin_mcp_server/bootstrap.py | 1559 | except TimeoutError: | CODE |
| HIGH | linkedin_mcp_server/bootstrap.py | 2790 | except (OSError, ValueError): | CODE |
| HIGH | linkedin_mcp_server/bootstrap.py | 1470 | except TimeoutError: | CODE |
| HIGH | linkedin_mcp_server/logging_config.py | 114 | except Exception: | CODE |
| HIGH | linkedin_mcp_server/logging_config.py | 132 | except FileExistsError: | CODE |
| HIGH | linkedin_mcp_server/session_state.py | 1106 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/session_state.py | 1217 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/process_tree.py | 1490 | except ProcessLookupError: | CODE |
| HIGH | linkedin_mcp_server/process_tree.py | 1552 | except (ProcessLookupError, PermissionError): | CODE |
| HIGH | linkedin_mcp_server/debug_trace.py | 187 | except FileExistsError: | CODE |
| HIGH | linkedin_mcp_server/cli_main.py | 756 | except Exception: | CODE |
| HIGH | linkedin_mcp_server/cli_main.py | 991 | except Exception: | CODE |
| HIGH | linkedin_mcp_server/private_state.py | 222 | except FileExistsError: | CODE |
| HIGH | linkedin_mcp_server/login_viewer.py | 343 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/login_viewer.py | 253 | except Exception: | CODE |
| HIGH | linkedin_mcp_server/setup.py | 462 | except asyncio.CancelledError: | CODE |
| HIGH | linkedin_mcp_server/windows_acl.py | 661 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/installer_worker.py | 102 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/storage_class.py | 205 | except (RuntimeError, KeyError, OSError): | CODE |
| HIGH | linkedin_mcp_server/storage_class.py | 212 | except KeyError: | CODE |
| HIGH | linkedin_mcp_server/process_guardian.py | 138 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/process_guardian.py | 107 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/browser_import/extract.py | 378 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/tools/person.py | 49 | except ValueError: | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 326 | except PlaywrightTimeoutError: | CODE |
| HIGH | linkedin_mcp_server/core/utils.py | 557 | except PlaywrightTimeoutError: | CODE |
| HIGH | linkedin_mcp_server/daemon/descriptor.py | 893 | except ValueError: | CODE |
| HIGH | linkedin_mcp_server/daemon/election.py | 847 | except OSError: | CODE |
| HIGH | linkedin_mcp_server/daemon/owner.py | 147 | except FileNotFoundError: | CODE |
| HIGH | linkedin_mcp_server/daemon/owner.py | 1368 | except TimeoutError: | CODE |
| HIGH | linkedin_mcp_server/daemon/owner.py | 960 | except Exception: | CODE |
| HIGH | linkedin_mcp_server/daemon/owner.py | 1497 | except (OSError, UnicodeError, ValueError): | CODE |
| HIGH | linkedin_mcp_server/daemon/owner.py | 1564 | except (OSError, ValueError): | CODE |
| HIGH | linkedin_mcp_server/linkedin/message_sender.py | 1403 | except PlaywrightTimeoutError: | CODE |
| HIGH | linkedin_mcp_server/linkedin/connection_actions.py | 410 | except PlaywrightTimeoutError: | CODE |
| HIGH | linkedin_mcp_server/linkedin/connection_actions.py | 461 | except Exception: | CODE |
| HIGH | tests/conftest.py | 188 | except AttributeError: | CODE |
| HIGH | tests/conftest.py | 168 | except AttributeError: | CODE |
| HIGH | tests/conftest.py | 180 | except AttributeError: | CODE |
| HIGH | tests/conftest.py | 202 | except AttributeError: | CODE |
| HIGH | tests/test_dependencies.py | 589 | except asyncio.CancelledError: | CODE |
| HIGH | tests/test_windows_guardian_probe.py | 290 | except BaseException: | CODE |
| HIGH | tests/test_windows_guardian_probe.py | 286 | except BaseException: | CODE |
| HIGH | tests/test_process_tree.py | 3634 | except BaseException: # noqa: BLE001 - the driver was terminated on purpose | CODE |
| HIGH | tests/test_windows_browser_launch_evidence.py | 39 | except BaseException: | CODE |
| HIGH | tests/test_bootstrap.py | 1681 | except RuntimeError: | CODE |
| HIGH | tests/test_bootstrap.py | 1738 | except RuntimeError: | CODE |
| HIGH | tests/test_browser_containment.py | 453 | except OSError: | CODE |
| HIGH | tests/windows_guardian_probe.py | 1356 | except BaseException: | CODE |
| HIGH | tests/windows_guardian_probe.py | 1620 | except BaseException: | CODE |
| HIGH | tests/windows_guardian_probe.py | 1624 | except BaseException: | CODE |
| HIGH | tests/differential/harness.py | 2662 | except (psutil.Error, OSError): | CODE |
| HIGH | tests/differential/harness.py | 5449 | except psutil.Error: | CODE |
| HIGH | tests/differential/harness.py | 7306 | except Exception: | CODE |
| HIGH | tests/differential/harness.py | 1270 | except (anyio.ClosedResourceError, anyio.BrokenResourceError): | CODE |
| HIGH | tests/differential/harness.py | 1927 | except (anyio.ClosedResourceError, anyio.BrokenResourceError): | CODE |
| HIGH | tests/differential/harness.py | 2213 | except (anyio.ClosedResourceError, anyio.BrokenResourceError): | CODE |
| HIGH | tests/differential/harness.py | 3404 | except psutil.NoSuchProcess: | CODE |
| HIGH | tests/differential/harness.py | 5194 | except psutil.Error: | CODE |
| HIGH | tests/differential/harness.py | 9646 | except Exception: | CODE |
| 13 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | linkedin_mcp_server/bootstrap.py | 457 | def _patchright_pkg_version() -> str | None: | CODE |
| MEDIUM | linkedin_mcp_server/bootstrap.py | 830 | def _report_retained_browser_revisions_if_ready() -> None: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 812 | except Exception: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 842 | except Exception: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 891 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1491 | except Exception: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 1991 | except Exception as unmeasurable: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2589 | except Exception: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2641 | except Exception: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 2660 | except Exception: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3838 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3860 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 3878 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 4117 | except Exception: # noqa: BLE001 - a notice failure must not block import | CODE |
| LOW | linkedin_mcp_server/bootstrap.py | 4299 | except Exception: # noqa: BLE001 - any import failure -> manual login | CODE |
| LOW | linkedin_mcp_server/error_diagnostics.py | 240 | except Exception: | CODE |
| LOW | linkedin_mcp_server/error_diagnostics.py | 275 | except Exception: | CODE |
| MEDIUM | linkedin_mcp_server/error_diagnostics.py | 237 | def _safe_source_profile_dir(): | CODE |
| LOW | linkedin_mcp_server/greenlet_runtime.py | 106 | except Exception: | CODE |
| LOW | linkedin_mcp_server/server.py | 133 | except Exception: | CODE |
| LOW | linkedin_mcp_server/server.py | 310 | except Exception as e: | CODE |
| LOW | linkedin_mcp_server/logging_config.py | 114 | except Exception: | CODE |
| LOW | linkedin_mcp_server/update_check.py | 116 | except Exception: # noqa: BLE001 - never let a version check break a tool call | CODE |
| LOW | linkedin_mcp_server/update_check.py | 192 | except Exception: # noqa: BLE001 - fall back to env / managed detection | CODE |
| MEDIUM | linkedin_mcp_server/update_check.py | 86 | def _read_cache() -> tuple[float, str] | None: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1017 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1038 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1069 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1122 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1159 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1226 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1277 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 1294 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/debug_trace.py | 113 | except Exception: | CODE |
| LOW⚡ | linkedin_mcp_server/debug_trace.py | 133 | except Exception as exc: # pragma: no cover - best effort diagnostics | CODE |
| LOW⚡ | linkedin_mcp_server/debug_trace.py | 138 | except Exception as exc: # pragma: no cover - best effort diagnostics | CODE |
| LOW⚡ | linkedin_mcp_server/debug_trace.py | 146 | except Exception: # pragma: no cover - best effort diagnostics | CODE |
| LOW⚡ | linkedin_mcp_server/debug_trace.py | 151 | except Exception: # pragma: no cover - best effort diagnostics | CODE |
| LOW | linkedin_mcp_server/debug_trace.py | 167 | except Exception as exc: # pragma: no cover - best effort diagnostics | CODE |
| MEDIUM | linkedin_mcp_server/debug_trace.py | 110 | def _safe_source_profile_dir() -> Path: | CODE |
| MEDIUM | linkedin_mcp_server/cli_main.py | 604 | def check_session() -> bool: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 243 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 289 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 334 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 617 | except Exception as e: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 652 | except Exception as e: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 713 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 756 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 769 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 967 | except Exception as e: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 991 | except Exception: | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 1001 | except Exception as e: | CODE |
| LOW | linkedin_mcp_server/login_viewer.py | 253 | except Exception: | CODE |
| LOW⚡ | linkedin_mcp_server/login_viewer.py | 266 | except Exception as exc: | CODE |
| LOW⚡ | linkedin_mcp_server/login_viewer.py | 276 | except Exception as exc: | CODE |
| LOW⚡ | linkedin_mcp_server/login_viewer.py | 280 | except Exception as exc: | CODE |
| LOW | linkedin_mcp_server/setup.py | 324 | except Exception as teardown_error: | CODE |
| LOW | linkedin_mcp_server/setup.py | 398 | except Exception as teardown_error: | CODE |
| LOW | linkedin_mcp_server/setup.py | 505 | except Exception as e: | CODE |
| LOW | linkedin_mcp_server/setup.py | 522 | except Exception as e: | CODE |
| 324 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/windows_guardian_probe.py | 738 | # The outer harness is the only authority allowed to break a failed | COMMENT |
| MEDIUM | tests/windows_guardian_probe.py | 1474 | # The probe root is private to its harness. Under that protected-parent | COMMENT |
| MEDIUM | tests/windows_guardian_probe.py | 4176 | # Only the already-assigned outer harness Job may break this failed proof. | COMMENT |
| MEDIUM | tests/differential/signals.py | 669 | #: Pids known to be no actor's launch: the harness itself, whose | COMMENT |
| MEDIUM | tests/differential/signals.py | 905 | # Started by the harness itself, not by the ancestor. | COMMENT |
| MEDIUM | tests/differential/signals.py | 1770 | # No stream of the harness's: a canary that outlived its row must not | COMMENT |
| MEDIUM | tests/differential/signals.py | 1771 | # hold the output of whatever ran the harness open behind it. | COMMENT |
| MEDIUM | tests/differential/signals.py | 1789 | # The harness's own Job forbids breakaway: the canary shares | COMMENT |
| MEDIUM⚡ | tests/differential/harness.py | 9656 | # From here on the harness acts: a checkpoint after this marker | COMMENT |
| MEDIUM⚡ | tests/differential/harness.py | 9660 | # no browser waits out a deadline on the harness's account. A release | COMMENT |
| MEDIUM⚡ | tests/differential/harness.py | 9666 | # row cannot sign in on the harness's account. | COMMENT |
| MEDIUM⚡ | tests/differential/harness.py | 9714 | # each installer, read before the harness intervenes below. | COMMENT |
| MEDIUM | tests/differential/harness.py | 415 | #: How a row's host reaches its server. ``stdio``: the harness's host stub, | COMMENT |
| MEDIUM | tests/differential/harness.py | 469 | #: so the harness's own value would hand a baseline actor the candidate's venv. | COMMENT |
| MEDIUM | tests/differential/harness.py | 1244 | #: harness's monotonic clock; the second only for an exit it saw. | COMMENT |
| MEDIUM | tests/differential/harness.py | 1826 | #: harness's own child, holding nothing but pipes. | COMMENT |
| MEDIUM | tests/differential/harness.py | 2444 | #: harness's own host stub, a stub host in a process of its own, or an HTTP | COMMENT |
| MEDIUM | tests/differential/harness.py | 4453 | #: The one file the harness's own restoration writes in the auth root: the | COMMENT |
| MEDIUM | tests/differential/harness.py | 5867 | #: H-R6: what the harness killed, and the guardian it had. | COMMENT |
| MEDIUM | tests/differential/harness.py | 5908 | #: H-R6: what the harness killed, its guardian and the oracle's state. | COMMENT |
| MEDIUM | tests/differential/harness.py | 5961 | # H-R6 in Direct: the server is the host's own process and the harness | COMMENT |
| MEDIUM | tests/differential/harness.py | 5993 | # The harness only ever tests for this directory and never creates it | COMMENT |
| MEDIUM | tests/differential/harness.py | 7720 | # harness's restoration, then the probe, so the probe is a | COMMENT |
| MEDIUM | tests/differential/harness.py | 7738 | # What the product left at the boundary, read before the harness | COMMENT |
| MEDIUM | tests/differential/harness.py | 9422 | # own; every other one is the harness's in-process host stub. | COMMENT |
| MEDIUM | tests/differential/harness.py | 10005 | # Before preservation: the original actors, and whatever the harness | COMMENT |
| MEDIUM | tests/differential/harness.py | 10073 | # Only a confirmation the script recorded, and only one this harness | COMMENT |
| MEDIUM | tests/differential/harness.py | 10085 | # Only one the harness itself recorded, with its reading. | COMMENT |
| MEDIUM | tests/differential/harness.py | 10181 | # by the harness on a row that must stay Direct. | COMMENT |
| MEDIUM | tests/differential/test_owner_loss.py | 449 | # The owner's own browser, as ``harness.browser_lineage`` records it. | COMMENT |
| MEDIUM | tests/differential/test_owner_loss.py | 1900 | # Resumed once, by the harness, and the row fails for it. | COMMENT |
| MEDIUM | tests/differential/test_signals.py | 315 | #: (times less 1790484300, the harness at 9157). The frozen Direct server | COMMENT |
| MEDIUM | tests/differential/test_signals.py | 2044 | # The traced root 20 was killed by the harness and wrote no end; its | COMMENT |
| MEDIUM⚡ | tests/differential/test_signals.py | 761 | # Not killed by the harness: the same host is a failed quit. | STRING |
| MEDIUM | tests/differential/test_signals.py | 815 | # Adopted by init; in this table pid 1 is the harness, so 50 stands in. | STRING |
| MEDIUM | tests/differential/test_r7_fault.py | 293 | # harness armed and sent the close meanwhile. Its entry time is the one it | COMMENT |
| MEDIUM | tests/differential/test_r7_fault.py | 607 | # suspends in its export before the harness arms and sends. The requested | COMMENT |
| MEDIUM⚡ | tests/differential/test_host_loss.py | 1703 | # A second Direct server on a profile still held would be the harness's. | COMMENT |
| MEDIUM | tests/differential/test_host_loss.py | 240 | # The harness learns of the loss from its own channel to the stub. | COMMENT |
| MEDIUM | tests/differential/baseline.py | 288 | # ``-I``: nothing from the harness's environment or working directory can | STRING |
| MEDIUM⚡ | tests/differential/test_failed_job_query.py | 746 | # trace to the harness; the installer and its worker were recorded. | COMMENT |
| MEDIUM | tests/differential/test_failed_job_query.py | 677 | #: (6076, a child of the harness, which also started the row's canaries) and | COMMENT |
| MEDIUM | tests/differential/test_failed_job_query.py | 680 | #: installer's supervisor (880) and a worker below it. Here the harness is | COMMENT |
| MEDIUM⚡ | tests/differential/test_failed_job_query.py | 1029 | # Anything else written meanwhile is not the harness's to hide. | STRING |
| MEDIUM | tests/differential/test_failed_job_query.py | 906 | # gate, its child and its console host trace to the harness. | STRING |
| MEDIUM | tests/differential/test_failed_job_query.py | 976 | # A process whose recorded ancestry reaches the harness is no installer's. | STRING |
| MEDIUM | tests/differential/test_failed_job_query.py | 1008 | # --- The harness's restoration, and the session at the recovery boundary ---------- | STRING |
| MEDIUM | tests/differential/test_auth_repair.py | 2298 | # The session went before the harness rejected it, with the origin still | COMMENT |
| MEDIUM | tests/differential/test_auth_repair.py | 2344 | # own record instead of the harness recording it. | COMMENT |
| MEDIUM | tests/differential/test_unconfirmed_close.py | 2337 | # --- The actors' environment and the harness's own settling ----------------------------------- | COMMENT |
| MEDIUM⚡ | tests/differential/test_preservation_gate.py | 899 | # Recorded below the frontend the harness started: no installer's. | COMMENT |
| MEDIUM⚡ | tests/differential/test_preservation_gate.py | 906 | # E1EY-03: before the harness restores or probes, not only at the end. | COMMENT |
| MEDIUM | tests/differential/test_preservation_gate.py | 703 | # Something besides the harness writes whenever it records. | COMMENT |
| MEDIUM | tests/differential/test_preservation_gate.py | 816 | # settlement, then the harness's restoration, then the probe. | COMMENT |
| MEDIUM | tests/differential/test_preservation_gate.py | 957 | # failed row's cleanup stops the harness's own stall host and keeps the | COMMENT |
| MEDIUM | tests/differential/test_preservation_gate.py | 1001 | # The installer did end, once the harness stopped the stall host; that | COMMENT |
| MEDIUM | tests/differential/test_preservation_gate.py | 1143 | # The frontend, started by the harness: the gate's chain is complete. | COMMENT |
| MEDIUM | tests/differential/retirement_race.py | 120 | #: The row's first call, the harness's warm-up read (``harness.READ_TOOL``). | COMMENT |
| MEDIUM | tests/differential/retirement_race.py | 160 | #: How far apart a process's create time and the harness's wall clock may be | COMMENT |
| MEDIUM | tests/differential/events.py | 41 | #: The plan's actors, plus ``driver`` (Patchright's Node process), ``harness`` | COMMENT |
| 55 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | linkedin_mcp_server/bootstrap.py | 3 | CODE | |
| LOW | linkedin_mcp_server/process_protocol.py | 3 | CODE | |
| LOW | linkedin_mcp_server/error_diagnostics.py | 3 | CODE | |
| LOW | linkedin_mcp_server/greenlet_runtime.py | 150 | CODE | |
| LOW | linkedin_mcp_server/server.py | 54 | CODE | |
| LOW | linkedin_mcp_server/hidden_target.py | 25 | CODE | |
| LOW | linkedin_mcp_server/hidden_target.py | 38 | CODE | |
| LOW | linkedin_mcp_server/session_state.py | 3 | CODE | |
| LOW | linkedin_mcp_server/installer_supervisor.py | 3 | CODE | |
| LOW | linkedin_mcp_server/update_check.py | 16 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 3 | CODE | |
| LOW | linkedin_mcp_server/debug_trace.py | 3 | CODE | |
| LOW | linkedin_mcp_server/cli_main.py | 62 | CODE | |
| LOW | linkedin_mcp_server/private_state.py | 23 | CODE | |
| LOW | linkedin_mcp_server/login_viewer.py | 3 | CODE | |
| LOW | linkedin_mcp_server/windows_acl.py | 23 | CODE | |
| LOW | linkedin_mcp_server/profile_claim.py | 28 | CODE | |
| LOW | linkedin_mcp_server/sequential_tool_middleware.py | 3 | CODE | |
| LOW | linkedin_mcp_server/installer_worker.py | 3 | CODE | |
| LOW | linkedin_mcp_server/storage_class.py | 23 | CODE | |
| LOW | linkedin_mcp_server/process_guardian.py | 3 | CODE | |
| LOW | linkedin_mcp_server/common_utils.py | 3 | CODE | |
| LOW | linkedin_mcp_server/process_gate.py | 3 | CODE | |
| LOW | linkedin_mcp_server/browser_launch.py | 16 | CODE | |
| LOW | linkedin_mcp_server/profile_lease.py | 32 | CODE | |
| LOW | linkedin_mcp_server/debug_utils.py | 3 | CODE | |
| LOW | linkedin_mcp_server/browser_import/discovery.py | 10 | CODE | |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 10 | CODE | |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 17 | CODE | |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 17 | CODE | |
| LOW | linkedin_mcp_server/browser_import/orchestrate.py | 22 | CODE | |
| LOW | linkedin_mcp_server/browser_import/extract.py | 17 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/drivers/__init__.py | 16 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 5 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 5 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 5 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 5 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 5 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 12 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 12 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 12 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| LOW | linkedin_mcp_server/core/__init__.py | 13 | CODE | |
| 232 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | linkedin_mcp_server/bootstrap.py | 121 | "chromium-headless-shell": "chromium_headless_shell-", | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 141 | # over it: that collector deletes directories whose name begins with a browser | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 161 | #: and that ``BrowserSetupFailedError`` then carried to an MCP client. | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 181 | #: it *ended* on into its timeout and its error, so a mirror answering 302 with | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 201 | #: Where a redactable run opens. Both patterns above are represented, because a | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 221 | _WHITESPACE = re.compile(r"\s") | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 241 | ) | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 261 | #: end of line. A response body can forge that exact shape after it has emitted | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 301 | #: written by ``_held_markers`` and no configured value can match across it. | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 1061 | def _owned_browser_setup_ready() -> bool: | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 2681 | if one is other: | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 2881 | except OSError: | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 2921 | TransferSpeedColumn(), | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 2941 | # streams and the answer stops being available. | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 2981 | # those would leave four completed bars for one browser. | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 3041 | # and without this the failure ends under five completed bars. The | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 3481 | # would behead: the part that names it is in front of the cut and the | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 3641 | # below ends where the cap fell, and trimming there would eat | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 4041 | return False | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 4161 | # -> core/browser.py start) with NO launch timeout, so a wedged binary | COMMENT |
| LOW | linkedin_mcp_server/bootstrap.py | 4561 | # 60-second wait was never reached. | COMMENT |
| LOW | linkedin_mcp_server/server.py | 121 | try: | COMMENT |
| LOW | linkedin_mcp_server/server.py | 181 | ) | COMMENT |
| LOW | linkedin_mcp_server/server.py | 201 | # check lives in `set_process_role` so every entry point is covered by one | COMMENT |
| LOW | linkedin_mcp_server/server.py | 241 | # Budgeted from the timeout every tool here is given, rather than from | COMMENT |
| LOW | linkedin_mcp_server/hidden_target.py | 161 | # hidden page is simply gone. `context.new_cdp_session` is the obvious call | COMMENT |
| LOW | linkedin_mcp_server/session_state.py | 441 | "moby", | COMMENT |
| LOW | linkedin_mcp_server/process_tree.py | 21 | COMMENT | |
| LOW | linkedin_mcp_server/process_tree.py | 61 | _JOB_API_FAILURE_LIMIT = 3 | COMMENT |
| LOW | linkedin_mcp_server/process_tree.py | 101 | ready_read, ready_write = os.pipe() | COMMENT |
| LOW | linkedin_mcp_server/cli_main.py | 881 | print("\n🚀 Server ready! Choose transport mode:") | COMMENT |
| LOW | linkedin_mcp_server/cli_main.py | 921 | if transport == "streamable-http": | COMMENT |
| LOW | linkedin_mcp_server/cli_main.py | 941 | # the LAN address were served, while the same request to | COMMENT |
| LOW | linkedin_mcp_server/private_state.py | 301 | The file has to exist already. POSIX hardens it through an open descriptor; | COMMENT |
| LOW | linkedin_mcp_server/private_state.py | 361 | # deliberately: it runs in a finally, where raising would replace | COMMENT |
| LOW | linkedin_mcp_server/private_state.py | 461 | COMMENT | |
| LOW | linkedin_mcp_server/setup.py | 81 | # cookies over the new ones (drivers.browser exports on close). | COMMENT |
| LOW | linkedin_mcp_server/setup.py | 101 | "Another LinkedIn MCP client is using the browser, so a login " | COMMENT |
| LOW | linkedin_mcp_server/setup.py | 201 | # The retirement happens before the replacement exists, so a login that | COMMENT |
| LOW | linkedin_mcp_server/windows_acl.py | 101 | | GENERIC_WRITE | COMMENT |
| LOW | linkedin_mcp_server/windows_acl.py | 121 | #: over an object that same account created and already owns. | COMMENT |
| LOW | linkedin_mcp_server/windows_acl.py | 141 | #: ``FILE_DELETE_CHILD`` is the same question one level down: an account holding | COMMENT |
| LOW | linkedin_mcp_server/profile_claim.py | 61 | #: Entries that say nothing about whether a root already belongs to somebody, | COMMENT |
| LOW | linkedin_mcp_server/error_handler.py | 101 | # guard with their own `except ToolError` (`tools/person.py:175`, | COMMENT |
| LOW | linkedin_mcp_server/error_handler.py | 301 | # The catch-all for exceptions nothing else classified, so a raw driver | COMMENT |
| LOW | linkedin_mcp_server/server_role.py | 61 | #: login window may be opened is decided far down the stack, in ``bootstrap``, | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 61 | #: Anchored to whitespace or the start of the line, which is the part that stops | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 81 | #: | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 101 | #: depends on the patchright they resolved and on their platform. From the | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 121 | #: | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 141 | #: For anyone allowlisting egress, one host is not the whole answer. Every | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 161 | #: `Google Chrome for Testing 148.0.7778.96` on macOS. One revision, two names, | COMMENT |
| LOW | linkedin_mcp_server/browser_downgrade.py | 181 | #: about whatever wrote the profile -- `Last Version` records no product to ask | COMMENT |
| LOW | linkedin_mcp_server/dependencies.py | 101 | # change that releases the lease sooner, would otherwise latch onto a | COMMENT |
| LOW | linkedin_mcp_server/dependencies.py | 121 | # | COMMENT |
| LOW | linkedin_mcp_server/browser_launch.py | 21 | # therefore goes around the proxy and hands the page the machine's real | COMMENT |
| LOW | linkedin_mcp_server/browser_launch.py | 41 | # where it is. That is acceptable here because nothing in this server uses it: | COMMENT |
| LOW | linkedin_mcp_server/browser_launch.py | 81 | launch_options: dict[str, Any] = {} | COMMENT |
| LOW | linkedin_mcp_server/browser_import/discovery.py | 41 | # renames the SERVICE (e.g. Helium account "Helium" but service | COMMENT |
| LOW | linkedin_mcp_server/browser_import/orchestrate.py | 321 | # For the reason the login releases here: one guardian exists per | COMMENT |
| 142 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | linkedin_mcp_server/bootstrap.py | 515 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 867 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 1448 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 1569 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 1863 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 2076 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 2374 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 2851 | CODE | |
| LOW | linkedin_mcp_server/bootstrap.py | 2952 | CODE | |
| LOW | linkedin_mcp_server/process_protocol.py | 33 | CODE | |
| LOW | linkedin_mcp_server/server.py | 91 | CODE | |
| LOW | linkedin_mcp_server/hidden_target.py | 112 | CODE | |
| LOW | linkedin_mcp_server/session_state.py | 1303 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 89 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 502 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 554 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 606 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 838 | CODE | |
| LOW | linkedin_mcp_server/process_tree.py | 1460 | CODE | |
| LOW | linkedin_mcp_server/cli_main.py | 796 | CODE | |
| LOW | linkedin_mcp_server/private_state.py | 181 | CODE | |
| LOW | linkedin_mcp_server/private_state.py | 489 | CODE | |
| LOW | linkedin_mcp_server/setup.py | 165 | CODE | |
| LOW | linkedin_mcp_server/setup.py | 245 | CODE | |
| LOW | linkedin_mcp_server/setup.py | 330 | CODE | |
| LOW | linkedin_mcp_server/setup.py | 432 | CODE | |
| LOW | linkedin_mcp_server/error_handler.py | 75 | CODE | |
| LOW | linkedin_mcp_server/storage_class.py | 285 | CODE | |
| LOW | linkedin_mcp_server/process_guardian.py | 92 | CODE | |
| LOW | linkedin_mcp_server/process_guardian.py | 116 | CODE | |
| LOW | linkedin_mcp_server/profile_lease.py | 283 | CODE | |
| LOW | linkedin_mcp_server/browser_import/discovery.py | 210 | CODE | |
| LOW | linkedin_mcp_server/browser_import/orchestrate.py | 290 | CODE | |
| LOW | linkedin_mcp_server/tools/company.py | 31 | CODE | |
| LOW | linkedin_mcp_server/tools/company.py | 106 | CODE | |
| LOW | linkedin_mcp_server/tools/feed.py | 28 | CODE | |
| LOW | linkedin_mcp_server/tools/feed.py | 39 | CODE | |
| LOW | linkedin_mcp_server/core/auth.py | 228 | CODE | |
| LOW | linkedin_mcp_server/core/utils.py | 253 | CODE | |
| LOW | linkedin_mcp_server/daemon/descriptor.py | 377 | CODE | |
| LOW | linkedin_mcp_server/daemon/election.py | 906 | CODE | |
| LOW | linkedin_mcp_server/daemon/election.py | 1038 | CODE | |
| LOW | linkedin_mcp_server/daemon/election.py | 1332 | CODE | |
| LOW | linkedin_mcp_server/daemon/election.py | 805 | CODE | |
| LOW | linkedin_mcp_server/daemon/election.py | 813 | CODE | |
| LOW | linkedin_mcp_server/daemon/proxy.py | 557 | CODE | |
| LOW | linkedin_mcp_server/daemon/owner.py | 884 | CODE | |
| LOW | linkedin_mcp_server/linkedin/message_sender.py | 1787 | CODE | |
| LOW | linkedin_mcp_server/linkedin/person.py | 196 | CODE | |
| LOW | linkedin_mcp_server/linkedin/company.py | 43 | CODE | |
| LOW | linkedin_mcp_server/linkedin/connection_actions.py | 549 | CODE | |
| LOW | linkedin_mcp_server/linkedin/feed.py | 50 | CODE | |
| LOW | linkedin_mcp_server/linkedin/feed.py | 184 | CODE | |
| LOW | linkedin_mcp_server/linkedin/jobs.py | 182 | CODE | |
| LOW | linkedin_mcp_server/linkedin/jobs.py | 581 | CODE | |
| LOW | linkedin_mcp_server/linkedin/capture.py | 178 | CODE | |
| LOW | linkedin_mcp_server/linkedin/capture.py | 345 | CODE | |
| LOW | tests/test_server_json.py | 288 | CODE | |
| LOW | tests/test_core_browser.py | 353 | CODE | |
| LOW | tests/test_core_browser.py | 425 | CODE | |
| 112 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/differential/test_auth_repair.py | 0 | a check of the mapping only: never counted as any branch's coverage, which comes from the mapped tests' own runs. | STRING |
| HIGH | tests/differential/test_eligibility.py | 0 | a check of the mapping only: never counted as any branch's coverage, which comes from the mapped tests' own runs. | STRING |
| HIGH | tests/differential/test_profile_commands.py | 0 | a check of the mapping only: never counted as any branch's coverage, which comes from the mapped tests' own runs. | STRING |
| HIGH | tests/differential/retirement_race.py | 0 | the problems that leave a row unmeasured rather than failed. | STRING |
| HIGH | tests/differential/eligibility_rows.py | 0 | the problems that leave a row unmeasured rather than failed. | STRING |
| HIGH | tests/differential/call_loss.py | 0 | the problems that leave a row unmeasured rather than failed. | STRING |
| HIGH | tests/differential/profile_commands.py | 0 | the problems that leave a row unmeasured rather than failed. | STRING |
| HIGH | tests/differential/auth_repair.py | 0 | the problems that leave a row unmeasured rather than failed. | STRING |
| HIGH | tests/differential/owner_loss.py | 0 | the problems that leave a row unmeasured rather than failed. | STRING |
| HIGH | tests/differential/retirement_race.py | 0 | the verdict of whichever row of this module *record* is for. | STRING |
| HIGH | tests/differential/eligibility_rows.py | 0 | the verdict of whichever row of this module *record* is for. | STRING |
| HIGH | tests/differential/profile_commands.py | 0 | the verdict of whichever row of this module *record* is for. | STRING |
| HIGH | tests/differential/auth_repair.py | 0 | the verdict of whichever row of this module *record* is for. | STRING |
| HIGH | tests/differential/owner_loss.py | 0 | the verdict of whichever row of this module *record* is for. | STRING |
| HIGH | tests/differential/retirement_race.py | 0 | k0 against k3: both valid by their own verdict, and alike in every classification. a missing or invalid record is a refu | STRING |
| HIGH | tests/differential/eligibility_rows.py | 0 | k0 against k3: both valid by their own verdict, and alike in every classification. a missing or invalid record is a refu | STRING |
| HIGH | tests/differential/profile_commands.py | 0 | k0 against k3: both valid by their own verdict, and alike in every classification. a missing or invalid record is a refu | STRING |
| HIGH | tests/differential/auth_repair.py | 0 | k0 against k3: both valid by their own verdict, and alike in every classification. a missing or invalid record is a refu | STRING |
| HIGH | tests/differential/owner_loss.py | 0 | k0 against k3: both valid by their own verdict, and alike in every classification. a missing or invalid record is a refu | STRING |
| HIGH | tests/differential/test_eligibility.py | 0 | fresh registries, so one test's retained worker never gates the next. | STRING |
| HIGH | tests/differential/test_call_loss.py | 0 | fresh registries, so one test's retained worker never gates the next. | STRING |
| HIGH | tests/differential/test_host_comparison.py | 0 | fresh registries, so one test's retained worker never gates the next. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | linkedin_mcp_server/bootstrap.py | 107 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/server.py | 56 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/hidden_target.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/session_state.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/update_check.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/process_tree.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/cli_main.py | 65 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/private_state.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/profile_claim.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/authentication.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | linkedin_mcp_server/error_handler.py | 55 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/sequential_tool_middleware.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/storage_class.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/server_role.py | 89 | def set_process_role(role: ServerRole) -> None: | CODE |
| LOW | linkedin_mcp_server/browser_downgrade.py | 45 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/dependencies.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/browser_launch.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/profile_lease.py | 48 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/browser_import/discovery.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/browser_import/__init__.py | 19 | __all__ = [ | CODE |
| LOW | linkedin_mcp_server/browser_import/orchestrate.py | 63 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/browser_import/extract.py | 45 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/tools/post.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | linkedin_mcp_server/tools/person.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/tools/company.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/tools/job.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/tools/feed.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/tools/messaging.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/drivers/__init__.py | 29 | __all__ = [ | CODE |
| LOW | linkedin_mcp_server/drivers/browser.py | 69 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/drivers/browser.py | 939 | def _settle_the_profile(*, confirmed: bool) -> None: | CODE |
| LOW | linkedin_mcp_server/drivers/browser.py | 1065 | def set_headless(headless: bool) -> None: | CODE |
| LOW | linkedin_mcp_server/core/auth.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/core/destination.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/core/__init__.py | 56 | __all__ = [ | CODE |
| LOW | linkedin_mcp_server/core/browser.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/core/utils.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/core/proxy_errors.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/config/loaders.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/config/__init__.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/config/__init__.py | 28 | def set_config(config: AppConfig) -> None: | CODE |
| LOW | linkedin_mcp_server/config/__init__.py | 54 | __all__ = [ | CODE |
| LOW | linkedin_mcp_server/config/schema.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/election.py | 60 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/startup.py | 75 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/forwarder.py | 81 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/version.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/liveness.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/discovery.py | 55 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/proxy.py | 84 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/owner.py | 103 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/auth_repair.py | 63 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/daemon/lock.py | 64 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | linkedin_mcp_server/linkedin/message_sender.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/linkedin/person.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/linkedin/company.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/linkedin/connection_actions.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/linkedin/fields.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/linkedin/job_pages.py | 53 | logger = logging.getLogger(__name__) | CODE |
| LOW | linkedin_mcp_server/linkedin/identifiers.py | 50 | __all__ = [ | CODE |
| 12 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_process_tree.py | 3347 | # -------------------------------------------------------------------------- | STRING |
| MEDIUM | tests/test_process_tree.py | 3349 | # -------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 519 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 521 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 586 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 588 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 678 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 680 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 742 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 744 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 843 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 845 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 905 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 907 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 141 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 143 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 374 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_browser_import_extract.py | 376 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | tests/test_browser_import_extract.py | 473 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM | tests/test_browser_import_extract.py | 475 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_browser_import_discovery.py | 341 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_browser_import_discovery.py | 343 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 443 | (isolate_profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW⚡ | tests/test_cli_main.py | 495 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW⚡ | tests/test_cli_main.py | 501 | (runtime_profile / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_cli_main.py | 389 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_cli_main.py | 450 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_cli_main.py | 1478 | (self.profile / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_cli_main.py | 2423 | (self.profile / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 951 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 1167 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 1366 | (isolate_profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 1416 | (isolate_profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 1478 | (isolate_profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 1519 | (other / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_profile_lease_integration.py | 1552 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_browser_driver.py | 76 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_browser_driver.py | 106 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW⚡ | tests/test_bootstrap.py | 311 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_bootstrap.py | 9994 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_bootstrap.py | 10104 | (profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_bootstrap.py | 10275 | (isolate_profile_dir / "Default" / "Cookies").write_text("placeholder") | CODE |
| LOW | tests/test_tools.py | 381 | "main_profile": "John Doe", | CODE |
| LOW | tests/test_tools.py | 416 | "sections": {"main_profile": "John Doe"}, | CODE |
| LOW | tests/test_tools.py | 439 | "sections": {"main_profile": "John Doe"}, | CODE |
| LOW | tests/test_tools.py | 481 | "sections": {"main_profile": "John Doe"}, | CODE |
| LOW | tests/test_tools.py | 666 | "sections": {"search_results": "Jane Doe"}, | CODE |
| LOW | tests/test_tools.py | 2043 | "sections": {"main_profile": "John Doe", "experience": "Work history"}, | CODE |
| LOW | tests/test_tools.py | 2063 | "sections": {"main_profile": "John Doe"}, | CODE |
| LOW | tests/test_tools.py | 2083 | "sections": {"main_profile": "John Doe"}, | CODE |
| LOW | tests/test_issue_packet_contract.py | 323 | if "placeholder" in attrs: | CODE |
| LOW | tests/test_issue_packet_contract.py | 325 | attrs["placeholder"], f"{filename} {item.get('id')} placeholder" | CODE |
| LOW⚡ | tests/linkedin/test_person.py | 1822 | return_value=extracted("Jane Doe"), | CODE |
| LOW⚡ | tests/linkedin/test_person.py | 1834 | return_value=extracted("Jane Doe"), | CODE |
| LOW⚡ | tests/linkedin/test_person.py | 1846 | return_value=extracted("Jane Doe"), | CODE |
| LOW⚡ | tests/linkedin/test_person.py | 1881 | return_value=extracted("Jane Doe"), | CODE |
| LOW⚡ | tests/linkedin/test_person.py | 1893 | return_value=extracted("Jane Doe"), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | linkedin_mcp_server/setup.py | 52 | Open browser for manual LinkedIn login with persistent profile. Opens a non-headless browser, navigates to Lin | STRING |
| HIGH | linkedin_mcp_server/tools/person.py | 78 | Get a specific person's LinkedIn profile. Args: linkedin_username: LinkedIn username (e.g. | STRING |
| HIGH | linkedin_mcp_server/tools/person.py | 374 | Get the authenticated user's own LinkedIn profile. Navigates to /in/me/ and resolves the redirect to o | STRING |
| HIGH | linkedin_mcp_server/tools/company.py | 47 | Get a specific company's LinkedIn profile. Args: company_name: LinkedIn company name (e.g. | STRING |
| HIGH | linkedin_mcp_server/drivers/browser.py | 668 | Get existing browser or create and initialize a new one. Uses a singleton pattern to reuse the browser across | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | linkedin_mcp_server/tools/job.py | 136 | CODE | |
| LOW | linkedin_mcp_server/linkedin/extractor.py | 165 | CODE | |
| LOW | linkedin_mcp_server/linkedin/jobs.py | 182 | CODE | |
| LOW | linkedin_mcp_server/linkedin/content.py | 172 | CODE | |
| LOW | tests/test_job_sidebar_scroll_dom.py | 50 | CODE | |
| LOW | tests/test_daemon_election.py | 6415 | CODE | |
| LOW | tests/differential/harness.py | 1658 | CODE | |
| LOW | tests/differential/harness.py | 7060 | CODE | |
| LOW | tests/differential/test_row_judgement.py | 455 | CODE | |
| LOW | tests/differential/watcher.py | 751 | CODE | |
| LOW | tests/differential/test_watcher.py | 549 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | linkedin_mcp_server/core/auth.py | 77 | # Step 1: Fail-fast on auth blockers | COMMENT |
| LOW⚡ | linkedin_mcp_server/core/auth.py | 81 | # Step 2: Selector check (PRIMARY) | COMMENT |
| LOW⚡ | linkedin_mcp_server/core/auth.py | 90 | # Step 3: URL fallback | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | linkedin_mcp_server/core/auth.py | 77 | # Step 1: Fail-fast on auth blockers | COMMENT |
| LOW⚡ | linkedin_mcp_server/core/auth.py | 81 | # Step 2: Selector check (PRIMARY) | COMMENT |
| LOW⚡ | linkedin_mcp_server/core/auth.py | 90 | # Step 3: URL fallback | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | linkedin_mcp_server/logging_config.py | 67 | # Create a copy of the record to avoid modifying the original | COMMENT |
| MEDIUM | tests/conftest.py | 439 | # Create a marker file so profile_exists() returns True | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | linkedin_mcp_server/bootstrap.py | 4182 | # session (orchestrate.py:254). The "no live session" and "could not | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/release.yml | 49 | # Check if version actually changed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_cli_main.py | 1354 | def handle_request(self, request: httpx2.Request) -> httpx2.Response: | CODE |