Skip to main content
Glama

Search Linkedin People

search_linkedin_people
Read-only

One call runs one query, returning ~10 matches by default (one page). To go deeper on a single query — "find people in my network matching my ICP" — pass max_results (up to 100): the tool pages through the matches for you, each ~10-profile page counting as one search against the daily budget. To search different people — a list of names, or one filter per company — loop this tool inside a run_code block, one call per name or company (that's breadth; max_results is depth on one query). Searches are paced a few seconds apart and serialized across this user's LinkedIn work, so a deep search or a long loop can take a couple of minutes; tell the user to expect a short wait before a large run. If a search comes back paused or rate-limited, stop and tell the user which searches remain — the account is paused and further calls won't run until it lifts.

Scope filters combine with keywords and can be used alone for a single filtered search:

  • connections_of — restrict to the first-degree connections of specific people, passed as their provider_ids (as returned by an earlier search or profile lookup). To work up to a buyer through someone the user just connected with, pass that person in connections_of and the target company in advanced_keywords={'company': 'Acme Corp'} to surface who they know there. network_distance is a separate filter on the user's own degree and combines with this — add [2] to keep just the connections the user isn't already directly linked to.

  • advanced_keywords — native LinkedIn keyword sub-filters: a dict with any of first_name, last_name, title, company, school (each a string).

  • profile_language — ISO 639-1 codes (e.g. ['en']) that narrow any of the above to profiles written in those languages. A refinement, not a search on its own — pair it with keywords or another filter.

When this runs in an agent, the matches are saved and linked to the workspace Output tab automatically (deduped by profile). Pass list_name (a short slug) to name their list — a discovery search, the people connected to someone, prospects to work through; reuse the same slug across a loop or follow-up searches to gather everything into one list. Absent a slug, matches land in the 'default' list. Outside an agent, results are returned only.

Returns up to max_results matching profiles with provider_id, name, headline, network_distance, location, and profile_url. Each match's headline is the member's own tagline: often their current role and company (e.g. to see which companies 2nd-degree matches work at), but frequently a title alone, so a headline that omits a company is not evidence they work elsewhere. total_count is LinkedIn's full match count for the query when it returns one, but LinkedIn now omits it on most Classic searches (so it's often null): only say "showing N of ~M" when it's a number exceeding the profiles returned, and never invent a total. Use has_more — True when more results exist beyond those returned — to decide whether to offer to pull more. Present the results to the user so they can pick the right person. An error about being "heavily queued" is transient pacing back-pressure — retry shortly rather than reporting it as not found.

That field list is the whole of it — a search result carries no connection count, follower count, or employment history. Present what comes back as it is; a search the user wanted to look at is finished at that point. When the ask genuinely needs one of the missing fields — a connection-count threshold, employment history to personalize from — pass the matches' profile URLs to enrich_linkedin_profiles, which returns them for the whole list in one paid call (connections_count is the field a connection-count filter reads) and spends no LinkedIn account budget. When the decision also turns on whether the user is already connected to them, use setup_linkedin_sequence(action_type='resolve') instead; connection status is the one thing enrichment cannot answer.

Rate-limited — shares one daily LinkedIn search budget with all other LinkedIn people searches. On success, a dict {'success': True, 'profiles': [...], 'total_count': int | None, 'has_more': bool, 'searches_remaining_today': int}. profiles holds up to max_results matches; total_count is the query's full match count when LinkedIn returns one (often null since its Aug-2026 Classic Search change), so lean on has_more for whether more results exist; and searches_remaining_today is the post-search budget, so you can size a follow-up loop without re-checking. In an agent, also saved_to_list (the list the matches were saved to) and saved_count; outside an agent, a passed list_name yields a null saved_to_list with a persist_note. If the account tripped its pause partway through paging, the (still valid) partial results come back with paused: True and a note — surface it: further searches won't run until the pause lifts.

On a failed search: {'success': False, 'profiles': [], 'error': ..., 'searches_remaining_today': int}. On a pre-flight refusal (daily limit reached or account paused), searches_remaining_today is omitted: {'success': False, 'error': ...}.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
keywordsNoA single search query, typically a person's name (e.g. "John Smith"). Omit when searching by `connections_of` / `advanced_keywords` alone. To search many names, loop the tool in `run_code`, one name per call.
list_nameNoOptional short slug naming the Output-tab list the matches are saved under when this runs in an agent. Absent, they save to the 'default' list. Reuse the same slug across a loop or follow-up searches to gather them into one list (deduped by profile).
max_resultsNoMax profiles to return for this one query (default 10 = one page; capped at 100). The tool pages the search internally to reach this many, each ~10-profile page costing one search from the daily budget. Use it to go deep on a single ICP/network query; for many *different* queries, loop the tool instead.
connections_ofNoOptional list of provider_ids; restricts results to people connected to those individuals.
network_distanceNoOptional LinkedIn degree filter. Pass [1] for first-degree connections, [2] for second-degree, [3] for third-degree-or-more, or combinations like [1, 2].
profile_languageNoOptional list of ISO 639-1 codes (e.g. ['en']).
advanced_keywordsNoOptional dict of native keyword sub-filters (first_name / last_name / title / company / school).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / list_name / description
      Previous value: -"Optional short slug naming the Output-tab list the matches are\n      saved under when this runs in a task. Absent, they save to the\n      'default' list. Reuse the same slug across a loop or follow-up\n      searches to gather them into one list (deduped by profile)."New value: +"Optional short slug naming the Output-tab list the matches are\n      saved under when this runs in an agent. Absent, they save to the\n      'default' list. Reuse the same slug across a loop or follow-up\n      searches to gather them into one list (deduped by profile)."
  2. Changed1 schema field changed
    • changedInput schema / properties / list_name / description
      Previous value: -"Optional short slug naming the Output-tab list to save under.\n      When set (and a task is active), this search's matches are saved\n      there, deduped by profile. Reuse the same slug across a loop or\n      follow-up searches to gather them into one list."New value: +"Optional short slug naming the Output-tab list the matches are\n      saved under when this runs in a task. Absent, they save to the\n      'default' list. Reuse the same slug across a loop or follow-up\n      searches to gather them into one list (deduped by profile)."
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint, but the description adds substantial behavioral context: a shared daily search budget, per-page cost, ~10-match default, a few-seconds pacing that is serialized across the user's LinkedIn work, pause/rate-limit handling, transient "heavily queued" errors, and auto-save to the Output tab. This is far beyond what the annotation conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary is front-loaded and well-organized into logical paragraphs, but the text is very long and some field/return details duplicate the `<returns>` block (e.g. total_count, has_more explanations). Most sentences earn their place, yet trimming redundancy would improve scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool this complex—optional params, budget limits, paging, saving behavior, and enrichment fallbacks—the description plus the returns block cover the workflow end to end. An agent has enough to invoke it correctly and interpret results without guessing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: a worked example combining `connections_of` with `advanced_keywords={'company': 'Acme Corp'}`, the note that `network_distance` is on the user's own degree and combines with connections_of, and that `profile_language` is a refinement not a standalone search.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource and immediately enumerates the three search modes (by name, by a person's connections, by profile filters) plus the return shape. It clearly differentiates itself from siblings like enrich_linkedin_profiles, search_linkedin_connections, and exa_find_people.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly contrast depth (`max_results` on one query) vs breadth (looping the tool in `run_code`, one name/company per call), and names the sibling to use for missing fields (enrich_linkedin_profiles) vs connection status (setup_linkedin_sequence). It even tells the agent when to stop and how to handle pause/rate-limit conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources