linkedin-safe-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@linkedin-safe-mcpFind remote Python jobs posted this week and save the top 3 to my tracker"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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, | 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-mcpOr 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)
Go to https://www.linkedin.com/developers/apps → Create app (requires associating any LinkedIn Page; you can create a trivial one).
On the app's Products tab, add Share on LinkedIn and Sign In with LinkedIn using OpenID Connect.
On the Auth tab, add the redirect URL
http://127.0.0.1:8765/callback(it must be the IP literal, notlocalhost— see Security below).Copy the Client ID and Client Secret into the env vars shown above.
Authenticate once — either way works:
In a terminal:
uv run --directory <REPO> linkedin-safe-mcp authOr just ask your agent to post something; it will call the
logintool 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 |
| – | Reports config/auth state with exact next steps |
| – | Browser OAuth flow / delete stored tokens |
| ✓ | Name, email, person URN of the connected account |
| ✓ | Publish a post: text (+hashtags), optional link or local image (real PNG/JPEG/GIF, ≤10 MB); |
| ✓ | Delete one of your posts (URN or post URL) |
| ✓ | Comment on a post (URN or post URL) |
| ✓ | Like a post (URN or post URL) |
| – | Filters: location, remote/hybrid/onsite, time posted, experience levels, job types, Easy-Apply-only, sort; up to 50 results |
| – | Full posting: description, seniority, type, salary if listed, applicant count, external apply URL |
| – | Snapshot a job into the local tracker |
| – | One job with history / pipeline overview with status counts |
| – | interested → applied → interviewing → offer / rejected / withdrawn / archived, with notes |
| – | 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 app credentials (posting only) |
|
| Where tokens + tracker DB live |
|
| OAuth callback port (must match the app's redirect URL) |
|
|
|
|
|
|
| a Chrome UA | UA for guest job requests |
| unset | If set, |
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
limitmodest.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. SetLINKEDIN_MCP_IMAGE_DIRto confine uploads to one folder if that matters to you.The OAuth callback validates
statebefore anything else. The listener on127.0.0.1is 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, neverlocalhost. 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.jsonand 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-mcpis 0700.Upload targets are pinned. The Bearer token is only ever PUT to an HTTPS
linkedin.com/licdn.comhost, 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 testsLayout: 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-mcpone-liner)Reaction types beyond like; multi-image posts; poll posts
Optional third-party job-data providers behind the same tool schema
streamable-httptransport 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 toolsadd_job_noteA
Append a timestamped note to a tracked job (e.g. recruiter name, interview date, salary discussed) without changing its status.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | ||
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| title | No | |
| events | No | |
| job_id | Yes | |
| salary | No | |
| status | Yes | |
| company | No | |
| location | No | |
| saved_at | Yes | |
| updated_at | Yes | |
| description | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| detail | Yes | |
| scopes | No | |
| configured | Yes | Whether LinkedIn app credentials are present |
| expires_at | No | Access token expiry, ISO 8601 UTC |
| profile_name | No | |
| authenticated | Yes | Whether a valid (unexpired) access token exists |
| setup_instructions | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| target_urn | Yes | |
| comment_urn | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| link | No | ||
| text | Yes | ||
| image_path | No | ||
| link_title | No | ||
| visibility | No | PUBLIC | |
| link_description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Public URL of the created post |
| backend | Yes | Which LinkedIn API created it: 'rest' or 'ugc' |
| post_urn | Yes | |
| visibility | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | No | |
| job_id | Yes | |
| salary | No | |
| company | No | |
| location | No | |
| apply_url | No | External ATS apply URL when the posting is not Easy Apply |
| seniority | No | |
| applicants | No | |
| industries | No | |
| company_url | No | |
| description | No | |
| posted_text | No | |
| job_functions | No | |
| employment_type | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| No | ||
| locale | No | |
| picture | No | |
| given_name | No | |
| person_urn | Yes | |
| family_name | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| title | No | |
| events | No | |
| job_id | Yes | |
| salary | No | |
| status | Yes | |
| company | No | |
| location | No | |
| saved_at | Yes | |
| updated_at | Yes | |
| description | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| status | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| total | Yes | |
| by_status | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | |
| authorization_url | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job | Yes | ||
| note | No | ||
| status | No | interested |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| title | No | |
| events | No | |
| job_id | Yes | |
| salary | No | |
| status | Yes | |
| company | No | |
| location | No | |
| saved_at | Yes | |
| updated_at | Yes | |
| description | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | relevance | |
| limit | No | ||
| keywords | Yes | ||
| location | No | ||
| job_types | No | ||
| workplace | No | ||
| easy_apply | No | ||
| time_posted | No | any | |
| experience_levels | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobs | Yes | |
| note | No | |
| count | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| job_id | Yes | ||
| status | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| title | No | |
| events | No | |
| job_id | Yes | |
| salary | No | |
| status | Yes | |
| company | No | |
| location | No | |
| saved_at | Yes | |
| updated_at | Yes | |
| description | No |
TDQS
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.
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.
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.
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.
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.
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.
16 tool updates
v0.1.0- First observed
add_job_note - First observed
auth_status - First observed
comment_on_post - First observed
create_post - First observed
delete_post - First observed
get_job - First observed
get_my_profile - First observed
get_saved_job - First observed
like_post - First observed
list_saved_jobs - First observed
login - First observed
logout - First observed
remove_saved_job - First observed
save_job - First observed
search_jobs - First observed
update_job_status
TDQS
Scored across 16 tools
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.
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.
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.
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
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
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
- LinkMCPOAuthio.linkmcp
Hosted MCP server for LinkedIn: 31 tools for profiles, search, messaging, posts, enrichment.
MCP server for LeadDelta — manage LinkedIn connections and CRM data via AI assistants.
LinkedIn outreach MCP server — 19 tools for AI agents to prospect, sequence, and manage contacts.
Related MCP Servers
- AlicenseAqualityDmaintenanceFully featured MCP server that provides automation tools for LinkedIn, supporting browser-based scraping and API-based operations for content management, media uploads, and reactions.63MIT
- AlicenseNot gradedqualityDmaintenanceMCP 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.62MIT
- AlicenseNot gradedqualityCmaintenanceAI-powered LinkedIn automation server for content generation, profile/company data extraction, and connection request automation, integrating with MCP clients like Claude Desktop.MIT
- AlicenseBqualityCmaintenancePlaywright-powered MCP server for LinkedIn that automates jobs, profile edits, messaging, network actions, and feed posts using a real logged-in browser session.36Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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