Skip to main content
Glama
AmmYoo7

linkedin-safe-mcp

by AmmYoo7

linkedin-safe-mcp

An MCP server that gives AI agents (Claude Code, Codex, Claude Desktop, Cursor, …) LinkedIn superpowers — without putting your LinkedIn account at risk:

  • Post to LinkedIn — text, links, and images via LinkedIn's official API (OAuth, ToS-compliant), plus comments and likes.

  • Search jobs — keyword/location/remote/experience/date filters via LinkedIn's public guest endpoints. No login, no cookies: your account is never involved.

  • Run a job hunt — a local SQLite application tracker (interested → applied → interviewing → offer) with notes and per-job posting snapshots, so an agent can manage your pipeline and write tailored cover letters even after a posting is taken down.

Why this design?

LinkedIn offers no official job-search API, and the unofficial routes (Voyager internal API with your li_at session cookie, headless browsers on your logged-in session) violate LinkedIn's User Agreement §8.2 and routinely get accounts restricted. This server deliberately splits the difference:

Concern

How it's handled

Account risk

Posting, comments, likes

Official REST API, your own OAuth app, w_member_social

None — sanctioned

Job search & details

Guest endpoints (the logged-out jobs pages), IP-rate-limited

None — no credentials involved

Pipeline tracking

Local SQLite on your machine

None — never touches LinkedIn

Easy Apply, DMs, feed reading

Intentionally not included — impossible without ToS-violating access

Related MCP server: LinkedIn Buddy

Requirements

  • Python 3.11+ and uv

  • For posting only: a free self-serve LinkedIn developer app (5-minute setup below). Job search and the tracker work with zero setup.

Install & connect to your agent

Clone/copy this directory, then register it with your MCP client. <REPO> below is the absolute path to this project.

Claude Code

claude mcp add linkedin \
  --env LINKEDIN_CLIENT_ID=your_client_id \
  --env LINKEDIN_CLIENT_SECRET=your_client_secret \
  -- uv run --directory <REPO> linkedin-safe-mcp

Or in a project's .mcp.json:

{
  "mcpServers": {
    "linkedin": {
      "command": "uv",
      "args": ["run", "--directory", "<REPO>", "linkedin-safe-mcp"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Codex (~/.codex/config.toml)

[mcp_servers.linkedin]
command = "uv"
args = ["run", "--directory", "<REPO>", "linkedin-safe-mcp"]
env = { LINKEDIN_CLIENT_ID = "your_client_id", LINKEDIN_CLIENT_SECRET = "your_client_secret" }

Claude Desktop (claude_desktop_config.json) — same JSON shape as .mcp.json above.

The LINKEDIN_CLIENT_* variables are only needed for posting; omit them if you only want job search + tracking.

Enabling posting (one-time LinkedIn app setup)

  1. Go to https://www.linkedin.com/developers/appsCreate app (requires associating any LinkedIn Page; you can create a trivial one).

  2. On the app's Products tab, add Share on LinkedIn and Sign In with LinkedIn using OpenID Connect.

  3. On the Auth tab, add the redirect URL http://127.0.0.1:8765/callback (it must be the IP literal, not localhost — see Security below).

  4. Copy the Client ID and Client Secret into the env vars shown above.

  5. Authenticate once — either way works:

    • In a terminal: uv run --directory <REPO> linkedin-safe-mcp auth

    • Or just ask your agent to post something; it will call the login tool and hand you the authorization URL.

Tokens are stored in ~/.linkedin-mcp/tokens.json, created mode 0600 inside a 0700 directory, and last ~60 days; LinkedIn doesn't issue refresh tokens to self-serve apps, so you re-run the login when it expires (auth_status tells the agent exactly when that is). LinkedIn doesn't issue refresh tokens to self-serve apps, so you re-run the login when it expires (auth_status tells the agent exactly when that is).

Tools

Tool

Needs auth

What it does

auth_status

Reports config/auth state with exact next steps

login / logout

Browser OAuth flow / delete stored tokens

get_my_profile

Name, email, person URN of the connected account

create_post

Publish a post: text (+hashtags), optional link or local image (real PNG/JPEG/GIF, ≤10 MB); PUBLIC or CONNECTIONS

delete_post

Delete one of your posts (URN or post URL)

comment_on_post

Comment on a post (URN or post URL)

like_post

Like a post (URN or post URL)

search_jobs

Filters: location, remote/hybrid/onsite, time posted, experience levels, job types, Easy-Apply-only, sort; up to 50 results

get_job

Full posting: description, seniority, type, salary if listed, applicant count, external apply URL

save_job

Snapshot a job into the local tracker

get_saved_job / list_saved_jobs

One job with history / pipeline overview with status counts

update_job_status

interested → applied → interviewing → offer / rejected / withdrawn / archived, with notes

add_job_note / remove_saved_job

Append a note / drop a job

Things agents can do with this: "find remote staff-engineer roles posted this week, save the promising ones, draft tailored cover letters from the saved descriptions, mark the ones I applied to, and post a summary of my open-source work."

Configuration

Env var

Default

Purpose

LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRET

LinkedIn app credentials (posting only)

LINKEDIN_MCP_DIR

~/.linkedin-mcp

Where tokens + tracker DB live

LINKEDIN_REDIRECT_PORT

8765

OAuth callback port (must match the app's redirect URL)

LINKEDIN_API_VERSION

202606

LinkedIn-Version header for /rest/* calls

LINKEDIN_POSTS_BACKEND

auto

rest, ugc, or auto (try + remember what your app is allowed to use)

LINKEDIN_MCP_USER_AGENT

a Chrome UA

UA for guest job requests

LINKEDIN_MCP_IMAGE_DIR

unset

If set, create_post may only attach images from this directory

Behavior notes & limits

  • Posting: LinkedIn caps member posting at 150 requests/day and rejects exact duplicates of recent posts (422). Reserved characters in post text are escaped automatically for the versioned API so parentheses don't cause errors; hashtags are preserved.

  • Job search: guest endpoints are rate-limited per IP (HTTP 429). The server caches results (10 min searches / 6 h job details), retries with backoff, and paces multi-page fetches; on a persistent 429 it returns a clear "wait a minute" error to the agent. Keep limit modest.

  • Scraping posture: guest job search reads the same public pages a logged-out visitor sees, at human-ish rates, with caching to minimize load. Still, LinkedIn could change or gate these endpoints at any time — the parsers are pinned by fixture tests so breakage is detected loudly, and the tool errors stay agent-actionable.

Security

The threat model assumes the agent driving this server is not trusted: it reads job descriptions scraped from LinkedIn, so a hostile posting is a prompt-injection channel straight into every tool argument. The boundaries that follow from that:

  • Image attachments are not a file-read primitive. create_post(image_path=…) accepts only real PNG/JPEG/GIF files — verified by magic bytes and the format's mandatory trailer, so neither renaming a secret nor appending one after a valid header gets through — at most 10 MB, never via a symlink, hardlink, pipe or device. Without this, "attach ~/.ssh/id_rsa" was a valid call that published the key. Residual limit: an attacker who can already both read a secret and write files could encode it inside a structurally valid image; no format check can prevent that. Set LINKEDIN_MCP_IMAGE_DIR to confine uploads to one folder if that matters to you.

  • The OAuth callback validates state before anything else. The listener on 127.0.0.1 is reachable by any local process and by any web page the user has open, so an unauthenticated request must not be able to abort a pending login (which would also free the port for an authorization-code interceptor). Error text is HTML-escaped at the sink.

  • The redirect URL is 127.0.0.1, never localhost. Browsers may resolve the name to ::1, which a different local account can bind. RFC 8252 §8.3.

  • Secrets are 0600 from creation. Tokens, state.json and the tracker DB are created private rather than chmod-ed afterwards, closing the window where a local watcher could read a fresh access token; ~/.linkedin-mcp is 0700.

  • Upload targets are pinned. The Bearer token is only ever PUT to an HTTPS linkedin.com/licdn.com host, whatever URL the API response asks for.

These are covered by regression tests (tests/test_client_security.py, the security sections of tests/test_oauth.py and tests/test_tracker.py) — each one is a working exfiltration or hijack attempt that must fail closed.

Found something? Open an issue, or email the address on the GitHub profile for anything sensitive.

Development

uv sync            # install deps (Python ≥3.11)
uv run pytest      # 102 tests: parsers vs live fixtures, payloads, OAuth, tracker,
                   # security regressions, plus an end-to-end stdio smoke test
                   # that spawns the real server
uv run ruff check src tests && uv run ruff format --check src tests

Layout: src/linkedin_mcp/server.py (tool surface) · api/ (official REST: posts, social actions, uploads, dual rest/ugc backend) · auth/ (OAuth + token store) · jobs/ (guest client, HTML parsers, filter mappings) · tracker/ (SQLite store) · cli.py (serve | auth | status | logout).

Roadmap

  • Publish to PyPI (uvx linkedin-safe-mcp one-liner)

  • Reaction types beyond like; multi-image posts; poll posts

  • Optional third-party job-data providers behind the same tool schema

  • streamable-http transport for remote/hosted use

  • (Considered, opt-in only, off by default) a cookie-based Voyager provider for personalized features — with loud warnings, since it violates LinkedIn's ToS

License

MIT

Available Tools

16 tools
add_job_noteA

Append a timestamped note to a tracked job (e.g. recruiter name, interview date, salary discussed) without changing its status.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYes
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
titleNo
eventsNo
job_idYes
salaryNo
statusYes
companyNo
locationNo
saved_atYes
updated_atYes
descriptionNo

TDQS

A4.2/5.0
Behavior4/5

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

There are no annotations, so the description carries the behavioral burden. It discloses that the note is timestamped and that the operation does not change status, which is a meaningful side-effect boundary. It does not discuss auth or failure modes, but for a simple two-parameter append operation it provides the key behavioral contract.

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

Conciseness5/5

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

The description is one well-structured sentence with no filler. It front-loads the action and target, provides helpful examples in parentheses, and ends with an important caveat. Every part earns its place.

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

Completeness4/5

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

For a tool with two required string parameters and an output schema, this description covers the core purpose, example content, and the key side-effect exclusion. It omits explicit prerequisites like authentication or job ownership, but those are not necessary for basic selection and invocation.

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

Parameters3/5

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

Schema coverage is 0%, so the description must compensate. It does add meaning for the note parameter via concrete examples, but job_id is only inferable from the phrase 'tracked job' and receives no explicit format or ownership guidance. This is partial, not complete, compensation.

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

Purpose5/5

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

The description uses a specific verb ('Append') with a clear resource ('timestamped note to a tracked job') and gives concrete examples. The explicit caveat 'without changing its status' clearly separates this tool from update_job_status, so an agent can identify its purpose unambiguously.

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

Usage Guidelines4/5

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

The examples (recruiter name, interview date, salary discussed) clarify what kind of content belongs in a note, and the phrase 'without changing its status' implies it should be used when status mutation is not intended. It stops short of explicitly naming alternatives like update_job_status, so it earns a 4 rather than a 5.

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

auth_statusA

Check LinkedIn authentication state. Call this before posting tools; if it reports not configured/authenticated it includes exactly what to do next. Job-search tools never need authentication.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
detailYes
scopesNo
configuredYesWhether LinkedIn app credentials are present
expires_atNoAccess token expiry, ISO 8601 UTC
profile_nameNo
authenticatedYesWhether a valid (unexpired) access token exists
setup_instructionsNo

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It discloses that the tool reports authentication state, may indicate not configured/authenticated status, and provides remediation instructions. This is sufficient for a zero-parameter read-only status check, though it does not explicitly state side-effect-free behavior.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core purpose, followed by actionable usage guidance and an exclusion. Every sentence earns its place; there is no redundancy or filler.

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

Completeness5/5

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

For a zero-parameter status-check tool with an output schema, the description fully covers purpose, timing, fallback behavior, and when authentication is irrelevant. Nothing needed for correct invocation is missing.

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

Parameters4/5

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

The tool has zero parameters and schema coverage is 100%, so there is no parameter documentation burden. The baseline for zero-parameter tools is 4, and the description adds relevant context about what the state report is used for.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Check LinkedIn authentication state.' It clearly distinguishes this tool from siblings like login, logout, and posting tools by positioning it as a preflight status check before posting operations.

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

Usage Guidelines5/5

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

It explicitly states when to call it ('Call this before posting tools'), what happens if auth is missing ('includes exactly what to do next'), and when it is not needed ('Job-search tools never need authentication'). This gives the agent clear routing rules without needing to inspect siblings.

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

comment_on_postA

Comment on a LinkedIn post as the authenticated user. post is a post URN (urn:li:share/ugcPost/activity:…) or a linkedin.com post URL. Confirm wording with the user first — comments are public.

ParametersJSON Schema
NameRequiredDescriptionDefault
postYes
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
target_urnYes
comment_urnNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavior disclosure burden. It usefully warns that comments are public and instructs the agent to confirm wording first, which is important for a social write action. It does not discuss permanence or editability, but the key public-facing behavior is disclosed.

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

Conciseness5/5

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

The description is concise, front-loaded with the main purpose, and includes only necessary details. Every sentence adds value: the action, the param format, and the public-confirmation warning.

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

Completeness4/5

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

The description is complete enough for this two-parameter tool with an output schema present. It covers the tricky `post` format and the behavioral caveat. It could mention authentication requirements more explicitly, but 'as the authenticated user' sufficiently implies the auth context.

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

Parameters3/5

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

The input schema has 0% description coverage, so the description must compensate. It thoroughly explains the `post` parameter's accepted formats (URN or URL), but the `text` parameter is only implied as the comment wording and lacks explicit semantic detail such as formatting or length constraints.

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

Purpose5/5

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

The description clearly states the action ('Comment on a LinkedIn post') and the acting identity ('as the authenticated user'), which distinguishes it from siblings like create_post and like_post. It is specific about the resource and what the tool does.

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

Usage Guidelines4/5

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

It gives clear context for use and an explicit precondition: confirm wording with the user first because comments are public. It does not explicitly name alternatives or when-not-to-use scenarios, but the action is distinct enough among siblings.

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

create_postA

Publish a LinkedIn post as the authenticated user. IMPORTANT: posts are public professional content — confirm the final text with the user before calling this. Hashtags (#likeThis) work in text. Attach at most one of: link (shares a URL; link_title/link_description improve its preview card) or image_path (local file to upload). LinkedIn rejects exact duplicates of recent posts and caps posting at 150/day.

ParametersJSON Schema
NameRequiredDescriptionDefault
linkNo
textYes
image_pathNo
link_titleNo
visibilityNoPUBLIC
link_descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYesPublic URL of the created post
backendYesWhich LinkedIn API created it: 'rest' or 'ugc'
post_urnYes
visibilityYes

TDQS

A4.6/5.0
Behavior5/5

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

No annotations are provided, so the description carries full behavioral burden. It compensates well by disclosing the at-most-one constraint, hashtag behavior, link preview effects, duplicate-post rejection, and the 150/day cap. These go beyond the schema, which encodes none of these constraints.

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

Conciseness5/5

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

Four sentences cover purpose, user-confirmation warning, parameter constraints, and platform limits without waste. Backticked parameter names and bolded IMPORTANT make it scannable and well structured.

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

Completeness4/5

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

For a six-parameter write action with no annotations or schema descriptions, the description provides enough operational detail for correct invocation, and an output schema exists. The only notable gap is the visibility parameter, which the enum conveys but the 'public' claim does not accurately address.

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

Parameters4/5

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

Schema has 0% description coverage, so the description must explain parameters. It defines link as URL sharing, image_path as local file upload, link_title/link_description as preview-card enhancers, and text as containing hashtags. However, visibility is not described at all, and the blanket 'public' phrasing is slightly inconsistent with the CONNECTIONS enum option.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Publish a LinkedIn post as the authenticated user.' It is immediately distinct from sibling tools like delete_post, comment_on_post, and like_post, and clarifies the acting entity.

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

Usage Guidelines4/5

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

It gives clear context for when to use: after confirming the final text with the user and warns about public professional content. It also provides parameter usage guidance ('Attach at most one of link or image_path'), though it does not explicitly name sibling alternatives because no sibling performs post creation.

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

delete_postA

Delete one of the user's own posts. post is a post URN or a linkedin.com post URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
postYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It reveals that the operation is destructive, scoped to the authenticated user's own posts, and identifies exactly what is being removed. It does not explicitly state irreversibility or side effects, but the verb 'Delete' plus the ownership constraint provides solid transparency for a simple mutation tool.

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

Conciseness5/5

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

The description is one tightly constructed sentence with the action front-loaded, followed by a necessary parameter clarification. There is no redundant or filler content.

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

Completeness4/5

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

For a one-parameter mutation tool with an output schema, the description covers the core operation, ownership scope, and parameter format. It could add explicit note about irreversibility or permission requirements, but the existing content is sufficient for safe invocation in most cases.

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

Parameters5/5

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

Schema coverage is 0%, and the schema only labels the parameter as 'Post'. The description adds essential semantic meaning by defining post as 'a post URN or a linkedin.com post URL', giving the agent the exact accepted formats for the only required parameter.

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

Purpose5/5

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

The description states a specific action ('Delete') and a specific resource ('one of the user's own posts'), which clearly distinguishes this tool from sibling tools like create_post, comment_on_post, and like_post. The ownership qualifier adds precision and prevents confusion with operations on other users' posts.

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

Usage Guidelines4/5

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

The phrase 'user's own posts' clearly conveys when this tool is appropriate, implicitly excluding deletion of other users' posts or interacting with posts via like/comment tools. It does not explicitly name alternatives or provide when-not-to-use conditions, but the context is strong enough for an agent to route correctly.

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

get_jobA

Fetch full details for one job posting: description, seniority, employment type, salary when listed, applicant count, and the external apply URL if the posting is not Easy Apply. job is a job_id from search_jobs, a linkedin.com/jobs/view/... URL, or a jobPosting URN.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleNo
job_idYes
salaryNo
companyNo
locationNo
apply_urlNoExternal ATS apply URL when the posting is not Easy Apply
seniorityNo
applicantsNo
industriesNo
company_urlNo
descriptionNo
posted_textNo
job_functionsNo
employment_typeNo

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses conditional behavior ('salary when listed', 'external apply URL if the posting is not Easy Apply') and the read-only nature is evident from 'Fetch'. It does not cover authentication or error/rate-limit behavior, but for a get-by-id call the disclosed conditions are substantive.

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

Conciseness5/5

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

Two sentences with the primary purpose and field list front-loaded, followed immediately by the parameter contract. No filler or repetition of schema details.

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

Completeness4/5

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

For a single-parameter getter with an output schema available, the description covers accepted input forms and names the returned fields. It omits only explicit prerequisites such as authentication, which would make it fully complete.

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

Parameters5/5

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

The schema provides only a required string, so the description must define the semantics, and it does thoroughly: the job parameter can be a search result's job_id, a LinkedIn jobs URL, or a jobPosting URN. This fully compensates for the 0% schema description coverage.

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

Purpose5/5

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

States the action ('Fetch full details') and the resource ('one job posting'), and enumerates the exact fields returned, which clearly separates it from the listing behavior of search_jobs and the saved-job tools.

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

Usage Guidelines4/5

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

The description tells the agent where the job identifier comes from ('a job_id from search_jobs, a linkedin.com/jobs/view/... URL, or a jobPosting URN'), establishing when to call it as a follow-up after searching. It does not explicitly name sibling alternatives or state when not to use it, so it stops one point short.

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

get_my_profileA

Get the authenticated user's LinkedIn identity (name, email, person URN). Requires login.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
emailNo
localeNo
pictureNo
given_nameNo
person_urnYes
family_nameNo

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the responsibility for behavioral disclosure. It usefully states the login requirement and what is returned, but it does not mention failure behavior if unauthenticated, potential rate limits, or the read-only nature beyond the word 'Get'.

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

Conciseness5/5

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

The description is two short sentences with no filler. The core purpose and the key prerequisite are both front-loaded and easily scannable.

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

Completeness5/5

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

For a zero-parameter tool with an output schema present, the description provides the essential context: what resource is fetched and that authentication is required. Nothing critical seems missing for an agent to select and invoke this tool correctly.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing meaningful for the description to add about parameter semantics. The schema is fully complete, and the description focuses on output contents rather than inputs, which is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Get') and identifies the exact resource ('authenticated user's LinkedIn identity'), listing the returned fields (name, email, person URN). This clearly separates it from authentication actions and content-manipulation siblings.

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

Usage Guidelines3/5

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

The description conveys a clear prerequisite ('Requires login'), implying it should only be called after authentication. However, it does not explicitly distinguish when to use this tool versus siblings like auth_status, nor does it mention any exclusions.

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

get_saved_jobA

Get one tracked job with its snapshot (description included) and full event history (status changes and notes).

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
titleNo
eventsNo
job_idYes
salaryNo
statusYes
companyNo
locationNo
saved_atYes
updated_atYes
descriptionNo

TDQS

A4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It clearly communicates the scope of the operation ('get'), the resource scope ('tracked job'), and the return content (snapshot, description, status changes, notes). This is adequate for a non-mutating retrieval tool, though it does not mention auth requirements or error behavior.

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

Conciseness5/5

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

The description is a single, focused sentence that front-loads the resource ('one tracked job') and then lists the included data. Every clause adds useful information, with no redundancy or filler.

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

Completeness4/5

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

Given the low parameter count and the presence of an output schema, the description covers the essential selection and invocation information. It clearly states the output contents and the singular scope, though it could be more explicit about how this tool differs from get_job and what qualifies as a 'tracked job'.

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

Parameters3/5

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

The schema has 0% description coverage, leaving the single job_id parameter undocumented. The description adds the context that job_id refers to a 'tracked job', which helps distinguish it from other job-related IDs, but does not explain the format, origin, or how to obtain a valid job_id.

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

Purpose5/5

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

The description states a specific verb ('get') and resource ('one tracked job') and clearly identifies the returned content: a snapshot with description and full event history. This distinguishes it from siblings like list_saved_jobs (plural) and get_job (not necessarily tracked/saved).

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

Usage Guidelines3/5

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

The phrase 'one tracked job' implies use for retrieving a single saved job's full details, which differentiates it from list_saved_jobs. However, it does not explicitly state when to use this versus get_job, or mention any exclusions or alternatives.

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

like_postA

Like a LinkedIn post as the authenticated user. post is a post URN or a linkedin.com post URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
postYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses that the action is performed as the authenticated user, but does not describe side effects, idempotency, errors, or whether liking an already-liked post is treated as a no-op.

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

Conciseness5/5

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

The description is a single, front-loaded sentence that states the action and then clarifies the parameter. Every word earns its place, with no redundant or vague filler.

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

Completeness4/5

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

This is a simple one-parameter tool, and the description covers the core action, the authentication context, and the accepted input format. An output schema exists, so return values do not need explanation. Minor gaps around behavioral edge cases keep it from a 5.

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

Parameters5/5

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

The input schema only defines `post` as a string with no description, giving 0% schema coverage. The description fully compensates by explaining that `post` is either a post URN or a linkedin.com post URL, adding essential meaning beyond the schema.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Like a LinkedIn post' with the context 'as the authenticated user.' This clearly distinguishes it from sibling tools like comment_on_post or create_post.

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

Usage Guidelines3/5

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

The description implies usage when the agent needs to like a post and notes that it operates as the authenticated user. However, it does not explicitly state when to avoid using it or mention alternatives like comment_on_post versus like_post.

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

list_saved_jobsA

List the user's tracked jobs with pipeline counts by status. Optionally filter by status and/or a title/company substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNo
statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsYes
totalYes
by_statusYes

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral disclosure burden. It does reveal useful output behavior ('pipeline counts by status') and implies a read-only listing operation, but it omits potential behavioral details such as pagination, ordering, authentication requirements, or whether archived jobs are included by default.

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

Conciseness5/5

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

A single, front-loaded sentence states the core action and the optional filters without waste. Every phrase earns its place, and the structure immediately gives the agent the most important information.

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

Completeness4/5

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

For a simple list tool with an output schema and only two optional parameters, the description is largely sufficient. It might be further improved by explicitly routing to get_saved_job for individual job details or search_jobs for broader job discovery, but nothing critical is missing for basic invocation.

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

Parameters4/5

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

Schema description coverage is 0%, so the description compensates by explaining that 'status' filters by job status and 'search' is a title/company substring. This adds real meaning beyond the raw schema names, though it does not detail matching behavior or edge cases.

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

Purpose5/5

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

The description names a specific verb ('List'), a specific resource ('the user's tracked jobs'), and a distinctive output characteristic ('pipeline counts by status'). It clearly distinguishes this from sibling tools like search_jobs (global search) and get_saved_job (single saved job).

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

Usage Guidelines4/5

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

The description clearly conveys when to use it: to list the current user's saved/tracked jobs, with optional filters by status or title/company substring. It does not explicitly mention alternatives or exclusions, but the resource scope is unambiguous enough to guide selection.

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

loginA

Start the LinkedIn OAuth login. Returns an authorization URL — show it to the user and ask them to open it in a browser (it may also open automatically); the local callback completes the flow. Afterwards, call auth_status to confirm.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
authorization_urlYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does so well: it discloses that the browser may open automatically, that the local callback completes the flow, and that login is not confirmed until auth_status is called. It doesn't cover edge cases like URL expiration or failure handling, but covers the essential interactive behavior.

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

Conciseness5/5

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

Two tight sentences deliver purpose, required user action, callback behavior, and the follow-up verification step with no filler. The critical instruction to show the URL is front-loaded.

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

Completeness5/5

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

For a zero-parameter interactive OAuth tool, the description provides the full invocation contract: what is returned, what the agent must tell the user, how the flow completes, and how to verify success. The output schema can cover the URL's structured details, so no major context is missing.

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

Parameters4/5

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

The tool has zero parameters and 100% schema coverage, so there is no parameter ambiguity for the description to resolve. The description correctly avoids inventing parameter guidance.

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

Purpose5/5

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

The description states a specific verb and resource ('Start the LinkedIn OAuth login') and clarifies the concrete output ('Returns an authorization URL'). It makes the tool's role distinct from siblings like auth_status and logout without ambiguity.

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

Usage Guidelines4/5

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

It gives clear operational context: show the URL to the user, have them open it, and then call auth_status to confirm. It implies the alternative boundary—this tool starts the flow, while auth_status verifies completion—but does not explicitly say when not to use login.

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

logoutA

Delete the stored LinkedIn tokens for this machine.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It clearly states that tokens are deleted, which is the core destructive action, and specifies the local scope. However, it does not mention downstream effects such as invalidating server-side sessions, the need to re-authenticate, or irreversibility, which would be more transparent.

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

Conciseness5/5

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

The description is a single concise sentence with no filler. It front-loads the action and resource, and every word earns its place. Ideal for a simple tool.

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

Completeness4/5

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

The tool is low complexity: no parameters, no nested objects, and an output schema exists. The description explains the core behavior and scope. It is slightly thin on post-conditions or side-effect warnings, but for a logout action with minimal inputs, it is sufficiently complete.

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

Parameters4/5

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

The tool has zero parameters, so the baseline is 4. The description need not explain parameter semantics. The input schema already confirms no parameters, and the description does not add or require any param-related detail.

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

Purpose5/5

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

The description uses a specific verb 'Delete' and names the exact resource ('stored LinkedIn tokens') and scope ('for this machine'). This clearly distinguishes logout from siblings like login and auth_status, and leaves no ambiguity about what action the tool performs.

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

Usage Guidelines3/5

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

The description implies the usage context: when you want to sign out and remove locally stored tokens on this machine. However, it does not explicitly state when to use this tool versus alternatives, nor does it list exclusions or prerequisites. The guidance is minimal but adequate for an obvious action.

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

remove_saved_jobA

Remove a job (and its history) from the local tracker. Prefer update_job_status(..., "archived") to keep the record.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral disclosure burden. It openly states that the tool removes the job 'and its history,' signaling destructive side effects beyond the obvious delete. The preference for archiving reinforces that this operation is not a reversible status change, though it does not mention permissions or error behavior.

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

Conciseness5/5

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

Two short sentences with no filler. The action and destructive scope are front-loaded, and the alternative tool is mentioned in the second sentence. Every word earns its place.

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

Completeness5/5

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

For a one-parameter destructive operation with an output schema, the description is complete: it states what is removed, where it is removed from, and the safer alternative. Return value details are already covered by the output schema, so no additional information is needed.

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

Parameters3/5

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

Schema coverage is 0%: job_id has only a name and type, with no description. The tool description does not directly explain job_id, but 'from the local tracker' indicates that job_id identifies a locally saved job, which provides enough context for a single self-explanatory string parameter.

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

Purpose5/5

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

The description uses a precise verb ('Remove') and a clear resource ('job and its history from the local tracker'). It clearly differentiates this destructive operation from the non-destructive sibling update_job_status, making the tool's purpose unambiguous.

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

Usage Guidelines5/5

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

The description explicitly advises preferring update_job_status(..., "archived") when the record should be kept, which tells the agent both when to use this tool and when to use the alternative. This is direct, actionable usage guidance rather than a vague hint.

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

save_jobA

Save a job to the user's local application tracker (stores a snapshot of the posting, including its description, so it survives delisting). Idempotent: if already saved, appends the note instead. job is a job_id, URL, or URN.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobYes
noteNo
statusNointerested

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
titleNo
eventsNo
job_idYes
salaryNo
statusYes
companyNo
locationNo
saved_atYes
updated_atYes
descriptionNo

TDQS

A4.6/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly discloses idempotency, the snapshot behavior, that saved postings survive delisting, and that the job parameter accepts a job_id, URL, or URN. This is strong transparency beyond what the schema alone provides.

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

Conciseness5/5

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

The description is compact and front-loaded, with the core action and key snapshot behavior stated first, followed by the idempotency rule and parameter clarification. Every sentence adds value and there is no filler.

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

Completeness4/5

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

The description covers the essential invocation semantics: what gets saved, idempotency, and the flexible job identifier format. An output schema exists, so return-value detail is not required. However, it is slightly ambiguous what happens if a duplicate save includes both a note and a status change, since it only says the note is appended.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It successfully explains the most important parameter, `job`, by specifying accepted formats (job_id, URL, or URN). It does not elaborate on `note` or `status`, but those are reasonably inferable from the schema's defaults and enum values.

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

Purpose5/5

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

The description uses a specific verb ('Save') and a clear resource ('a job to the user's local application tracker'), and it distinguishes this tool from siblings by emphasizing it stores a snapshot that survives delisting. This makes it easy to tell save_job apart from related tools like list_saved_jobs, update_job_status, or add_job_note.

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

Usage Guidelines4/5

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

The description gives clear behavioral context for when to use the tool: any job can be saved, and if it is already saved, the note is appended instead. It does not explicitly name alternatives or state when not to use it, but the idempotency rule effectively guides the agent's decision-making.

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

search_jobsA

Search LinkedIn job postings (no login required; the user's account is never involved). location is free text like "Berlin", "India", or "United States"; combine it with workplace="remote" for remote roles. limit max is 50 — keep it modest to avoid IP rate-limiting; on a rate-limit error, wait a minute before retrying. Use get_job with a result's job_id for the full description.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNorelevance
limitNo
keywordsYes
locationNo
job_typesNo
workplaceNo
easy_applyNo
time_postedNoany
experience_levelsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobsYes
noteNo
countYes

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does well: it discloses that the user's account is never involved, warns about IP rate-limiting, and gives a retry wait. It doesn't cover every operational detail, but the key caveats are present.

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

Conciseness5/5

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

Three compact sentences, each serving a distinct purpose: purpose/auth, parameter usage, and rate-limit/next-step guidance. No filler or redundancy.

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

Completeness4/5

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

For a 9-parameter tool with no annotations, the description covers the non-obvious operational aspects (no auth needed, rate limits, follow-up via get_job). Some filter parameters are not explicitly discussed, but the output schema and enum values fill most gaps.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains location with concrete examples, suggests a workplace='remote' combination, and documents limit max 50. Other parameters rely on their titles and enums in the schema.

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

Purpose5/5

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

States a specific verb and resource: 'Search LinkedIn job postings'. It also clarifies 'no login required' and directs to get_job for full descriptions, distinguishing it from auth-related and job-detail siblings.

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

Usage Guidelines5/5

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

Explicitly tells the agent to use get_job with a result's job_id for the full description, and provides practical guidance on location free text, combining with workplace='remote', and handling rate-limit errors with a wait-and-retry strategy.

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

update_job_statusA

Move a tracked job through the pipeline (interested → applied → interviewing → offer/rejected/withdrawn; archived hides it). The change is recorded in the job's event history with the optional note.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
job_idYes
statusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlNo
titleNo
eventsNo
job_idYes
salaryNo
statusYes
companyNo
locationNo
saved_atYes
updated_atYes
descriptionNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description must carry the behavioral burden. It does disclose key side effects: archived hides the job, and the change is recorded in the job's event history with an optional note. It does not mention transition restrictions or permissions, but it provides meaningful behavioral context beyond 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.

Conciseness5/5

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

Two sentences, no filler, front-loaded with the action and followed by precise supporting detail about status flow and side effects. Every clause earns its place.

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

Completeness4/5

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 an output schema, the description covers the core operation and important side effects. Minor gaps remain, such as whether transitions can skip stages or whether archived is reversible, but the agent has enough to call the tool correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does interpret the main parameters: job_id is 'a tracked job', status is the pipeline, and note is optional and tied to event history. It doesn't detail the job_id format, but the meaning is sufficiently conveyed.

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

Purpose5/5

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

The description names a specific verb, 'Move a tracked job through the pipeline', and elaborates the exact status flow with the statuses themselves, including the special 'archived hides it' behavior. This clearly distinguishes it from sibling tools like saving jobs or adding standalone notes.

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

Usage Guidelines4/5

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

The description clearly indicates this is for advancing job status, not for saving or note-taking. It doesn't explicitly name alternatives or exclusions, but the pipeline vocabulary and the event-history note clarify when this tool is appropriate relative to siblings like add_job_note.

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. Dates show when Glama detected each change.

  1. 16 tool updatesv0.1.0
    • First observedadd_job_note
    • First observedauth_status
    • First observedcomment_on_post
    • First observedcreate_post
    • First observeddelete_post
    • First observedget_job
    • First observedget_my_profile
    • First observedget_saved_job
    • First observedlike_post
    • First observedlist_saved_jobs
    • First observedlogin
    • First observedlogout
    • First observedremove_saved_job
    • First observedsave_job
    • First observedsearch_jobs
    • First observedupdate_job_status

TDQS

A4.3/5.0

Scored across 16 tools

Disambiguation5/5

Each tool targets a distinct action and resource: auth, profile, posts, comments/likes, job search, and local job tracking are cleanly separated. Even similar pairs like get_job vs get_saved_job are disambiguated by explicit descriptions.

Naming Consistency4/5

The majority follow a clear verb_noun pattern (create_post, delete_post, search_jobs, get_saved_job, update_job_status). Minor deviations like auth_status and login/logout break the pattern slightly but remain intuitive.

Tool Count4/5

At 16 tools the server is slightly above the ideal 3-15 range, but the count is justified by covering authentication, LinkedIn social actions, job search, and a local job tracker. Each tool serves a concrete purpose.

Completeness5/5

The surface covers the full workflow: auth lifecycle, profile retrieval, post creation/deletion, commenting/liking, job searching/details, and complete CRUD plus notes/status tracking for saved jobs. There are no significant dead ends or missing core operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Fully featured MCP server that provides automation tools for LinkedIn, supporting browser-based scraping and API-based operations for content management, media uploads, and reactions.
    6
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for LinkedIn automation that enables AI agents to perform LinkedIn actions (search, inbox, feed, jobs, etc.) safely with human-like evasion and two-phase commit preview.
    6
    2
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Playwright-powered MCP server for LinkedIn that automates jobs, profile edits, messaging, network actions, and feed posts using a real logged-in browser session.
    36
    Apache 2.0

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/AmmYoo7/linkedin-safe-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server