linkedin-safe-mcp
linkedin-safe-mcp
一个 MCP 服务器,为 AI 代理(Claude Code、Codex、Claude Desktop、Cursor 等)提供 LinkedIn 超能力——同时不会让你的 LinkedIn 账号面临风险:
发布到 LinkedIn ——通过 LinkedIn 的官方 API(OAuth,符合服务条款)发布文本、链接和图片,此外还支持评论和点赞。
搜索职位 ——通过 LinkedIn 的公开访客端点使用关键词/地点/远程/经验/日期筛选。无需登录,无需 cookie:你的账号完全不参与。
管理求职流程 ——一个本地 SQLite 申请跟踪器(感兴趣 → 已申请 → 面试中 → 录用),带有备注和每个职位的发布快照,因此即使职位发布被撤下,代理也能管理你的管道并撰写量身定制的求职信。
为什么这样设计?
LinkedIn 没有官方的职位搜索 API,而非官方途径(使用你的 li_at 会话 cookie 的 Voyager 内部 API、在你已登录会话上运行无头浏览器)违反了 LinkedIn 用户协议 §8.2,并且经常导致账号被限制。这个服务器刻意在两者之间取得平衡:
关注点 | 处理方式 | 账号风险 |
发布、评论、点赞 | 官方 REST API,你自己的 OAuth 应用, | 无——官方认可 |
职位搜索与详情 | 访客端点(未登录的职位页面),按 IP 限流 | 无——不涉及任何凭据 |
管道跟踪 | 你机器上的本地 SQLite | 无——绝不接触 LinkedIn |
Easy Apply、私信、信息流阅读 | 刻意不包含——没有违反服务条款的访问方式就无法实现 | — |
Related MCP server: LinkedIn Buddy
环境要求
Python 3.11+ 和 uv
仅发布功能需要:一个免费的自助式 LinkedIn 开发者应用(下方 5 分钟设置)。职位搜索和跟踪器零设置即可使用。
安装并连接到你的代理
克隆/复制此目录,然后将其注册到你的 MCP 客户端。下面的 <REPO> 是此项目的绝对路径。
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或者在项目的 .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)——与上面的 .mcp.json 具有相同的 JSON 结构。
LINKEDIN_CLIENT_* 变量仅发布功能需要;如果你只需要职位搜索和跟踪,可以省略它们。
启用发布功能(一次性 LinkedIn 应用设置)
前往 https://www.linkedin.com/developers/apps → 创建应用(需要关联任意 LinkedIn 主页;你可以创建一个简单的)。
在应用的 Products 标签页中,添加 Share on LinkedIn 和 Sign In with LinkedIn using OpenID Connect。
在 Auth 标签页中,添加重定向 URL
http://localhost:8765/callback。将 Client ID 和 Client Secret 复制到上面显示的 env 变量中。
进行一次身份验证——两种方式都可以:
在终端中:
uv run --directory <REPO> linkedin-safe-mcp auth或者直接让你的代理发布一些内容;它会调用
login工具并把授权 URL 交给你。
令牌存储在 ~/.linkedin-mcp/tokens.json(权限 0600)中,有效期约 60 天;LinkedIn 不会为自助式应用签发刷新令牌,因此到期后你需要重新运行登录(auth_status 会准确告诉代理何时到期)。
工具
工具 | 需要认证 | 功能 |
| – | 报告配置/认证状态,并给出确切的后续步骤 |
| – | 浏览器 OAuth 流程 / 删除已存储的令牌 |
| ✓ | 已连接账号的姓名、电子邮件、person URN |
| ✓ | 发布帖子:文本(+话题标签),可选链接或本地图片; |
| ✓ | 删除你自己的帖子(URN 或帖子 URL) |
| ✓ | 评论帖子(URN 或帖子 URL) |
| ✓ | 点赞帖子(URN 或帖子 URL) |
| – | 筛选条件:地点、远程/混合/现场、发布时间、经验级别、职位类型、仅限 Easy Apply、排序;最多 50 条结果 |
| – | 完整职位发布:描述、资历、类型、薪资(如有列出)、申请人数、外部申请 URL |
| – | 将职位快照保存到本地跟踪器 |
| – | 单个职位及历史记录 / 管道概览及状态计数 |
| – | 感兴趣 → 已申请 → 面试中 → 录用 / 已拒绝 / 已撤回 / 已归档,并附备注 |
| – | 添加备注 / 删除职位 |
代理可以用它做这些事情:“查找本周发布的远程 staff-engineer 职位,保存有潜力的,根据保存的职位描述撰写量身定制的求职信,标记我已申请的职位,并发布我开源工作的摘要。”
配置
环境变量 | 默认值 | 用途 |
| – | LinkedIn 应用凭据(仅发布功能) |
|
| 令牌和跟踪器数据库的存放位置 |
|
| OAuth 回调端口(必须与应用的重定向 URL 匹配) |
|
|
|
|
|
|
| 一个 Chrome UA | 用于访客职位请求的 UA |
行为说明与限制
发布:LinkedIn 将成员发布限制为每天 150 次请求,并拒绝最近帖子的完全重复内容(422)。帖子文本中的保留字符会自动转义以适配版本化 API,因此括号不会导致错误;话题标签会被保留。
职位搜索:访客端点按 IP 限流(HTTP 429)。服务器会缓存结果(搜索 10 分钟 / 职位详情 6 小时),使用退避重试,并控制多页获取的节奏;如果持续收到 429,它会向代理返回一个明确的“请稍等一分钟”错误。请保持
limit适度。抓取姿态:访客职位搜索以接近人类的速度读取与未登录访客看到的相同的公共页面,并通过缓存尽量减少负载。不过,LinkedIn 随时可能更改或限制这些端点——解析器由 fixture 测试固定,因此一旦出现问题会大声报错,工具错误也始终可供代理采取行动。
开发
uv sync # install deps (Python ≥3.11)
uv run pytest # 48 tests: parsers vs live fixtures, payloads, OAuth, tracker,
# 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布局:src/linkedin_mcp/ —— server.py(工具表面)· api/(官方 REST:帖子、社交操作、上传、双 rest/ugc 后端)· auth/(OAuth + 令牌存储)· jobs/(访客客户端、HTML 解析器、筛选映射)· tracker/(SQLite 存储)· cli.py(serve | auth | status | logout)。
路线图
发布到 PyPI(
uvx linkedin-safe-mcp一行命令)点赞之外的反应类型;多图帖子;投票帖子
在同一工具模式后面提供可选的第三方职位数据提供商
用于远程/托管使用的
streamable-http传输(已考虑,仅限选择加入,默认关闭)基于 cookie 的 Voyager 提供商,用于个性化功能——并带有强烈警告,因为它违反 LinkedIn 的服务条款
许可证
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.
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
Related MCP Connectors
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Hosted LinkedIn MCP server on your own account: 35 tools for search, profiles, inbox, posts, pages.
A hosted LinkedIn MCP server for your own account. Paste one address into Claude, ChatGPT, Cursor or n8n to read your inbox, send messages and invitations, and search people. Free to start. Not made by LinkedIn.
LinkedIn MCP with 47 tools: post, comment, DM and run comment-to-DM automations inside your limits.
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.64MIT
- 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.3 npm3MIT
- AlicenseBqualityDmaintenancePlaywright-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
- AlicenseNot gradedqualityCmaintenanceMCP server for AI-native LinkedIn prospecting. It enables lead research, audience building, conversation management, and controlled outreach actions such as messaging and publishing through an OAuth-protected remote endpoint.2MIT