LinkMCP: hosted LinkedIn MCP server
Server Details
Hosted LinkedIn MCP server on your own account: 35 tools for search, profiles, inbox, posts, pages.
- Status
- Healthy
- Uptime
- 46.2% over 84 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-03-26
- URL
- Repository
- linkmcp-io/linkmcp
- GitHub Stars
- 3
- Server Listing
- LinkMCP
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 36 tools
Most tools target a distinct resource and action, and the descriptions explicitly differentiate the few overlapping pairs, such as linkedin_search_people vs linkedin_search_sales_navigator and linkedin_get_profile vs linkedin_bulk_get_profiles. A few engagement-related tools (linkedin_get_my_engagement, linkedin_get_post_analytics, linkedin_get_post_reactions) require careful reading, but boundaries are still clear.
The dominant pattern is consistent snake_case with a linkedin_ prefix plus verb_noun, e.g., linkedin_get_profile, linkedin_search_jobs, linkedin_send_message. The main deviation is a small set of unprefixed utility tools (find_email, find_mobile, validate_email, send_feedback), which is a minor inconsistency rather than a confusing mix.
With 36 tools, the surface is heavy for an agent to navigate reliably, even for a broad LinkedIn domain. Many capabilities are justified, but the count exceeds the typical 3–15 well-scoped range and pushes against the 25+ threshold for over-large tool sets.
The server covers profiles, companies, posts, comments, reactions, messages, connections, jobs, searches, analytics, and even email/mobile enrichment, giving broad read and engagement-write coverage. Gaps remain around editing or deleting posts/comments, applying to jobs, and any profile update operations, but most core workflows have a viable path.
Available Tools
36 toolsfind_emailFind EmailARead-onlyIdempotentInspect
Find a person's work email address given their name and company, for example to contact a prospect or a candidate by email. If you don't already have the person's name or company details, use linkedin_get_profile first. With company_domain it finds an email for about 2 in 3 people; with company_name only, for about 1 in 4. No result is common, so do not guess addresses. To check an address you already have, use validate_email.
| Name | Required | Description | Default |
|---|---|---|---|
| last_name | Yes | Person's last name. | |
| first_name | Yes | Person's first name. | |
| company_name | No | Company name (e.g. "Acme Inc"). Used when domain is not available. | |
| company_domain | No | Company website domain (e.g. "acme.com"). Recommended for best accuracy. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive, so safety is covered. The description adds genuinely useful behavior the annotations cannot express: expected hit rates (~2 in 3 with company_domain, ~1 in 4 with company_name only) and the high frequency of no-result, which shapes how an agent should plan around failure.
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?
Four sentences, each carrying distinct information: purpose, prerequisite sibling, accuracy expectations, and the validation alternative. Purpose is front-loaded and there is no redundant restatement of the name or title.
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?
There is no output schema, so the description should ideally clarify the shape of a hit versus a miss, and it only implies this via 'No result is common'. Otherwise it covers prerequisites, alternatives, accuracy expectations, and failure handling adequately for a four-parameter lookup tool.
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 and the schema already defines all four fields. The description earns extra credit by quantifying the accuracy difference between company_domain and company_name, giving the agent a reason to prefer one optional parameter over the other rather than just repeating the schema's 'Recommended for best accuracy'.
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 and resource (find a person's work email) plus the inputs it keys on (name and company), and the example use cases (prospect or candidate) frame it concretely. It is clearly separable from siblings like validate_email and linkedin_get_profile, both of which are named.
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 routes the agent: use linkedin_get_profile first when name/company are missing, and use validate_email when an address is already in hand. It also warns that a null result is normal and forbids guessing addresses, which is an explicit when-not-to-do-something instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_mobileFind Mobile NumberARead-onlyIdempotentInspect
Find the mobile phone number of one person. Identify the person with their LinkedIn profile URL or slug, or with their email address. One identifier is enough.
| Name | Required | Description | Default |
|---|---|---|---|
| No | The person's email address. Used only to identify the person, for example when you have no LinkedIn profile URL. | ||
| linkedin_profile | No | The person's LinkedIn profile URL (e.g. "https://linkedin.com/in/johndoe") or slug (e.g. "johndoe"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered structurally. The description adds the constraint that it resolves exactly one person and accepts a single identifier, but says nothing about what happens when no mobile number is found, hit rates, or any rate limits.
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?
Three short sentences, front-loaded with the operation and its scope, then the identifier options. Every sentence carries information and there is 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?
For a two-parameter lookup with full schema coverage and rich annotations, the description is nearly complete. The one gap is the absence of an output schema combined with no mention of return semantics, such as what the agent gets when the person is identified but no mobile number exists.
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% and both parameters carry examples, so the baseline is 3. The description adds meaning the schema does not: with 0 required parameters, it clarifies that exactly one identifier is needed and that either the LinkedIn profile or the email alone suffices.
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 and resource ('Find the mobile phone number') plus scope ('of one person'), which cleanly separates it from lookup siblings like find_email and validate_email. It never names an alternative tool explicitly, so the differentiation is implicit in the resource rather than spelled out.
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 tells the agent which identifiers are accepted and that 'one identifier is enough', which is real usage guidance, but it gives no when-to-use/when-not-to-use framing relative to find_email or the other person-lookup siblings. Usage is implied by the resource name rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_bulk_get_companiesBulk Get CompaniesARead-onlyIdempotentInspect
Fetch slim LinkedIn company profiles in bulk (up to 10). Returns per-item results with error tracking - never stops on first error.
| Name | Required | Description | Default |
|---|---|---|---|
| identifiers | Yes | Array of LinkedIn company identifiers (URLs, slugs, or numeric IDs). 1–10 items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false already declared, the description still adds genuinely useful behavior: capped batch size, per-item result objects, and the fact that one failure does not abort the remaining items. That partial-failure contract is exactly the kind of detail annotations cannot express.
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 compact sentences with no filler, and the batching scope is front-loaded ahead of the error-handling note. 'Slim' is the only mildly opaque term, but it usefully signals that profiles are trimmed rather than complete.
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 single-parameter, read-only, no-output-schema tool whose safety profile is fully covered by annotations, the description supplies the two things the schema cannot: batch cap and partial-failure return semantics. It does not describe what fields a 'slim' company profile contains, which is the only real gap.
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% and the single 'identifiers' parameter already documents accepted forms (URLs, slugs, numeric IDs) and the 1-10 range, so the schema carries the load. The description's 'up to 10' merely duplicates the schema's maxItems, adding no new parameter meaning — baseline 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?
States a specific verb and resource ('Fetch ... LinkedIn company profiles') plus the batching scope ('in bulk, up to 10'), which separates it from the single-record linkedin_get_company and from the person-oriented linkedin_bulk_get_profiles. It stops short of naming those siblings explicitly, so the distinction must be inferred from the word 'company'.
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 statement of when to choose this over linkedin_get_company for a single lookup, and no prerequisites or exclusions. 'In bulk' restates the purpose rather than providing routing guidance, so an agent gets no help deciding between the bulk and single variants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_bulk_get_profilesBulk Get ProfilesARead-onlyIdempotentInspect
Fetch LinkedIn profiles in bulk (up to 10). detail: "slim" (default) returns name, headline, location, current position and counts. detail: "full" returns the same full profile as linkedin_get_profile (about, all positions with descriptions, all education, industry, followers and connections). Both cost the same per profile as linkedin_get_profile: one profile lookup each. Company details are not included; use linkedin_get_company. Returns per-item results and never stops on the first error.
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | "slim" (default): name, headline, location, current position and counts. "full": the same full profile as linkedin_get_profile, at the same cost per profile. | slim |
| identifiers | Yes | Array of LinkedIn profile identifiers (URLs, public IDs / slugs, or URNs). 1–10 items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the description's added value is the cost model ('one profile lookup each'), the detail-level output tradeoff, and the critical error-handling contract ('Returns per-item results and never stops on the first error'). That failure-mode disclosure is exactly the kind of trait an agent needs and the annotations cannot express.
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?
Front-loaded with purpose and limit, then detail modes, then cost, then exclusions, then error behavior - a logical ordering. It is denser than strictly necessary (the detail definition is repeated in the schema), but each sentence carries distinct 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?
With no output schema, the description compensates by enumerating what each detail mode returns and by specifying the partial-success error semantics. Nothing an agent needs to call it correctly is missing, though response shape for per-item errors (error object fields) remains unspecified.
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 enum for 'detail' is documented in both the schema and the description with essentially the same content. The description adds cost equivalency and a pointer to linkedin_get_profile for the 'full' shape, but no new syntax or identifier-format detail beyond the schema, so the baseline 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 and resource ('Fetch LinkedIn profiles in bulk (up to 10)') and immediately distinguishes itself from the single-profile sibling by defining both detail modes. The scope (bulk, max 10, cost per profile) is unambiguous and an agent can pick it apart from linkedin_get_profile without opening either schema.
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?
Gives clear routing conditions: use this for 1-10 profile lookups at the same cost as linkedin_get_profile, and use linkedin_get_company when company details are needed. It stops short of saying when a single call is preferable to bulk (e.g. for one identifier), so it is clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_comment_on_postComment on PostADestructiveInspect
Comment on a LinkedIn post. Supports threaded replies (replying to an existing comment) and @mentions. Mention identifiers are automatically resolved - you can use profile URLs, slugs, or URNs.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Comment text (max 1250 characters). Use \n for line breaks. Use {{0}}, {{1}} etc. to insert mentions from the mentions array. | |
| as_page | No | Optional. Post the comment as a LinkedIn company page that you administer: the page_id from linkedin_list_company_pages. Omit it to comment as yourself. | |
| post_id | No | Activity URN (urn:li:activity:123) or numeric activity ID. Use post_url or post_id, at least one is required. | |
| mentions | No | Optional mentions array. Reference in text as {{0}}, {{1}} etc. Each identifier is resolved via profile lookup. | |
| post_url | No | LinkedIn post URL (e.g. https://www.linkedin.com/feed/update/urn:li:activity:123 or /posts/ style). | |
| comment_id | No | Optional. ID of an existing comment to reply to (threaded reply). | |
| content_check | No | Controls LLM content artifact detection (default: "strict"). "strict" rejects text containing Unicode dashes (— – −) and other LLM artifacts. "autofix" automatically replaces em dashes with standard dashes. "disabled" skips all content checks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true and idempotentHint=false, so the agent knows this is a public, non-idempotent write. The description adds that mention identifiers are auto-resolved, which is useful context, but it never states that the comment is publicly visible, irreversible, or subject to platform rate limits — the exact risks an agent should weigh before a destructive public write.
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?
Three short sentences, front-loaded with the primary action, then capability scope, then the mention-resolution note. No filler, though the final sentence partially duplicates the schema's 'Automatically resolved' wording rather than earning new 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?
For a destructive, multi-parameter write with no output schema, the description covers what the tool does and its two special modes, but says nothing about the result (e.g. whether the created comment ID is returned) or the visibility/permanence of the effect. It is adequate but leaves the post-call expectations to inference.
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 every parameter is already documented in the schema (including the {{0}} placeholder convention, identifier formats, comment_id for threading, and content_check semantics). The description largely restates what the schema says about URL/slug/URN resolution. Baseline 3 is appropriate when the schema does the heavy lifting.
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 and resource ('Comment on a LinkedIn post') and immediately scopes the capability with threaded replies and @mentions. An agent can distinguish this from linkedin_create_post, linkedin_react_to_post and linkedin_get_post_comments without opening the schema.
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?
Usage is implied by the verb — use this to post a comment — and the mention/reply sentences hint at the threaded variant, but there is no explicit 'use this instead of X' guidance or when-not condition. The description never names a sibling tool (e.g. linkedin_create_post for top-level posts, linkedin_react_to_post for reactions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_create_postCreate PostADestructiveInspect
Create a LinkedIn post. Supports text with line breaks, image attachments (via public URLs), @mentions, link preview cards, and reposting existing posts.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Post content (max 3000 characters). Use \n for line breaks. Use {{0}}, {{1}} etc. to insert mentions from the mentions array. | |
| repost | No | Optional social_id of an existing LinkedIn post to share/repost. For a simple repost without commentary, text can be empty. | |
| as_page | No | Optional. Publish the post as a LinkedIn company page that you administer: the page_id from linkedin_list_company_pages. The post is public under the page name, not under your name. Omit it to post as yourself. | |
| mentions | No | Optional mentions array. Reference in text as {{0}}, {{1}} etc. | |
| image_urls | No | Optional array of publicly accessible image URLs (JPEG, PNG, GIF, max 5MB each, max 20). The server will fetch and attach them to the post. | |
| content_check | No | Controls LLM content artifact detection (default: "strict"). "strict" rejects text containing Unicode dashes (— – −) and other LLM artifacts. "autofix" automatically replaces em dashes with short dashes. "disabled" skips all content checks. | |
| external_link | No | Optional URL for a link preview card. Must also appear in the post text. If a preview is not available, the link stays in the text and the answer has a note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false, so the safety profile is covered. The description itself only restates capabilities and does not add behavioral context such as irreversibility of publishing, visibility/audience consequences, or rate limits; the richer behavioral notes (content_check strictness, server-side image fetching, link-preview fallback) live in the schema rather than the 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 front-loaded sentence naming the action first, followed by a compact capability list. No filler, no redundancy, and the most important information (create a post) leads.
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 7-parameter mutation tool with no output schema, the description covers the main content modes but omits what the call returns (e.g. post ID/URL) and any failure modes or permission requirements. Annotations plus the fully documented schema carry most of the load, leaving this adequate but not complete.
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 schema already documents every parameter in detail (character limits, mention placeholder syntax, page posting, content_check modes). The description adds nothing beyond what the schema provides, so the baseline 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+resource ('Create a LinkedIn post') and then enumerates the supported content modes (text, images, mentions, link cards, reposts). This clearly separates it from siblings like linkedin_comment_on_post and linkedin_react_to_post, which act on existing posts rather than producing new ones.
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?
Usage is only implied: the capability list hints at when to reach for this tool (multi-modal publishing, reposting), and the as_page parameter notes 'Omit it to post as yourself.' There is no explicit when-to-use/when-not guidance, no mention of prerequisites (e.g. needing a connection/page admin), and no named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_companyGet LinkedIn CompanyARead-onlyIdempotentInspect
Get a company's LinkedIn page, for example its website, industry, size, headquarters and follower count. Use this to research one company, for example before a sales call; it does not search for lists of companies by industry or location. Pass identifier (a LinkedIn company URL, slug, or numeric ID) when you know it. If you only know the company name, pass name instead of guessing a slug: LinkedIn slugs often differ from the name. A name returns the company when it is a clear match, otherwise a short list of candidates to choose from. Pacing: a lookup by name runs a LinkedIn company search, and LinkMCP sends at most 3 of these per minute from one account. Look up companies by name one at a time. A company URL, slug or ID needs no search.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The company name (e.g. "Acme Corporation"), when you do not know its LinkedIn URL. Searches LinkedIn through your connected account. Use this or identifier, not both. | |
| identifier | No | LinkedIn company URL (e.g. https://www.linkedin.com/company/acme), company slug (e.g. "acme"), or numeric ID. Use this or name, not both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description adds real operational context beyond them: a rate limit of at most 3 name-based LinkedIn company searches per minute per account. It also discloses the fallback behavior (a name returns a match when clear, otherwise a short candidate list) and the slug-mismatch pitfall, which an agent could not infer from 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?
It is front-loaded with purpose, then usage exclusions, then parameter guidance, then pacing — a logical order. It is somewhat long for a two-parameter tool, and the "one at a time" instruction partially repeats the pacing sentence, costing a 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?
There is no output schema, so the description carries the burden and does so: it names the fields returned and explains the variable-shape case (single match vs. candidate list). Combined with the rate-limit and input-selection guidance, an agent has everything needed to call this 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?
Schema coverage is 100% and the schema already states mutual exclusivity, so the baseline is 3. The description goes further by explaining why to prefer `name` over guessing a slug ("LinkedIn slugs often differ from the name") and what each mode returns, adding genuine decision value rather than restating types.
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 and resource ("Get a company's LinkedIn page") and enumerates the returned attributes (website, industry, size, headquarters, follower count). It also draws an explicit boundary against list/search behavior ("does not search for lists of companies by industry or location"), which separates it from siblings like linkedin_search_sales_navigator or linkedin_bulk_get_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?
It names the concrete use case ("research one company, for example before a sales call") and states when not to use it (list-by-industry/location searching). It further routes the agent between the two input modes and instructs looking up by name one at a time, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_company_postsGet Company PostsARead-onlyIdempotentInspect
Get a company's recent LinkedIn posts by company URL, slug, or numeric ID. Returns up to ~30 posts with text, engagement counts, and post URL.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Continuation cursor from a previous call. Pass this to fetch the next batch of posts. | |
| identifier | Yes | LinkedIn company URL (e.g. https://www.linkedin.com/company/acme), company slug (e.g. "acme"), or numeric ID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds real value by disclosing the ~30-post cap per call and roughly what each post contains (text, engagement counts, URL), which matters because there is no output schema to fall back on.
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, no filler, and the core action and identifier forms are front-loaded before the return summary. Every clause carries 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?
With no output schema, the description does the necessary minimum by sketching the return shape and the per-call cap. Pagination is handled by the cursor field's own schema text, so the remaining gap is only the absence of explicit sibling routing.
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 schema already documents both parameters in detail. The description restates the three accepted identifier formats, which duplicates the identifier field's schema text without adding syntax or validation nuance, and it never mentions the cursor parameter.
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 gives a specific verb and resource ('Get a company's recent LinkedIn posts') plus the identifier forms accepted, which is far more than a restated title. It stops short of explicitly distinguishing itself from the closest siblings (linkedin_get_person_posts, linkedin_get_company), leaving that inference to the agent.
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 when-to-use or when-not-to-use guidance, and no named alternative. The agent must infer from the name alone that company posts are not person posts and that linkedin_get_company is the route for company metadata rather than content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_connectionsGet ConnectionsARead-onlyIdempotentInspect
List your LinkedIn connections (1st-degree). Returns name, headline, profile URL, and public identifier for each connection. Supports cursor-based pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of connections to return per page (1–100, default 50). | |
| cursor | No | Pagination cursor from a previous response. Omit for the first page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, openWorld=true, and destructive=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the exact fields returned (name, headline, profile URL, public identifier) and the cursor-based pagination model. It stops short of noting rate limits or auth requirements, but it clearly exceeds the annotation baseline.
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?
Three short sentences with zero filler: what it does, what it returns, and how pagination works. The most important information (the resource and its 1st-degree scope) is 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?
There is no output schema, but the description compensates by listing the returned fields and explaining the cursor-based pagination, so an agent knows what comes back and how to page. Combined with annotations covering the safety profile, this is nearly complete for a simple list tool; only error or empty-result behavior is unspecified.
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 both parameters (limit, cursor) are already fully documented in the schema. The description reinforces the cursor-pagination concept, which is minor added value, but adds no syntax or defaults beyond what the schema states. Baseline 3 is appropriate when the schema does the heavy lifting.
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 and resource ('List your LinkedIn connections') and scopes it precisely to 1st-degree connections, which distinguishes it from sibling tools like linkedin_get_shared_connections and linkedin_list_connection_requests. It does not explicitly name an alternative tool, but the 1st-degree qualifier makes the resource 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?
Usage is implied by the description (retrieve your own connection list), and the sibling set makes the intent fairly clear. However, there is no explicit when-to-use guidance or contrast with alternatives such as linkedin_search_people or linkedin_get_shared_connections, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_conversation_messagesGet Conversation MessagesARead-onlyIdempotentInspect
Get messages from a LinkedIn DM conversation, newest first. Returns message text, timestamp, sender ID, read status, and attachments. Each message includes the sender's name, and their headline and profile link when LinkedIn provides them. Use linkedin_list_conversations first to get the chat_id. One call returns one page of at most limit messages (default 50, max 250). When has_more is true, older messages exist and the oldest message returned is NOT the start of the conversation: call again with the same chat_id and cursor set to next_cursor, and repeat until has_more is false.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of messages to return per page (1–250, default 50). | |
| cursor | No | Pagination cursor: pass next_cursor from the previous response to get the next page of older messages. Omit for the first page (the most recent messages). | |
| chat_id | Yes | The conversation/chat ID to fetch messages from. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered; the description goes further by disclosing the payload (text, timestamp, sender ID, read status, attachments, sender name/headline/profile link) and, critically, the pagination invariant that a returned page is not necessarily the start of the conversation. That warning is behavioral context not derivable from the schema.
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?
Front-loaded with purpose and return contents, then prerequisites, then pagination. Slightly redundant in restating limit's default 50 / max 250 that the schema already carries, but every sentence otherwise 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?
No output schema exists, so the description carries the return-value burden and does so thoroughly, including field-level contents and the has_more/next_cursor pagination contract. Nothing an agent needs to call this correctly and iterate pages 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 coverage is 100%, so the schema documents limit and cursor adequately and the baseline is 3. The description adds cross-call meaning to cursor by tying it to next_cursor and has_more across repeated calls, which the schema's per-parameter text does not fully convey.
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 resource (messages from a LinkedIn DM conversation) and immediately distinguishes itself from linkedin_list_conversations by naming that tool as the prerequisite for obtaining chat_id. Ordering ('newest first') is front-loaded so the agent knows the shape of the result.
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 routes the agent: 'Use linkedin_list_conversations first to get the chat_id,' and prescribes the exact pagination loop (call again with same chat_id and cursor=next_cursor, repeat until has_more is false). Both the entry condition and the continuation condition are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_jobGet LinkedIn JobARead-onlyIdempotentInspect
Get one LinkedIn job posting by its URL or job ID. Returns the title, company, location, work type (remote, hybrid or on-site), job type, experience level, posted date, number of applicants, the full job description, how to apply, and the hiring team (the people who posted the job, with their LinkedIn profile URLs) when LinkedIn shows them. Fields that LinkedIn does not show for a job are null. Get job URLs from linkedin_search_jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | The LinkedIn job URL (e.g. https://www.linkedin.com/jobs/view/4012345678) or the numeric job ID (e.g. "4012345678"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds behavior the annotations cannot: null for fields LinkedIn does not expose, and that the hiring team is included only 'when LinkedIn shows them'. Useful but not exhaustive about failure modes (e.g. invalid ID or private job).
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?
Three sentences, front-loaded with the core action before the return-field detail. The middle return-value sentence is long but every clause maps to a distinct output field, so little is wasted.
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 no output schema, the description carries the full burden of describing returns, and it enumerates them thoroughly (job fields, apply info, hiring team with profile URLs) plus the null-handling rule. Nothing an agent needs to call or interpret this tool 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% and already documents the 'job' parameter with URL and numeric-ID examples. The description restates the same URL-or-ID duality without adding format, validation, or normalization semantics, so baseline 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 and resource ('Get one LinkedIn job posting') and the exact input forms (URL or job ID). The closing pointer to linkedin_search_jobs distinguishes it from the sibling search tool, so an agent can tell get-one from search-many 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?
Explicitly says where to obtain valid inputs ('Get job URLs from linkedin_search_jobs'), which routes the agent to the alternative for discovery. It does not state when-not to use it, but the get-vs-search context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_my_engagementGet My Engagement ActivityARead-onlyIdempotentInspect
List your own LinkedIn engagement activity (most recent first): comments you wrote (type "comments") or reactions you gave (type "reactions"). Every item carries the permalink of the engaged post (postUrl + activityUrn) - pass either to linkedin_get_post_comments / linkedin_get_post_reactions to see who else engaged. For comments, commentId can be used as parentCommentId in linkedin_get_nested_comments to list replies to your comment; for reactions left on a comment, commentId identifies the comment you reacted to. Paginate by passing the returned cursor back with the same type (cursors are type-specific; the final page may be empty).
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Which engagement activity to list: "comments" (comments you wrote) or "reactions" (reactions you gave). | |
| limit | No | Items per page (1-100). Defaults to 20. | |
| cursor | No | Pagination cursor from a previous response of the same type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely non-obvious behavior beyond that: results are newest-first, cursors are type-specific, and the final page may be empty — all of which affect correct pagination.
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 but front-loaded: the purpose comes first, then the cross-tool linkage, then pagination notes. Every sentence carries actionable information, though the cross-reference chain makes it longer than strictly minimal.
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 no output schema, the description compensates by naming the returned identifiers (postUrl, activityUrn, commentId) and their downstream uses, plus pagination behavior. An agent has everything needed to call it and consume the result 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?
Schema coverage is 100%, so the baseline is 3. The description still adds meaning the schema does not carry: cursors must be replayed with the same 'type' because they are type-specific, and commentId has distinct cross-tool semantics depending on whether the item is a comment or a reaction.
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 and resource ('List your own LinkedIn engagement activity') and immediately narrows scope to the two activity types, with 'most recent first' ordering. It is clearly distinguished from siblings like linkedin_get_post_comments and linkedin_get_post_reactions, which concern other people's engagement rather than your own.
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 routes the agent: pass postUrl/activityUrn to linkedin_get_post_comments or linkedin_get_post_reactions, and use commentId as parentCommentId in linkedin_get_nested_comments to list replies. It names both the alternative tools and the exact condition/data that selects them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_my_saved_itemsGet My Saved LinkedIn ItemsARead-onlyIdempotentInspect
List the posts that the connected user saved on LinkedIn (most recent first). Each item is a short preview: activityUrn, postUrl, author name, headline and profile URL, a text snippet and the relative post time. For the next page, pass nextStart from the previous response as start.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Which saved items to list. Only "posts" is supported. | posts |
| start | No | Offset into the saved-items list for pagination. Use the `nextStart` value from a prior response. Defaults to 0 (first page). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive), so the lower bar applies; the description adds real value on top by specifying sort order and the exact fields each item returns. With no output schema present, documenting the return shape and the nextStart-to-start handshake is meaningful behavioral disclosure.
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?
Three sentences, front-loaded with purpose, then return shape, then pagination. Every sentence earns its place with no redundancy or 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?
With no output schema and only two simple parameters, the description covers purpose, sort order, return fields, and paging, and annotations cover safety. The one small gap is end-of-list behavior (what nextStart is on the final page), but otherwise an agent has what it needs to call and page 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?
Schema description coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description restates the nextStart-to-start pagination flow but adds no format or constraint detail beyond what the schema says, so it does not exceed baseline.
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?
Names a specific verb and resource ('List the posts that the connected user saved on LinkedIn') and adds scope ('most recent first'), which no sibling tool shares. An agent can distinguish it immediately from linkedin_get_my_engagement, linkedin_get_post_comments, and the other list/get tools without opening a schema.
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 purpose implies the use case (retrieve saved posts) and the pagination sentence gives a concrete follow-up action, but there is no explicit when-to-use/when-not guidance or named alternative. This is acceptable given no sibling covers saved items, but the description leaves usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_nested_commentsGet Nested CommentsARead-onlyIdempotentInspect
Get nested comments (replies) under a specific comment on a LinkedIn post. Chain this after linkedin_get_post_comments: pick a comment where replyCount > 0 and pass its commentId here to fetch the replies. Requires a connected LinkedIn account.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Continuation cursor from a previous call. Pass this to fetch the next batch of nested comments. | |
| activityUrn | Yes | The post's activity URN (e.g. "urn:li:activity:7404116397871607808") or a LinkedIn post URL. Obtain from linkedin_get_post_comments or linkedin_get_person_posts output. | |
| parentCommentId | Yes | commentId of the parent comment whose replies you want to fetch. Use a commentId from linkedin_get_post_comments output where replyCount > 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by noting a connected LinkedIn account is required, but it does not disclose pagination behavior or return shape beyond what the cursor schema implies.
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 tight sentences with no waste; the core action is front-loaded, followed immediately by the chaining instruction and the auth prerequisite. 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 read-only nested-comment fetch with full parameter descriptions and strong annotations, the description covers purpose, chaining, and account requirements well. It does not explain return values or pagination, but with a rich input schema and no output schema the remaining gap is minor.
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 schema already documents cursor, activityUrn, and parentCommentId thoroughly. The description reinforces the parentCommentId selection condition (replyCount > 0), but this largely duplicates what the schema already says, so it merits the baseline 3 rather than a higher score.
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 and resource (get nested replies under a specific comment) and explicitly differentiates from the sibling linkedin_get_post_comments by framing itself as the follow-up step. An agent can immediately tell what this tool does and when it applies.
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?
It gives explicit chaining instructions: call this after linkedin_get_post_comments, pick a comment where replyCount > 0, and pass its commentId. This is exactly when-to-use guidance tied to a named sibling, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_person_postsGet Person PostsARead-onlyIdempotentInspect
Get a person's recent LinkedIn posts by profile URL, public ID (slug), or URN. Returns up to ~50 posts with text, engagement counts, and post URL. Use this to see what a prospect or a candidate posts about. For a company's posts, use linkedin_get_company_posts.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Continuation cursor from a previous call. Pass this to fetch the next batch of posts. | |
| identifier | Yes | LinkedIn profile URL (e.g. https://www.linkedin.com/in/john-doe), public ID / slug (e.g. "john-doe"), or URN (e.g. "urn:li:fsd_profile:ABC123"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety behavior is covered. The description adds real value beyond them by disclosing the result shape and volume cap (~50 posts with text, engagement counts, post URL), which matters since there is no output schema. Rate limits or behavior on private/invalid profiles are not mentioned.
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?
Three tight sentences: capability and identifier forms first, return shape second, disambiguation last. No filler and nothing buried.
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 no output schema, the description usefully covers what comes back and the rough page size, and the schema covers pagination. Handling of private profiles, invalid identifiers, or rate limits is left unstated, which is the only real gap for a two-parameter read tool.
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% and the schema already documents both the identifier formats and the cursor continuation semantics. The description's enumeration of URL/slug/URN duplicates the schema rather than extending it, so baseline 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 and resource (get a person's recent posts) and enumerates the accepted identifier forms. It also explicitly separates itself from the sibling company-posts tool, so an agent can pick correctly without opening either schema.
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?
Gives a concrete use case ('see what a prospect or a candidate posts about') and names the alternative for companies. It does not address the other plausible alternative, linkedin_search_posts, so the routing story is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_post_analyticsGet LinkedIn Post AnalyticsARead-onlyIdempotentInspect
Returns engagement metrics (impressions, unique impressions, reactions, comments, reshares, click-through rate, engagement rate) for one of your own LinkedIn posts. Only works for posts authored by the connected LinkedIn account - analytics for other users’ posts are not available.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes | A LinkedIn post URL or activity URN. Accepts /feed/update/urn:li:activity:<id>, /posts/<slug>-activity-<id>-<hash>, or urn:li:activity:<id>. | |
| include_demographics | No | Include top demographics breakdown (seniority, location, industry, etc.) of who viewed the post. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds a meaningful behavioral constraint beyond the annotations: the tool only works on the authenticated user's own posts. It does not mention auth scopes, rate limits, or return shape beyond metric names, so it is not a 5.
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, both front-loaded and information-dense. The metric list is stated first and the ownership restriction follows, with no filler or redundancy.
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 no output schema, the description compensates by enumerating the metrics returned (impressions, reactions, comments, reshares, CTR, engagement rate) and states the critical ownership constraint. Combined with full schema coverage for both parameters and read-only annotations, an agent has everything needed to call it 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?
Schema description coverage is 100%, with the 'post' parameter documenting accepted URL/URN formats and 'include_demographics' documented with a default. The description does not add syntax or format details beyond the schema, so the baseline 3 is appropriate when the schema does the heavy lifting.
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 names a specific verb ('Returns'), the resource ('engagement metrics... for one of your own LinkedIn posts'), and enumerates the exact metrics returned. It clearly distinguishes itself from siblings like linkedin_get_post_comments or linkedin_get_post_reactions by being a metrics tool scoped to the caller's own 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?
It gives a clear usage context and an explicit exclusion: only posts authored by the connected account, and analytics for other users' posts are unavailable. However, it does not name an alternative tool or suggest what to use when the post is not yours, so it falls short of a full when/when-not/alternatives statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_post_commentsGet Post CommentsARead-onlyIdempotentInspect
Get comments on a LinkedIn post. Provide activityUrn (from linkedin_get_person_posts) or a post URL. Returns comment text, commenter profile, and timestamp. For a post whose link contains "ugcPost" or "share", pass the full post URL: the number in it is not an activity number, so do not build urn:li:activity from it.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Continuation cursor from a previous call. Pass this to fetch the next batch of comments. | |
| postUrl | No | LinkedIn post URL (e.g. https://www.linkedin.com/posts/john-doe-...-activity-123-xxxx). Use when activityUrn is not available. | |
| activityUrn | No | Activity URN from a prior linkedin_get_person_posts call (e.g. "urn:li:activity:7139995994070454272"). Preferred over postUrl. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds value on top by disclosing the return payload (comment text, commenter profile, timestamp) and warning against constructing an activity URN from a ugcPost/share URL. Pagination beyond the cursor is not mentioned, but the schema's cursor description covers it.
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?
Purpose is front-loaded, followed by inputs, outputs, then the edge-case warning. Four sentences with essentially no filler. The final sentence is dense but earns its place as a real error-prevention note.
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 no output schema, the description correctly compensates by enumerating the returned fields and by covering both identifier paths plus the URL caveat. Remaining gaps are minor (no note on result ordering or typical batch sizes), and the cursor field in the schema handles paging.
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, but the description adds genuine semantics beyond the schema: it names the origin of activityUrn (linkedin_get_person_posts) and explains the URL-format exception where the embedded number is not an activity ID. That is meaningful guidance the schema does not provide.
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?
Specific verb+resource ('Get comments on a LinkedIn post') with a clearly named input source, so an agent knows exactly what it retrieves. It does not, however, differentiate itself from the close sibling linkedin_get_nested_comments (replies on comments), which risks misrouting.
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?
Gives concrete guidance on when to use each identifier: activityUrn preferred and sourced from linkedin_get_person_posts, postUrl as the fallback. It also flags a specific input trap (URLs containing 'ugcPost'/'share' whose number is not an activity ID), which is real usage guidance, though it never excludes or compares against sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_post_reactionsGet Post ReactionsARead-onlyIdempotentInspect
Get reactions on a LinkedIn post or on a specific comment. Provide activityUrn (from linkedin_get_person_posts) or a post URL. To get reactions on a comment instead of the post, also pass commentId (from linkedin_get_post_comments or linkedin_get_nested_comments output; works for your own comments too - requires a connected LinkedIn account). Returns reactor profiles and reaction types (like, celebrate, support, love, insightful, funny).
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Continuation cursor from a previous call. Pass this to fetch the next batch of reactions. | |
| postUrl | No | LinkedIn post URL (e.g. https://www.linkedin.com/posts/john-doe-...-activity-123-xxxx). Use when activityUrn is not available. | |
| commentId | No | Optional. commentId of a comment on the post (from linkedin_get_post_comments / linkedin_get_nested_comments output). When provided, returns the reactions on that comment instead of the post. Requires a connected LinkedIn account. | |
| activityUrn | No | Activity URN from a prior linkedin_get_person_posts call (e.g. "urn:li:activity:7139995994070454272"). Preferred over postUrl. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive. The description adds real value beyond them: the connected-LinkedIn-account requirement, the fact it works on your own comments, and the shape of the return (reactor profiles plus reaction types). It stops short of detailing pagination behavior, which the cursor param implies.
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?
Front-loaded with the purpose, then two sentences covering parameter sourcing and return content. The parenthetical about own-comments plus account requirement is slightly dense but each clause carries useful 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?
No output schema exists, so the description correctly describes the return content (reactor profiles and reaction types). It covers both invocation modes, identifier sources, and the auth prerequisite, leaving nothing essential for a correct call unstated.
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 schema already documents all four parameters. The description restates which tools supply activityUrn and commentId and adds the 'your own comments' nuance, but adds little syntax or format detail beyond the schema. Baseline 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?
States a specific verb and resource ('Get reactions on a LinkedIn post or on a specific comment') and distinguishes the post-level vs comment-level modes. An agent can tell it apart from siblings like linkedin_get_post_comments or linkedin_react_to_post without opening a schema.
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?
Gives clear branching logic: pass activityUrn or postUrl for the post, add commentId to switch to comment reactions, and names the sibling tools that produce each identifier. It does not explicitly state when to prefer this over related tools (e.g. linkedin_get_my_engagement), but the conditions are well-covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_profileGet LinkedIn ProfileARead-onlyIdempotentInspect
Get one person's LinkedIn profile by URL, public ID (slug), or URN: name, headline, location, about, all positions with descriptions, education, industry, follower and connection counts, and by default the details of their current company. Use this to research a prospect or a candidate, for example before you contact them. To find a person first, use linkedin_search_people; for 2 to 10 profiles at once, use linkedin_bulk_get_profiles.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | LinkedIn profile URL (e.g. https://www.linkedin.com/in/john-doe), public ID / slug (e.g. "john-doe"), or URN (e.g. "urn:li:fsd_profile:ABC123"). | |
| include_main_company_details | No | When true, also fetch the organization from the most recent experience entry that has a company URL. Defaults to true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, open-world, non-destructive behavior, so the bar is lower. The description adds a real behavioral detail beyond them: a second company fetch happens by default, driven by the most recent experience entry with a company URL. It doesn't cover auth or rate-limit characteristics, which keeps it from a 5.
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?
Three sentences, front-loaded with the operation and return surface, then the use case, then the sibling routing. No filler and nothing buried.
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 only two parameters, no output schema, and an annotated read-only profile, the description is complete: it enumerates the returned fields, explains the default side-fetch, and covers retrieval. An agent can call it correctly without further inference.
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 both parameters are already fully documented with examples, and the description adds little beyond restating the identifier forms. The one extra signal is the default-on company lookup, which is also in the schema default.
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 gives a specific verb and resource ('Get one person's LinkedIn profile') and enumerates the returned fields (name, headline, positions, education, counts), so it cannot be mistaken for the company or post tools. It also names the two nearest siblings 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?
It states a concrete use case ('research a prospect or a candidate, for example before you contact them') and explicitly routes agents elsewhere: linkedin_search_people to find a person first, linkedin_bulk_get_profiles for 2 to 10 profiles. When-to-use and alternatives are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_get_profile_viewsGet LinkedIn Profile ViewsARead-onlyIdempotentInspect
Returns the recent viewers of your own LinkedIn profile (the "Who viewed your profile" surface). This is a LinkedIn Premium feature on the connected account - without Premium, LinkedIn returns blurred entries or an empty list. The list is paginated; pass the nextStart value from a prior response as start to fetch the next page. Some entries are aggregated (e.g. "1 person at ", "N people using LinkedIn Recruiter") and have no profile URN.
| Name | Required | Description | Default |
|---|---|---|---|
| start | No | Offset into the viewer list for pagination. Use the `nextStart` value from a prior response. Defaults to 0 (first page). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read/idempotent profile, but the description adds non-obvious behavior: the Premium prerequisite and its blurred/empty fallback, the pagination mechanic, and the fact that some entries are aggregated with no profile URN. These are real traits an agent cannot infer from structured fields.
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?
Front-loads the purpose in the first clause, then adds only high-value caveats (Premium gating, pagination, aggregated entries). Every sentence earns its place with no redundancy.
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 no output schema, the description carries the burden of describing return semantics, and it does so well: aggregated entries without profile URNs and the blurred/empty fallback. An agent has everything needed to call and interpret the tool.
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% and the schema already documents `start` and the nextStart handoff, so the baseline is 3. The description reinforces the pagination contract and ties it to the aggregated-entry behavior, adding modest value beyond the schema text.
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+resource ("Returns the recent viewers of your own LinkedIn profile") and names the exact surface ("Who viewed your profile"). The 'your own profile' scoping cleanly separates it from sibling tools like linkedin_get_profile or linkedin_get_my_engagement.
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?
Gives clear context for use: it is the viewer-list surface on the connected account, and notes the Premium gating that determines whether results are usable. It does not, however, name an alternative tool or state when a sibling would be preferred, so it stops short of explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_company_pagesList Company PagesARead-onlyIdempotentInspect
List the LinkedIn company pages that you administer, with the page_id, name and URL of each page, and whether page messaging is on (when LinkedIn reports it). To publish, schedule, comment or react as a page, pass its page_id as as_page.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description adds meaningful context beyond that: the result set is limited to pages the caller administers, the fields returned, and the caveat that messaging status is only present 'when LinkedIn reports it' — a real data-availability disclosure.
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, zero filler, and the essential scope ('that you administer') is front-loaded before the returned fields and the follow-on hint. Every clause 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?
With no output schema, the description compensates by enumerating the returned fields and flagging the conditional messaging value, which is what an agent needs to consume the result. Minor remaining gap: nothing about result limits or whether the list can be empty if the user administers no pages.
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 takes zero parameters, which is the baseline-4 case. The description correctly notes that page_id values obtained here are the inputs other tools expect via as_page, tying the empty schema to the wider workflow.
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 (list) and resource (LinkedIn company pages) with a scoping qualifier (that you administer), and enumerates the returned fields (page_id, name, URL, messaging flag). This cleanly distinguishes it from sibling reads like linkedin_get_company and linkedin_bulk_get_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 second sentence gives downstream usage guidance — pass page_id as as_page to publish, schedule, comment or react as a page — which is useful but is about what to do after calling, not when to call this rather than another listing tool. No explicit when-not or alternative selection criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_connection_requestsList Connection RequestsARead-onlyIdempotentInspect
List pending LinkedIn connection requests. Use direction "sent" to see outgoing requests you sent, or "received" to see incoming requests from others. Supports cursor-based pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of connection requests to return per page (1–100, default 50). | |
| cursor | No | Pagination cursor from a previous response. Omit for the first page. | |
| direction | No | Direction of connection requests: "sent" (default) for outgoing, "received" for incoming. | sent |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and non-destructive behavior, so the safety profile is covered. The description adds 'pending'-only scoping and cursor-based pagination, but the pagination point largely overlaps the cursor parameter already documented in the schema.
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?
Three short sentences, front-loaded with the core purpose and no filler. The direction sentence duplicates schema information slightly, keeping it from a perfect 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?
For a read-only, zero-required-parameter list tool with 100% schema coverage and full annotations, the description covers purpose, direction semantics, and pagination behavior. A description of return values is the only absent element, and that is minor for a paginated list whose shape is implied.
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 all three parameters are already fully documented, including the direction enum and its default. The description restates the direction semantics without adding format, constraints, or edge-case detail beyond the schema, which is the expected baseline.
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+resource with a clear scope qualifier: 'List pending LinkedIn connection requests'. The word 'pending' implicitly separates it from linkedin_get_connections (accepted connections) and linkedin_manage_connection_request (accept/reject), but no sibling is named explicitly, so it stops short of a 5.
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 explains how to use the direction parameter ('sent' vs 'received'), which is real usage context, but gives no explicit when-to-use-this-vs-alternatives guidance against linkedin_get_connections or linkedin_manage_connection_request. Usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_list_conversationsList ConversationsARead-onlyIdempotentInspect
List the user's LinkedIn message conversations (inbox). Use this when the user asks about their LinkedIn messages: unread messages, who replied, replies from people at a company, or the conversation with one person. Returns conversation ID, timestamp, unread status, the other participant's provider ID, and the LinkedIn thread ID. Each conversation includes the other person's name, and their headline and profile link when LinkedIn provides them, so no profile lookup is needed to see who a conversation is with. Each conversation also includes its last message when LinkedIn provides it: the text (cut to 300 characters), the time, the sender's name and whether you sent it, so you can sort the inbox without opening each conversation. By default it lists your LinkedIn inbox; set inbox to sales_navigator to list your Sales Navigator inbox. Supports cursor-based pagination. Optionally search for conversations with a specific person by providing a participant identifier. To find replies from people at a company or within a period, list the conversations with after (and unread_only if needed) and read each person's headline and last message. Results come in pages: when has_more is true, more conversations exist; call again with the same arguments and cursor set to next_cursor. Pacing: each page of results counts toward a daily limit of inbox reads. To check for new messages, pass after with the time of your last check: such a call usually reads one page.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only return conversations updated after this time (exclusive). ISO 8601 date or datetime, for example 2026-08-15 or 2026-08-15T09:30:00Z. A date or time without an offset is read as UTC. | |
| inbox | No | Which inbox to list: classic (your LinkedIn messages, the default) or sales_navigator (your Sales Navigator messages; the connected LinkedIn account needs Sales Navigator). Use the same value with cursor. | |
| limit | No | Number of conversations to return per page (1–250, default 20). Ignored when participant is provided. | |
| before | No | Only return conversations updated before this time (exclusive). ISO 8601 date or datetime, for example 2026-08-15 or 2026-08-15T09:30:00Z. A date or time without an offset is read as UTC. | |
| cursor | No | Pagination cursor from a previous response. Omit for the first page. | |
| participant | No | Find conversations with a specific person. Provide a LinkedIn profile URL, public ID, URN, or numeric ID. Each call scans only your most recent conversations to find matching threads. Other filters (unread_only, after, before) still apply. Use cursor to continue scanning if not found. | |
| unread_only | No | If true, return only conversations with unread messages. If false, return only read conversations. Omit to return all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses two non-obvious traits: a daily limit on inbox reads that each page consumes, and that participant search only scans recent conversations, requiring cursor to continue scanning. It also notes last-message text is truncated to 300 characters and that fields appear only 'when LinkedIn provides' them. It stops short of describing rate-limit numbers or failure modes, but the behavioral coverage is well above the annotation baseline.
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?
Front-loaded with purpose, then use cases, then return shape, then pagination and pacing – a sensible order. It runs long at eight sentences and a couple of clauses are justificatory filler ('so no profile lookup is needed', 'so you can sort the inbox'), but nothing is genuinely off-topic.
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?
Covers everything an agent needs for a 7-parameter, zero-required read tool with no output schema: what comes back per conversation, how paging terminates, how polling works, the quota cost, and the scan limit on participant search. No material gap remains.
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?
With 100% schema coverage the baseline is 3, but the description adds cross-parameter meaning the schema only states individually: switching inbox to sales_navigator, carrying the same inbox value alongside cursor, combining participant with unread_only/after/before, and using after as the polling anchor. These combinations are the practically hard part of calling this tool correctly.
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 and resource (list the user's LinkedIn message conversations / inbox) and enumerates the concrete questions it answers (unread messages, who replied, replies from a company, one person's thread). It also distinguishes itself from reading messages by promising last-message text and participant headline so 'no profile lookup is needed' and the inbox can be sorted 'without opening each conversation.'
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?
Gives explicit when-to-use triggers tied to user phrasing, names the recipe for company/period reply hunting (list with after, optionally unread_only, then read headline and last message), and covers pagination continuation with the same arguments plus next_cursor. It even prescribes the polling pattern: pass after with the time of your last check, which usually reads one page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_manage_connection_requestManage Connection RequestADestructiveInspect
Manage a LinkedIn connection request retrieved from linkedin_list_connection_requests. For received requests (direction "received"), accept or decline - pass the shared_secret returned by the list. For sent requests (direction "sent"), withdraw to cancel the pending invitation - shared_secret is not required for withdraw.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to take. "accept" or "decline" for received requests (direction "received"). "withdraw" to cancel a pending outgoing invitation (direction "sent"). | |
| shared_secret | No | The shared_secret from linkedin_list_connection_requests (received). Required for "accept" and "decline". Not needed for "withdraw". | |
| connection_request_id | Yes | The connection request ID from linkedin_list_connection_requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, and openWorldHint=true, so the mutation and irreversibility profile is covered structurally. The description's main addition - the shared_secret requirement per action - is essentially duplicated in the schema, and it adds nothing about error behavior or reversibility 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?
Two tight sentences, front-loaded with the source-of-truth list tool, then split cleanly by direction. Every clause earns its place with no redundancy or 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?
For a 3-parameter mutation tool with a full schema and safety annotations, the description supplies the workflow context (list first, then act by direction) an agent needs. It omits success/failure semantics and reversibility, but those are largely implied by the destructiveHint annotation and no output schema is expected.
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 schema already documents connection_request_id, action, and shared_secret, including the enum values and the shared_secret requirement per action. The description restates the same shared_secret/direction logic without adding syntax or format detail, so the baseline 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 gives a specific verb set (accept, decline, withdraw) against a specific resource (a LinkedIn connection request) and anchors the resource's origin to linkedin_list_connection_requests. An agent can distinguish this management tool from the sibling list tool and the send tool without opening any schema.
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?
It clearly states where the input comes from (linkedin_list_connection_requests) and which action applies to each direction, effectively routing received vs sent cases. It stops short of naming an explicit alternative or exclusion (e.g. use linkedin_send_connection_request to create one), so it is strong context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_mark_conversation_readMark Conversation ReadAIdempotentInspect
Mark a LinkedIn conversation as read, clearing its unread badge on LinkedIn. Reading messages via linkedin_get_conversation_messages does not clear it. Use linkedin_list_conversations to get the chat_id.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | The conversation ID to mark as read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false, and readOnlyHint=false, so the safety profile is covered. The description adds the observable side effect (clearing the unread badge) and clarifies that a sibling read operation won't produce it, though it says nothing about permissions or failure modes.
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?
Three short sentences, front-loaded with the action and effect, followed by the disambiguation and the sourcing hint. 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?
For a single-parameter write tool whose annotations already cover idempotency and destructiveness, the description supplies the action, effect, sibling distinction, and ID provenance. Nothing needed to invoke it correctly 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 coverage is 100%, so chat_id is already documented, making the baseline 3. The description adds provenance value by telling the agent to use linkedin_list_conversations to get the chat_id, which is beyond what the schema states.
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 and resource ('Mark a LinkedIn conversation as read') plus the concrete effect ('clearing its unread badge'), and distinguishes itself from linkedin_get_conversation_messages by noting that reading does not clear the badge.
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 routes the agent: use this to clear the unread state, and it names the sibling that does NOT achieve this ('Reading messages via linkedin_get_conversation_messages does not clear it'), plus tells the agent how to obtain the chat_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_react_to_postReact to PostBDestructiveInspect
React to a LinkedIn post or to a comment on it (like, celebrate, support, love, insightful, funny), as yourself or as a company page that you administer.
| Name | Required | Description | Default |
|---|---|---|---|
| as_page | No | Optional. React as a LinkedIn company page that you administer: the page_id from linkedin_list_company_pages. Omit it to react as yourself. | |
| post_id | No | Activity URN (urn:li:activity:123) or numeric activity ID. Use post_url or post_id, at least one is required. | |
| post_url | No | LinkedIn post URL (e.g. https://www.linkedin.com/feed/update/urn:li:activity:123 or /posts/ style). | |
| comment_id | No | Optional. React to a specific comment instead of the post itself. | |
| reaction_type | No | Reaction type (default: "like"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false and openWorldHint=true, so the safety profile is carried structurally. The description adds the acting-identity distinction (yourself vs a page you administer), which is real context, but says nothing about whether an existing reaction is replaced or how to undo one — a meaningful gap given idempotentHint=false and destructiveHint=true.
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 front-loaded sentence that leads with the verb and resource; nothing is padded. The parenthetical reaction list duplicates the schema enum and is the one element that does not earn 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?
With 0 required parameters, full schema coverage and annotations supplying the safety profile, the description covers the essentials for a small write tool. It still omits the 'at least one of post_id or post_url is required' constraint and the replace-vs-add behavior of an existing reaction, which are the main things an agent could get wrong.
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 every parameter is documented in the schema, including the post_id/post_url alternative and the as_page flow. The description only restates the reaction enum and the self/page option, adding no semantics the schema does not already carry, 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?
The description states a specific verb (React) and resource (a LinkedIn post or a comment on it), and enumerates the reaction types, so the operation is unmistakable. It implicitly differentiates from siblings like linkedin_comment_on_post and the read-only linkedin_get_post_reactions, but never names them or states the contrast explicitly.
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 when-to-use guidance, no statement of when to prefer this over linkedin_comment_on_post, and no prerequisites called out. The only routing hint (that as_page requires a page_id from linkedin_list_company_pages) lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_search_jobsSearch LinkedIn JobsARead-onlyIdempotentInspect
Search open LinkedIn job postings by keywords and/or a region. To see one company's open roles, put the company name in the keywords with the role (for example "Stripe account executive"). Optional filters: work type (remote, hybrid, on-site), job type, experience level, date posted, Easy Apply only, and under 10 applicants. To find remote jobs, use work_type ["remote"], not the word "remote" in the keywords. Returns each posting with its title, company (and company page), location, work type, posted date, and a link to the job. A location value (e.g., "Slovenia", "Berlin") is resolved to a LinkedIn region automatically. Useful for sourcing open roles or tracking hiring activity in a market. Pass the returned cursor to get more results of the same search, with the same filters. Pacing: to protect your LinkedIn account, LinkMCP sends at most 3 searches per minute from it (people, Sales Navigator and job searches share this). Send searches one at a time. Searches sent in parallel wait in line, or are refused with the time to wait.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | Pagination cursor from a previous response. Pass this to fetch the next page of results. | |
| sort_by | No | The order of the results: "relevance" (default) or "date" (newest first). | |
| job_type | No | Only jobs with these job types: "full_time", "part_time", "contract", "temporary", "internship", "volunteer", "other". Example: ["full_time", "contract"]. | |
| keywords | No | Job search keywords (e.g., "software engineer", "sales manager"). | |
| location | No | Region or location to search in (e.g., "Slovenia", "London"). Resolved to a LinkedIn region automatically. | |
| work_type | No | Only jobs with these work types: "remote", "hybrid", "on_site". Example: ["remote"]. | |
| easy_apply | No | true = only jobs that you can apply to on LinkedIn (Easy Apply). | |
| date_posted | No | Only jobs posted in this period: "past_day" (the last 24 hours), "past_week" or "past_month". | |
| experience_level | No | Only jobs for these experience levels: "internship", "entry_level", "associate", "mid_senior", "director", "executive". | |
| under_10_applicants | No | true = only jobs with fewer than 10 applicants. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, but the description adds genuinely new behavior: a hard pacing limit of 3 searches per minute shared across people, Sales Navigator and job searches, plus the consequence that parallel calls queue or are refused with a wait time. It also discloses the returned fields and pagination-cursor behavior, which no annotation covers.
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 core purpose and the routing hints are front-loaded, and the pacing warning is placed as a clearly delineated final paragraph. A few sentences are lower value, notably "Useful for sourcing open roles or tracking hiring activity in a market," which restates the obvious for a search 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?
With 10 optional parameters, no output schema and no required fields, the description covers everything an agent needs: what to pass, how filters interact with the keyword field, what comes back, how to paginate, and the throttling constraints that can cause failures. Nothing material for correct invocation is left unstated.
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, and the description earns an extra point by adding meaning the schema lacks: that a location string is auto-resolved to a LinkedIn region, and that the cursor must be reused with identical filters to continue the same search. It does not explain the interaction between sort_by and the other filters, which keeps it below 5.
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?
"Search open LinkedIn job postings by keywords and/or a region" is a specific verb plus resource, and 'job postings' cleanly separates it from linkedin_search_people, linkedin_search_posts and the single-record linkedin_get_job. The added example ("Stripe account executive") makes the scope concrete rather than tautological.
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?
It states when to use this tool versus workarounds explicitly: to see one company's roles, put the company name in keywords; to find remote jobs, use work_type ["remote"] rather than the word 'remote'. It also names the shared rate budget with people and Sales Navigator searches and instructs sequential calling, so the agent knows both the correct and incorrect invocation patterns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_search_peopleSearch PeopleARead-onlyIdempotentInspect
Search LinkedIn for people with the user's own LinkedIn account (LinkedIn's people search; no Sales Navigator needed). Use this to find prospects, candidates or contacts by job title, company, skill or location, or to find who holds a role at a company. Put titles, company names and skills in keywords (for example "Head of Procurement Bosch"). You can also pass a LinkedIn people-search URL. Returns name, headline, location, profile URL, and network distance for each result; for a full profile, use linkedin_get_profile. For seniority, function or years-of-experience filters, use linkedin_search_sales_navigator. Text filter values (e.g., "San Francisco" for location) are resolved to LinkedIn IDs automatically. total_count is the number of matches LinkedIn reports, or null when LinkedIn does not report a total; use cursor to get more results. Pacing: to protect your LinkedIn account, LinkMCP sends at most 3 searches per minute from it (people, Sales Navigator and job searches share this). Send searches one at a time. Searches sent in parallel wait in line, or are refused with the time to wait.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | LinkedIn search URL (e.g., https://www.linkedin.com/search/results/people/?keywords=...). Mutually exclusive with keywords/filters. | |
| cursor | No | Pagination cursor from a previous response. Pass this to fetch the next page of results. | |
| industry | No | Industry filter as text values (e.g., ["Software Development"]). Resolved to LinkedIn IDs automatically. | |
| keywords | No | Search keywords (e.g., "sales director"). Required for filter-based search, unless connections_of is given. | |
| location | No | Location filter as text values (e.g., ["San Francisco Bay Area"]). Resolved to LinkedIn IDs automatically. | |
| connections_of | No | Only people who are connections of this one person (LinkedIn's "Connections of" filter). Give the person's LinkedIn profile URL (e.g., https://www.linkedin.com/in/john-doe), public ID (e.g., "john-doe") or member ID (e.g., "ACoAA..."). Keywords are optional with this filter. Add network_distance [2] to skip people you are already connected to. LinkedIn returns no one when the person hides their connection list. | |
| network_distance | No | Network distance filter (1=1st connections, 2=2nd connections, 3=3rd+). | |
| profile_language | No | Profile language filter as ISO codes (e.g., ["en", "de"]). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, open-world safety profile, but the description adds material behavior the annotations cannot convey: a hard pacing limit of 3 searches/minute shared across people, Sales Navigator and job searches, the instruction to send searches serially, and the consequence that parallel calls queue or are refused with a wait time. It also explains that text filters are resolved to LinkedIn IDs and that total_count may be null.
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?
Front-loaded with purpose and routing, then parameters, then return values, then pacing — a logical order with no filler sentences. It is dense and fairly long, but nearly every clause carries operational value; the packing example and pacing paragraph are the only candidates for trimming.
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 an 8-parameter, zero-required, no-output-schema search tool, the description covers invocation strategy, return fields, pagination via cursor, null-total semantics, and account-safety constraints. An agent has everything needed to call it correctly and safely without further 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics beyond the schema: example keyword packing ("Head of Procurement Bosch"), that a raw people-search URL can be passed instead of filters, that text filters are auto-resolved to IDs, and how connection_of combines with network_distance and optional keywords. It does not cover industry or profile_language, hence not a 5.
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 and resource (LinkedIn people search) and immediately scopes it: the user's own account, no Sales Navigator needed. It distinguishes itself from linkedin_get_profile and linkedin_search_sales_navigator by name, so an agent can route correctly without opening any schema.
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?
Explicit when-to-use cases are given (prospects, candidates, contacts by title/company/skill/location, who holds a role at a company), plus explicit alternatives: linkedin_get_profile for full profiles and linkedin_search_sales_navigator for seniority/function/years-of-experience filters. This is genuine when-and-when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_search_postsSearch LinkedIn PostsARead-onlyIdempotentInspect
Search LinkedIn posts by keywords, for example to find people who ask for a service, announce hiring, or post about a topic. Optional filters: date posted (past day, week or month) and the order (relevance, or LinkedIn's "Latest" order with recent posts first). Returns up to 10 posts per call: each with its activityUrn and postUrl, the author (name, headline, profile link, person or company), the post text (up to 1,000 characters), reaction, comment and repost counts, and the date posted. To see who reacted or commented, pass a post's activityUrn (or its postUrl when activityUrn is missing) to linkedin_get_post_reactions or linkedin_get_post_comments. LinkedIn also returns loosely related posts: keywordsInText is true only when the post text contains every keyword (or one of them, for keywords joined with OR). Put an exact phrase in double quotes. Pass nextCursor to get the next page of the same search.
| Name | Required | Description | Default |
|---|---|---|---|
| cursor | No | nextCursor from a previous answer, to get the next page of the same search. With a cursor, the other inputs are not used. | |
| sort_by | No | The order of the results: "relevance" (default) or "date" (LinkedIn's "Latest" order, with recent posts first). | |
| keywords | No | The words to find in LinkedIn posts, for example "hiring SDR" or "looking for a marketing agency". Put an exact phrase in double quotes. At most 200 characters. Needed for a new search. | |
| date_posted | No | Only posts from this period: "past_day" (the last 24 hours), "past_week" or "past_month". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark this as a read-only, idempotent, open-world operation, so the description's job is to add behavior on top. It does so: a 10-post per-call cap, the exact returned fields, the caveat that LinkedIn returns loosely related posts, and how keywordsInText is computed. That is material behavior an agent could not infer from the structured fields.
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 purpose, then filters, then return shape, then follow-up routing. Nearly every sentence earns its place, though the return-value enumeration is dense enough that an agent must read to the end to find the useful pagination note.
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?
No output schema exists, so the description must describe results, and it does: per-post fields, the 10-post limit, and the caveat about loosely related matches. Pagination, filtering, and downstream tool routing are all covered, so nothing needed to call it correctly 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 coverage is 100%, so the schema already documents all four parameters. The description still adds matching semantics, namely that keywordsInText is true only when the post text contains every keyword (or one of several joined with OR) and how exact phrases work, which meaningfully shapes how the agent writes queries.
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?
A specific verb plus resource ('Search LinkedIn posts by keywords') is followed by three concrete use cases (finding people asking for a service, hiring announcements, topical posts). That is enough to separate it from siblings like linkedin_search_people, linkedin_search_jobs, and linkedin_get_company_posts without opening any schema.
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 usage context, routes the agent to linkedin_get_post_reactions and linkedin_get_post_comments for follow-up detail, and explains when to pass nextCursor. It stops short of an explicit 'do not use this for X' exclusion, such as distinguishing it from search_people or company posts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_send_connection_requestSend Connection RequestBDestructiveInspect
Send a LinkedIn connection request to a person. Accepts any identifier: profile URL, public ID (slug), or URN. Optionally include a personalized message (max 300 characters).
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Optional personalized message (max 300 characters). Leave empty for a default connection request. | |
| identifier | Yes | LinkedIn profile URL (e.g. https://www.linkedin.com/in/john-doe), public ID / slug (e.g. "john-doe"), or URN (e.g. "urn:li:fsd_profile:ABC123"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=true, openWorld=true, and idempotent=false, so the write/irreversibility profile is covered. The description adds useful detail on accepted identifier formats and the 300-character message cap, but says nothing about rate limits, duplicate/pending-request behavior, or auth needs that annotations don't 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?
Three tight sentences, front-loaded with the core action and with no filler. It is appropriately sized, though the identifier-format sentence slightly duplicates the schema.
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 no output schema and a mutation tool, the description does not state what the agent should expect on success or failure (e.g., pending vs. failed request), nor how it relates to manage/list connection request siblings. It is adequate for invocation but leaves behavioral gaps for a destructive, non-idempotent action.
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 both parameters are fully documented in the schema, including identifier formats and the 300-character limit. The description largely restates this, adding no syntax or format meaning beyond what the schema already provides, so the baseline 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 states a specific verb and resource ('Send a LinkedIn connection request to a person'), which is unambiguous. However, it does not differentiate itself from the sibling linkedin_manage_connection_request, which likely also touches connection requests, so an agent must infer the split.
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?
No when-to-use guidance is given. There is no mention of when to prefer this over linkedin_manage_connection_request (e.g., for accepting or withdrawing), nor any prerequisite such as being logged in or not already being connected. Usage is only implied by the verb 'send'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_send_messageSend MessageADestructiveInspect
Send a LinkedIn message from the user's own account. Use this to write to a person (pass recipient_identifier: their profile URL, public ID or URN) or to reply in an existing conversation (pass chat_id from linkedin_list_conversations). Supports InMail for people who are not connections. A Sales Navigator InMail (linkedin_api: sales_navigator) has a subject line: pass subject, or LinkMCP uses the first words of the message. A new conversation returns its chat_id, so you can reply in it later.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Message text. Must not be empty. | |
| inmail | No | Send as InMail for non-connections. Only with recipient_identifier. | |
| chat_id | No | Chat ID for replying to existing conversation. Mutually exclusive with recipient_identifier. | |
| subject | No | Subject line of a Sales Navigator InMail (linkedin_api: sales_navigator). Only with recipient_identifier. If you leave it out, LinkMCP uses the first words of the message (up to 60 characters). Other messages have no subject. | |
| linkedin_api | No | LinkedIn API to use. Only with recipient_identifier. | |
| recipient_identifier | No | LinkedIn profile URL, public ID, or URN. For starting a new conversation. Mutually exclusive with chat_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and idempotentHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: InMail eligibility for non-connections, the automatic subject derivation (first words of the message, up to 60 characters) when subject is omitted, and that a new conversation returns a chat_id for later replies. It does not mention irreversibility of a sent message or any rate limiting, which keeps it from a 5.
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 definition is front-loaded with purpose and mode selection, then moves to the Sales Navigator edge case and the return value. Nearly every sentence carries information, though the subject-derivation rule is stated twice (description and schema), which is mild waste.
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 six-parameter mutation tool with no output schema, the description covers both call paths, the InMail/Sales Navigator special case, and the returned chat_id. What remains unaddressed is failure behavior — what happens when InMail is unavailable or the recipient cannot be resolved — which would help an agent recover from errors.
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, but the description adds meaning on top: it enumerates the accepted forms of recipient_identifier (profile URL, public ID, URN), ties chat_id to its source tool, and scopes subject to Sales Navigator InMail only while explaining the fallback. The duplication of the subject fallback with the schema text is the only 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 first sentence gives a specific verb and resource (send a LinkedIn message) scoped to the user's own account. It then explicitly separates the two operating modes — new message to a person vs. reply in an existing chat — and names the sibling tool (linkedin_list_conversations) that supplies the chat_id. An agent can distinguish this from linkedin_send_connection_request or linkedin_comment_on_post without opening the schema.
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?
It clearly routes between the two modes: pass recipient_identifier to write to a person, pass chat_id to reply, and the schema confirms they are mutually exclusive. It also flags InMail as the path for people who are not connections. It stops short of naming alternatives for the non-connected case (e.g. sending a connection request first) or stating when not to send at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_who_am_iWho Am IARead-onlyIdempotentInspect
Returns information about the connected LinkedIn account: display name, public profile URL, LinkedIn URN, and which premium features are active (Sales Navigator, Recruiter). Use this to understand which LinkedIn capabilities are available before choosing search or messaging strategies.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real behavioral value by disclosing the return contents, especially the premium-feature flags (Sales Navigator, Recruiter), which determine which other tools will work — useful 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?
Two sentences, front-loaded with the return payload and ending with actionable guidance. No filler; every clause 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?
With no output schema present, the description correctly carries the return-value burden and enumerates the key fields. It is complete for a no-parameter identity/capability probe, though it could note whether the premium flags can be empty when no subscription is active.
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 takes zero parameters, so the baseline is 4. There is nothing parameter-related to clarify.
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 ('Returns') plus the resource (information about the connected LinkedIn account) and enumerates exactly what is returned: display name, profile URL, URN, and active premium features. This is unmistakably distinct from every sibling, none of which report account identity.
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?
Provides clear when-to-use guidance ('Use this to understand which LinkedIn capabilities are available before choosing search or messaging strategies'), which routes the agent correctly relative to the search/messaging siblings. It stops short of naming specific alternative tools, so it is clear context rather than explicit alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_feedbackSend FeedbackADestructiveInspect
Send the user's feedback, feature request, bug report or help request to the LinkMCP team. Use it only when the user asks to send feedback or to contact LinkMCP support.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | The type of feedback: "feedback" for general thoughts, "feature_request" for new feature ideas, "bug_report" for something broken, "help" for support requests. | |
| context | No | Optional context for the feedback. For bug reports, include the tool name, error message, and what you were trying to do. | |
| message | Yes | Your feedback message. Be as detailed as you like - the more context, the better we can help. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the write/submit nature is conveyed structurally. The description adds the destination ("LinkMCP team") and a user-consent guardrail, but it does not explain the odd destructiveHint for what is a submission tool, whether submission is reversible, or what confirmation the caller receives. With annotations covering the safety profile, this modest added context merits a 3.
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 tight sentences with zero redundancy, purpose first and the usage restriction second. Every clause 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 three-parameter submission tool with no output schema and full schema coverage, the description supplies purpose and the when-to-use guardrail that the structured fields cannot. It stops short of describing post-submission behavior (confirmation or acknowledgement), a minor gap rather than a blocking one.
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 type/message/context are fully documented in the schema, including per-enum meanings and nested context fields. The description only echoes the enum values already listed in the schema, adding no syntax, format, or sizing guidance beyond it. Baseline 3 applies when the schema does the heavy lifting.
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?
Specific verb+resource+destination: "Send the user's feedback, feature request, bug report or help request to the LinkMCP team." This is unmistakably distinct from every sibling, which are all LinkedIn data/action tools. An agent can identify the operation without opening the schema.
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?
"Use it only when the user asks to send feedback or to contact LinkMCP support" gives an explicit trigger and an implicit exclusion (do not use proactively). It does not name alternatives, but no sibling is a plausible substitute for this tool, so the omission is harmless.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_emailValidate EmailARead-onlyIdempotentInspect
Check whether an email address can receive mail. Returns valid, invalid, catch-all or unknown, with the mail provider (MX) details.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address to validate (e.g. "john@company.com"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds real value beyond them by disclosing the result taxonomy (valid/invalid/catch-all/unknown) and that MX provider details are returned, which tells the agent what to expect from the external lookup.
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 compact sentences, front-loaded with the validation purpose and followed by the return values; nothing is redundant or padded.
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 no output schema, the description carries the return-value burden and does so adequately by naming the four result states and MX details. It stops short of explaining what 'catch-all' or 'unknown' mean or any timeout/rate behavior of the external lookup, a minor gap.
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?
Only one parameter and schema description coverage is 100%, so the schema fully documents the address and its example. The description adds no format or syntax detail beyond that, which is the expected baseline.
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 and resource ('Check whether an email address can receive mail') and enumerates the possible outcomes, so an agent can tell it apart from discovery siblings like find_email without opening the schema.
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 purpose makes the use case implicit (verify deliverability before sending or storing an address), but there is no explicit when-to-use guidance, no mention of when not to use it, and no named alternative such as find_email.
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.
1 tool update
- Added
linkedin_search_posts
1 tool update
- Changed
linkedin_search_people2 fields changed- added
Input schema / properties / connections_ofAdded value: +{ + "description": "Only people who are connections of this one person (LinkedIn's \"Connections of\" filter). Give the person's LinkedIn profile URL (e.g., https://www.linkedin.com/in/john-doe), public ID (e.g., \"john-doe\") or member ID (e.g., \"ACoAA...\"). Keywords are optional with this filter. Add network_distance [2] to skip people you are already connected to. LinkedIn returns no one when the person hides their connection list.", + "type": "string" +} - changed
Input schema / properties / keywords / descriptionPrevious value: -"Search keywords (e.g., \"sales director\"). Required for filter-based search."New value: +"Search keywords (e.g., \"sales director\"). Required for filter-based search, unless connections_of is given."
2 tool updates
- Changed
linkedin_list_conversations1 field changed- added
Input schema / properties / inboxAdded value: +{ + "description": "Which inbox to list: classic (your LinkedIn messages, the default) or sales_navigator (your Sales Navigator messages; the connected LinkedIn account needs Sales Navigator). Use the same value with cursor.", + "enum": [ + "classic", + "sales_navigator" + ], + "type": "string" +}
- Changed
linkedin_send_message1 field changed- added
Input schema / properties / subjectAdded value: +{ + "description": "Subject line of a Sales Navigator InMail (linkedin_api: sales_navigator). Only with recipient_identifier. If you leave it out, LinkMCP uses the first words of the message (up to 60 characters). Other messages have no subject.", + "type": "string" +}
2 tool updates
- Changed
linkedin_get_my_saved_items1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Which saved-items section to fetch. Currently only \"posts\" is supported (more variants - jobs, learning, projects - may be added later)."New value: +"Which saved items to list. Only \"posts\" is supported."
- Changed
linkedin_search_sales_navigator2 fields changed- changed
Input schema / properties / tenure / items / properties / max / descriptionPrevious value: -"Maximum years at current company."New value: +"Maximum total years of work experience." - changed
Input schema / properties / tenure / items / properties / min / descriptionPrevious value: -"Minimum years at current company."New value: +"Minimum total years of work experience."
2 tool updates
- Added
linkedin_get_job - Changed
linkedin_search_jobs7 fields changed- added
Input schema / properties / date_postedAdded value: +{ + "description": "Only jobs posted in this period: \"past_day\" (the last 24 hours), \"past_week\" or \"past_month\".", + "enum": [ + "past_day", + "past_week", + "past_month" + ], + "type": "string" +} - added
Input schema / properties / easy_applyAdded value: +{ + "description": "true = only jobs that you can apply to on LinkedIn (Easy Apply).", + "type": "boolean" +} - added
Input schema / properties / experience_levelAdded value: +{ + "description": "Only jobs for these experience levels: \"internship\", \"entry_level\", \"associate\", \"mid_senior\", \"director\", \"executive\".", + "items": { + "enum": [ + "internship", + "entry_level", + "associate", + "mid_senior", + "director", + "executive" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / job_typeAdded value: +{ + "description": "Only jobs with these job types: \"full_time\", \"part_time\", \"contract\", \"temporary\", \"internship\", \"volunteer\", \"other\". Example: [\"full_time\", \"contract\"].", + "items": { + "enum": [ + "full_time", + "part_time", + "contract", + "temporary", + "internship", + "volunteer", + "other" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / sort_byAdded value: +{ + "description": "The order of the results: \"relevance\" (default) or \"date\" (newest first).", + "enum": [ + "relevance", + "date" + ], + "type": "string" +} - added
Input schema / properties / under_10_applicantsAdded value: +{ + "description": "true = only jobs with fewer than 10 applicants.", + "type": "boolean" +} - added
Input schema / properties / work_typeAdded value: +{ + "description": "Only jobs with these work types: \"remote\", \"hybrid\", \"on_site\". Example: [\"remote\"].", + "items": { + "enum": [ + "remote", + "hybrid", + "on_site" + ], + "type": "string" + }, + "type": "array" +}
2 tool updates
- Changed
find_mobile2 fields changed- changed
Input schema / properties / email / descriptionPrevious value: -"Email address (alternative or additional identifier for the person)."New value: +"The person's email address. Used only to identify the person, for example when you have no LinkedIn profile URL." - changed
Input schema / properties / linkedin_profile / descriptionPrevious value: -"LinkedIn profile URL (e.g. \"https://linkedin.com/in/johndoe\"), slug (e.g. \"johndoe\"), or URN."New value: +"The person's LinkedIn profile URL (e.g. \"https://linkedin.com/in/johndoe\") or slug (e.g. \"johndoe\")."
- Changed
linkedin_list_conversations1 field changed- changed
Input schema / properties / participant / descriptionPrevious value: -"Find conversations with a specific person. Provide a LinkedIn profile URL, public ID, URN, or numeric ID. Scans up to 1250 recent conversations to find matching threads. Other filters (unread_only, after, before) still apply. Use cursor to continue scanning if not found."New value: +"Find conversations with a specific person. Provide a LinkedIn profile URL, public ID, URN, or numeric ID. Each call scans only your most recent conversations to find matching threads. Other filters (unread_only, after, before) still apply. Use cursor to continue scanning if not found."
2 tool updates
- Changed
linkedin_create_post1 field changed- changed
Input schema / properties / external_link / descriptionPrevious value: -"Optional URL for a link preview card. Must also appear in the post text."New value: +"Optional URL for a link preview card. Must also appear in the post text. If a preview is not available, the link stays in the text and the answer has a note."
- Changed
linkedin_search_sales_navigator1 field changed- changed
Input schema / properties / tenure / descriptionPrevious value: -"Tenure at current company filter as ranges in years (e.g., [{\"min\": 1, \"max\": 3}]). Sales Navigator only."New value: +"Total years of work experience (at all companies, not only the current one) as ranges in years (e.g., [{\"min\": 1, \"max\": 3}]). Sales Navigator only."
4 tool updates
- Changed
linkedin_comment_on_post1 field changed- added
Input schema / properties / as_pageAdded value: +{ + "description": "Optional. Post the comment as a LinkedIn company page that you administer: the page_id from linkedin_list_company_pages. Omit it to comment as yourself.", + "type": "string" +}
- Changed
linkedin_create_post1 field changed- added
Input schema / properties / as_pageAdded value: +{ + "description": "Optional. Publish the post as a LinkedIn company page that you administer: the page_id from linkedin_list_company_pages. The post is public under the page name, not under your name. Omit it to post as yourself.", + "type": "string" +}
- Added
linkedin_list_company_pages - Changed
linkedin_react_to_post1 field changed- added
Input schema / properties / as_pageAdded value: +{ + "description": "Optional. React as a LinkedIn company page that you administer: the page_id from linkedin_list_company_pages. Omit it to react as yourself.", + "type": "string" +}
2 tool updates
- Changed
linkedin_get_my_saved_items1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Which saved-items section to fetch. Currently only \"posts\" is supported (more variants — jobs, learning, projects — may be added later)."New value: +"Which saved-items section to fetch. Currently only \"posts\" is supported (more variants - jobs, learning, projects - may be added later)."
- Changed
send_feedback1 field changed- changed
Input schema / properties / message / descriptionPrevious value: -"Your feedback message. Be as detailed as you like — the more context, the better we can help."New value: +"Your feedback message. Be as detailed as you like - the more context, the better we can help."
33 tool updates
- First observed
find_email - First observed
find_mobile - First observed
linkedin_bulk_get_companies - First observed
linkedin_bulk_get_profiles - First observed
linkedin_comment_on_post - First observed
linkedin_create_post - First observed
linkedin_get_company - First observed
linkedin_get_company_posts - First observed
linkedin_get_connections - First observed
linkedin_get_conversation_messages - First observed
linkedin_get_my_engagement - First observed
linkedin_get_my_saved_items - First observed
linkedin_get_nested_comments - First observed
linkedin_get_person_posts - First observed
linkedin_get_post_analytics - First observed
linkedin_get_post_comments - First observed
linkedin_get_post_reactions - First observed
linkedin_get_profile - First observed
linkedin_get_profile_views - First observed
linkedin_get_shared_connections - First observed
linkedin_list_connection_requests - First observed
linkedin_list_conversations - First observed
linkedin_manage_connection_request - First observed
linkedin_mark_conversation_read - First observed
linkedin_react_to_post - First observed
linkedin_search_jobs - First observed
linkedin_search_people - First observed
linkedin_search_sales_navigator - First observed
linkedin_send_connection_request - First observed
linkedin_send_message - First observed
linkedin_who_am_i - First observed
send_feedback - First observed
validate_email
Related MCP Connectors
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
LinkedIn MCP with 47 tools: post, comment, DM and run comment-to-DM automations inside your limits.
A hosted LinkedIn MCP server for your own account. Paste one address into Claude, ChatGPT, Cursor or n8n to read your inbox, send messages and invitations, and search people. Free to start. Not made by LinkedIn.
The all-in-one LinkedIn MCP server: six outbound specialists for LinkedIn and email.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceHosted LinkedIn MCP server that connects AI apps to a user's own LinkedIn account, enabling inbox reading, messaging, invitations, people search, and post interactions.2-
- AlicenseAqualityCmaintenanceSelf-hosted, ban-safe MCP server for LinkedIn that provides 22 tools for profiles, search, jobs, posts, connections, and messages. Integrates with any MCP-compatible client like Claude Desktop.581MIT
- AlicenseAqualityBmaintenanceUniversal LinkedIn MCP server for profile editing, rich posting (media, polls), messaging threads, network growth, and analytics with stealth browser automation and strict account guardrails.29MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for programmable LinkedIn automation via Playwright, offering 20 tools for profile management, messaging, feed interaction, and job searching through real browser automation.23 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.