Skip to main content
Glama
SARAMALI15792

LinkedIn Custom MCP Server

LinkedIn MCP Server

PyPI version Python 3.10+ License: MIT

A powerful Model Context Protocol (MCP) server that enables AI agents like Claude to interact seamlessly with LinkedIn's professional network. Built with FastMCP for high performance and reliability.

What is This?

This MCP server bridges the gap between AI assistants and LinkedIn, allowing them to:

  • Create and manage LinkedIn posts with text and images

  • Comment on posts and engage with content

  • Access profile information

  • Search for companies, jobs, and people

  • Automate LinkedIn interactions through natural language

Perfect for professionals who want to leverage AI to manage their LinkedIn presence efficiently.

Related MCP server: LinkedIn MCP Server

Features

Core Capabilities

  • Secure Authentication - OAuth 2.0 flow with access token management

  • Content Creation - Publish text posts and image posts

  • Content Management - Update and delete posts

  • Engagement - Comment on posts and manage comments

  • Profile Access - Retrieve authenticated user profile information

  • Company Intelligence - Search and view company profiles

  • Job Discovery - Search job postings and view details

  • People Search - Find professionals on LinkedIn

Built With

  • FastMCP - Modern Python MCP framework

  • httpx - Async HTTP client for API calls

  • Pydantic - Data validation and settings management

  • OAuth 2.0 - Industry-standard authentication

Installation

The fastest way to get started:

uvx linkedin-mcp-server

Option 2: Using pip

Install from PyPI:

pip install linkedin-mcp-server

Option 3: From Source

For development or customization:

git clone https://github.com/SARAMALI15792/LinkedIn_mcp_custom_server.git
cd LinkedIn_mcp_custom_server
pip install -e .

Quick Start Guide

Step 1: Create LinkedIn App

  1. Go to LinkedIn Developer Portal

  2. Click "Create app"

  3. Fill in required information:

    • App name: Choose a descriptive name

    • LinkedIn Page: Associate with your page or create one

    • App logo: Upload a logo (optional but recommended)

  4. Request access to these products:

    • Sign In with LinkedIn using OpenID Connect (instant approval)

    • Share on LinkedIn (instant approval)

  5. In the "Auth" tab:

    • Add Redirect URL: http://localhost:8000

    • Copy your Client ID

    • Copy your Client Secret

Step 2: Configure Environment

Create a .env file in your working directory:

LINKEDIN_CLIENT_ID=your_client_id_here
LINKEDIN_CLIENT_SECRET=your_client_secret_here
LINKEDIN_REDIRECT_URI=http://localhost:8000

Security Note: Never commit the .env file to version control. It's already in .gitignore.

Step 3: Configure Claude Desktop

Edit your Claude Desktop configuration file:

Windows: %APPDATA%\Claude\claude_desktop_config.json macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Linux: ~/.config/Claude/claude_desktop_config.json

Add the LinkedIn MCP server:

{
  "mcpServers": {
    "linkedin": {
      "command": "uvx",
      "args": ["linkedin-mcp-server"]
    }
  }
}

If installed via pip:

{
  "mcpServers": {
    "linkedin": {
      "command": "linkedin-mcp-server"
    }
  }
}

For local development:

{
  "mcpServers": {
    "linkedin": {
      "command": "python",
      "args": ["-m", "linkedin_mcp_server"],
      "env": {
        "LINKEDIN_CLIENT_ID": "your_client_id",
        "LINKEDIN_CLIENT_SECRET": "your_client_secret",
        "LINKEDIN_REDIRECT_URI": "http://localhost:8000"
      }
    }
  }
}

Step 4: Authenticate with LinkedIn

  1. Restart Claude Desktop

  2. In Claude, type: "Generate LinkedIn login URL"

  3. Copy and open the URL in your browser

  4. Sign in to LinkedIn and authorize the application

  5. You'll be redirected to http://localhost:8000/?code=...

  6. Copy the code parameter value from the URL

  7. In Claude, type: "Exchange this code: [paste the code]"

  8. Done! You're now authenticated.

Your access token is automatically saved to .env and will be used for all future requests.

Usage Examples

Authentication

User: "Generate LinkedIn login URL"
Claude: [Provides OAuth URL with instructions]

User: "Exchange this code: AQTvqXXXXXXXXXXX"
Claude: "Success! Access Token saved. Expires in 5183999 seconds."

Creating Posts

Text Post:

User: "Post to LinkedIn: Excited to announce the launch of our new AI-powered LinkedIn MCP server! Check it out on GitHub."
Claude: [Creates post and returns post URN]

Post with Image:

User: "Post this image to LinkedIn with caption 'Team celebration': C:/Users/photos/team.jpg"
Claude: [Uploads image and creates post with caption]

Managing Content

Update a Post:

User: "Update post urn:li:share:7289123456789 to say: Updated announcement..."
Claude: [Deletes old post and creates new one with updated text]

Delete a Post:

User: "Delete my post urn:li:share:7289123456789"
Claude: [Deletes the post permanently]

Engagement

Comment on Posts:

User: "Comment on post urn:li:share:7289123456789: Great insights, thanks for sharing!"
Claude: [Posts comment and returns comment URN]

View Comments:

User: "Show comments on post urn:li:share:7289123456789"
Claude: [Retrieves and displays all comments]

Profile Information

User: "What's my LinkedIn email address?"
Claude: [Retrieves profile and shows email]

User: "Show me my LinkedIn profile"
Claude: [Displays profile information: name, email, picture URL, etc.]

Company Research

User: "Search for companies: Microsoft"
Claude: [Returns list of matching companies]

User: "Get details for company urn:li:organization:1035"
Claude: [Shows company profile information]
User: "Find remote Python developer jobs"
Claude: [Searches and displays matching job postings]

User: "Search for Machine Learning Engineer positions in San Francisco"
Claude: [Returns relevant job listings]

User: "Get details for job urn:li:job:123456789"
Claude: [Shows detailed job information]
User: "Search for AI researchers at Stanford"
Claude: [Returns matching professionals]

Available Tools

Tool Name

Description

Read-Only

Destructive

linkedin_get_oauth_url

Generate OAuth 2.0 authorization URL

Yes

No

linkedin_exchange_code

Exchange auth code for access token

No

No

linkedin_get_my_profile

Get authenticated user's profile

Yes

No

linkedin_get_member_profile

Get member profile by URN

Yes

No

linkedin_create_post

Create text post

No

No

linkedin_create_image_post

Create post with image

No

No

linkedin_update_post

Update existing post (via delete + create)

No

Yes

linkedin_delete_post

Delete post permanently

No

Yes

linkedin_get_recent_posts

List recent posts

Yes

No

linkedin_create_comment

Comment on content

No

No

linkedin_get_post_comments

Get comments on post

Yes

No

linkedin_delete_comment

Delete comment permanently

No

Yes

linkedin_get_company_profile

Get company details by URN

Yes

No

linkedin_search_companies

Search for companies

Yes

No

linkedin_search_jobs

Search job postings

Yes

No

linkedin_get_job_details

Get job details by URN

Yes

No

linkedin_search_people

Search for people

Yes

No

Understanding LinkedIn URNs

LinkedIn uses URNs (Uniform Resource Names) to identify resources:

  • Person: urn:li:person:AbC123XyZ

  • Post/Share: urn:li:share:7289123456789

  • Comment: urn:li:comment:(ugcPost:7289123456789,7289987654321)

  • Organization: urn:li:organization:1035

  • Job: urn:li:job:123456789

When Claude returns a URN, you can use it to reference that resource in other commands.

API Permissions and Limitations

Available Permissions

This server requests these OAuth scopes:

  • openid - OpenID Connect authentication

  • profile - Access to profile information

  • email - Access to email address

  • w_member_social - Create posts and comments

Known Limitations

Some LinkedIn API features require additional permissions that are restricted to approved partners:

Restricted Read Operations:

  • r_member_social - Read user's posts (rarely granted to third-party apps)

  • Marketing Developer Platform - Advanced company/people search

  • Talent Solutions - Advanced job search features

What This Means:

  • Creating posts: Works perfectly

  • Deleting posts: Works perfectly

  • Reading your own posts: May not work (requires restricted permission)

  • Advanced search: May require approval for Marketing/Talent APIs

Why? LinkedIn restricts these APIs to protect user privacy and control third-party access to their platform.

Project Structure

linkedin-mcp-server/
├── linkedin_mcp_server/          # Main package
│   ├── __init__.py               # Package initialization
│   ├── __main__.py               # CLI entry point
│   ├── server.py                 # MCP server with 18 tool definitions
│   ├── config.py                 # Configuration with pydantic-settings
│   ├── utils.py                  # Shared HTTP client utilities
│   └── tools/                    # Tool implementations
│       ├── auth.py               # OAuth 2.0 authentication flow
│       ├── profile.py            # Profile retrieval operations
│       ├── post.py               # Post and comment operations
│       ├── company.py            # Company search and profiles
│       ├── job.py                # Job search operations
│       └── search.py             # People search functionality
├── pyproject.toml                # Package metadata and dependencies
├── requirements.txt              # Pinned dependencies
├── README.md                     # This file
├── claude.md                     # Claude integration guide
├── LICENSE                       # MIT License
└── get_profile.py                # Example standalone script

Development

Setting Up Development Environment

# Clone repository
git clone https://github.com/SARAMALI15792/LinkedIn_mcp_custom_server.git
cd LinkedIn_mcp_custom_server

# Install with dev dependencies
pip install -e ".[dev]"

Running Tests

pytest tests/

Code Quality

# Format code
black linkedin_mcp_server/

# Lint
ruff check linkedin_mcp_server/

# Type checking
mypy linkedin_mcp_server/

Running Locally

# Using module syntax
python -m linkedin_mcp_server

# Using installed command
linkedin-mcp-server

Troubleshooting

Authentication Issues

Problem: "Error: LINKEDIN_CLIENT_ID not configured" Solution: Create .env file with your LinkedIn app credentials

Problem: "Unauthorized (401)" errors Solution: Your access token expired. Re-authenticate using the OAuth flow

Problem: "Error exchanging code: invalid code" Solution: Authorization codes expire quickly. Generate a new OAuth URL and try again

API Errors

Problem: "Forbidden (403)" errors Solution: Your LinkedIn app may lack required permissions. Check your app's products in the Developer Portal

Problem: "r_member_social permission required" Solution: This permission is restricted. LinkedIn rarely grants it to third-party apps. Focus on write operations instead

Problem: Can't search companies/jobs/people Solution: These APIs may require Marketing/Talent Solutions products which need LinkedIn approval

Connection Issues

Problem: MCP server not connecting in Claude Desktop Solution:

  1. Verify claude_desktop_config.json syntax is valid JSON

  2. Check that the command path is correct

  3. Restart Claude Desktop

  4. Check Claude Desktop logs for error messages

Problem: ".env file not found" Solution: Create .env file in the same directory where Claude Desktop runs the server, or specify environment variables in the config

Security Best Practices

  1. Never commit credentials - .env is in .gitignore for a reason

  2. Rotate tokens regularly - Re-authenticate periodically for security

  3. Use HTTPS in production - Update redirect URI to HTTPS for production apps

  4. Minimum permissions - Only request scopes you actually need

  5. Review app access - Regularly check LinkedIn's "Apps" section in settings

Contributing

Contributions are welcome! Here's how:

  1. Fork the repository

  2. Create a feature branch: git checkout -b feature/amazing-feature

  3. Make your changes

  4. Run tests: pytest tests/

  5. Format code: black linkedin_mcp_server/

  6. Commit: git commit -m 'Add amazing feature'

  7. Push: git push origin feature/amazing-feature

  8. Open a Pull Request

Contribution Guidelines

  • Follow existing code style (Black formatter, 100 char line length)

  • Add tests for new features

  • Update documentation as needed

  • Keep commits focused and atomic

  • Write clear commit messages

Roadmap

Future enhancements being considered:

  • Token refresh flow implementation

  • Webhook support for real-time notifications

  • Enhanced error handling and retry logic

  • Pagination support for search results

  • Bulk operations for efficiency

  • Analytics and insights (if API access granted)

  • Connection management features

  • Message sending (if Messaging API access granted)

FAQ

Q: Why can't I read my own posts? A: The r_member_social permission required to read posts is restricted by LinkedIn. Most third-party apps cannot access this feature.

Q: How long do to access tokens last? A: LinkedIn controls token expiration. Typically tokens last for 60 days, but this can vary. You'll need to re-authenticate when tokens expire.

Q: Can I use this for multiple LinkedIn accounts? A: Currently, the server is designed for single-user authentication. Each .env file holds one access token.

Q: Is this officially supported by LinkedIn? A: No, this is a community project. It uses LinkedIn's public APIs but is not officially endorsed by LinkedIn.

Q: Can I use this commercially? A: Yes, the MIT license allows commercial use. However, check LinkedIn's terms of service and API usage policies.

Q: Why do some searches return empty results? A: Search APIs may require additional LinkedIn products (Marketing/Talent) that need approval. Also, API access varies by account type.

Support

Resources

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

Built with:

  • FastMCP - For the excellent MCP framework

  • Model Context Protocol - For enabling AI-agent integrations

  • LinkedIn API - For providing professional networking capabilities

  • Claude - For inspiring and testing this integration

Author

SARAM ALI


Built with care for the AI and LinkedIn communities | Report Issues | Contribute | Star on GitHub

Available Tools

17 tools
linkedin_create_commentCreate CommentB

Create a comment on a LinkedIn share, article, or video. Args: object_urn: The URN of the content to comment on (e.g., 'urn:li:share:123'). text: The text of the comment.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_urnYes
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

Annotations only provide a title, so the description carries full burden. It states 'Create a comment' implying a write/mutation operation, but lacks behavioral details such as permissions required, rate limits, whether comments are editable/deletable, or what happens on success/failure. This is inadequate for a mutation tool with no annotation coverage.

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

Conciseness4/5

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

The description is front-loaded with the core purpose in the first sentence, followed by a clear 'Args:' section listing parameters. It's efficient with minimal waste, though the structure could be slightly improved by integrating parameter details more seamlessly.

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

Completeness3/5

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

Given the tool has an output schema (which handles return values), 2 parameters with description coverage, and no complex annotations, the description is moderately complete. However, as a mutation tool, it lacks crucial behavioral context (e.g., side effects, error handling), making it incomplete for safe agent use.

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

Parameters4/5

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

Schema description coverage is 0%, but the description compensates by explaining both parameters: 'object_urn' as 'The URN of the content to comment on' with an example, and 'text' as 'The text of the comment.' This adds meaningful semantics beyond the bare schema, though it could elaborate on URN formats or text constraints.

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

Purpose4/5

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

The description clearly states the action ('Create a comment') and specifies the target resources ('on a LinkedIn share, article, or video'), which distinguishes it from sibling tools like linkedin_create_post or linkedin_delete_comment. However, it doesn't explicitly differentiate from all siblings (e.g., it could mention it's for commenting vs. posting original content).

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., authentication), exclusions, or compare it to related tools like linkedin_get_post_comments or linkedin_update_post, leaving the agent to infer usage context.

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

linkedin_create_image_postCreate Image PostB

Create a post with an image. Args: text: Post caption. image_source: Local file path or public URL of the image. visibility: 'PUBLIC' or 'CONNECTIONS'.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
image_sourceYes
visibilityNoPUBLIC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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

Annotations only provide a title, so the description carries full burden. It states this is a creation tool, implying mutation, but doesn't disclose behavioral traits like authentication needs, rate limits, or what happens on success/failure. The description adds minimal context beyond the basic action.

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

Conciseness5/5

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

The description is front-loaded with the core purpose ('Create a post with an image'), followed by a concise parameter list. Every sentence earns its place, with no wasted words, making it easy to scan and understand quickly.

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

Completeness3/5

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

Given the tool's complexity (mutation with 3 parameters), annotations are minimal (only title), and an output schema exists (so return values needn't be explained), the description is moderately complete. It covers the action and parameters but lacks behavioral context like error handling or side effects, leaving gaps for a mutation tool.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining each parameter: 'text' as the post caption, 'image_source' as a local file path or public URL, and 'visibility' with allowed values ('PUBLIC' or 'CONNECTIONS'). This clarifies semantics beyond the bare schema, though it doesn't cover all details like format constraints.

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

Purpose4/5

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

The description clearly states the verb ('Create') and resource ('post with an image'), distinguishing it from sibling tools like 'linkedin_create_post' (likely text-only) and 'linkedin_update_post'. However, it doesn't explicitly mention LinkedIn as the platform, though this is implied by the tool name and sibling context.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like 'linkedin_create_post' (presumably for text-only posts) or 'linkedin_update_post'. The description lacks context about prerequisites, such as authentication or image requirements, and doesn't mention when not to use it.

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

linkedin_create_postCreate Feed PostA

Create a new text-based update on the user LinkedIn feed. Args: text: The content of the post. visibility: 'PUBLIC' or 'CONNECTIONS'.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
visibilityNoPUBLIC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations only provide a title, so the description carries the full burden of behavioral disclosure. It indicates this is a creation tool (implying mutation) and specifies visibility options, but does not cover other behavioral traits like authentication needs, rate limits, or what happens on success/failure. The description adds some context (visibility settings) but is incomplete for a mutation tool with no annotations.

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

Conciseness4/5

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

The description is front-loaded with the core purpose in the first sentence, followed by parameter details. It is appropriately sized with no redundant information, though the parameter explanations could be slightly more integrated into the flow rather than listed separately.

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

Completeness4/5

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

Given the tool has an output schema (which handles return values), the description focuses on input semantics and purpose. It covers the basic action and parameters adequately for a creation tool, but lacks details on behavioral aspects like error handling or side effects, which would be beneficial given the mutation nature and sparse annotations.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaningful semantics by explaining 'text' as 'The content of the post' and 'visibility' with enum values 'PUBLIC' or 'CONNECTIONS', which clarifies beyond the schema's basic types. However, it does not detail constraints like text length or default behavior for visibility, leaving some gaps.

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

Purpose5/5

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

The description clearly states the specific action ('Create a new text-based update') and resource ('on the user LinkedIn feed'), distinguishing it from siblings like linkedin_create_image_post (which handles images) and linkedin_update_post (which modifies existing posts). The verb 'create' and resource 'feed post' are precise and unambiguous.

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

Usage Guidelines3/5

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

The description implies usage for text-based posts on LinkedIn feeds but does not explicitly state when to use this tool versus alternatives like linkedin_create_image_post or linkedin_update_post. It provides basic context (text-based updates) but lacks explicit guidance on exclusions or prerequisites, such as when image posts are more appropriate.

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

linkedin_delete_commentDelete CommentC

Delete a specific comment. Args: comment_urn: The URN of the comment to delete. object_urn: The URN of the parent post/object.

ParametersJSON Schema
NameRequiredDescriptionDefault
comment_urnYes
object_urnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations only provide a title, so the description carries full burden. It states 'Delete' which implies a destructive mutation, but doesn't disclose behavioral traits like irreversibility, permission requirements, rate limits, or what happens on success/failure. The output schema exists but isn't referenced.

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

Conciseness4/5

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

The description is front-loaded with the core purpose, followed by parameter details in a structured 'Args:' section. It's appropriately sized with no redundant sentences, though the parameter explanations could be more informative.

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

Completeness3/5

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

Given a destructive tool with 2 parameters, 0% schema coverage, and an output schema (which reduces need to describe returns), the description is minimally adequate. It covers purpose and parameters but lacks behavioral context and usage guidelines, leaving gaps for safe invocation.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It lists both parameters with brief explanations ('URN of the comment to delete', 'URN of the parent post/object'), adding meaning beyond the bare schema. However, it doesn't clarify URN format, examples, or relationships between parameters.

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

Purpose4/5

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

The description clearly states the verb ('Delete') and resource ('a specific comment'), making the purpose unambiguous. It distinguishes from siblings like 'linkedin_delete_post' by specifying the comment resource, though it doesn't explicitly contrast them in the description text.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'linkedin_delete_post' or 'linkedin_update_post'. It lacks context about prerequisites (e.g., ownership/permissions), error conditions, or typical scenarios for deletion.

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

linkedin_delete_postDelete PostA

Delete a LinkedIn post by its URN (e.g., 'urn:li:share:123').

ParametersJSON Schema
NameRequiredDescriptionDefault
post_urnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

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

Annotations only provide a title, so the description carries the full burden of behavioral disclosure. It mentions deletion but fails to describe critical traits like whether this action is irreversible, requires specific permissions, has rate limits, or what the output schema contains. For a destructive operation with minimal annotations, this leaves significant gaps.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the core action and includes a helpful example. There is no wasted verbiage, making it easy to parse quickly while conveying necessary information.

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

Completeness3/5

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

Given the tool's destructive nature, lack of annotations, and presence of an output schema, the description is minimally adequate but incomplete. It covers the basic purpose and parameter semantics but misses behavioral context like irreversibility or permission requirements. The output schema existence means return values need not be explained, but safety and operational details are lacking.

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

Parameters4/5

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

With 0% schema description coverage and one parameter, the description adds essential meaning by explaining that 'post_urn' is the identifier for the LinkedIn post to delete and provides an example format ('urn:li:share:123'). This compensates well for the lack of schema documentation, though it could specify more about URN sourcing or validation.

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

Purpose5/5

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

The description clearly states the specific action ('Delete') and target resource ('a LinkedIn post'), distinguishing it from sibling tools like 'linkedin_update_post' or 'linkedin_delete_comment' by specifying the exact resource type (post) and mechanism (by its URN). It provides a concrete example ('urn:li:share:123') to illustrate the required format.

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

Usage Guidelines2/5

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

The description offers no guidance on when to use this tool versus alternatives, such as 'linkedin_update_post' for modifying posts instead of deleting them, or prerequisites like needing an existing post URN. It simply states what the tool does without contextual usage instructions.

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

linkedin_exchange_codeExchange Auth CodeB

Exchange the browser-provided authorization code for a persistent access token.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations only provide a title, so the description carries the burden of behavioral disclosure. It indicates this is a mutation operation (exchanging codes for tokens) and implies persistence, but doesn't detail authentication needs, rate limits, error handling, or what 'persistent' entails. With no annotations to contradict, it adds some context but lacks depth for a critical auth tool.

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

Conciseness5/5

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

The description is a single, efficient sentence that directly states the tool's function without unnecessary words. It is front-loaded with the core action and resources, making it highly concise and well-structured for quick comprehension.

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

Completeness3/5

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

Given the tool's complexity as an OAuth exchange with 1 parameter, 0% schema coverage, and an output schema (which handles return values), the description is minimally adequate. It covers the basic purpose but lacks details on authentication flow, error cases, or integration with siblings like 'linkedin_get_oauth_url', making it incomplete for full contextual understanding.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It mentions 'browser-provided authorization code' for the 'code' parameter, adding semantic meaning beyond the schema's type definition. However, it doesn't explain the code's format, source, or validation rules, leaving gaps in parameter understanding despite the low coverage baseline.

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

Purpose4/5

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

The description clearly states the action ('Exchange') and the resources involved ('authorization code' for 'access token'), making the purpose specific and understandable. However, it doesn't explicitly differentiate this from sibling tools like 'linkedin_get_oauth_url', which might be related in the OAuth flow, leaving room for slight ambiguity in sibling context.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, such as how it fits into the OAuth flow with 'linkedin_get_oauth_url' or other auth-related operations. It lacks explicit instructions on prerequisites, timing, or exclusions, offering only a basic functional statement without contextual usage advice.

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

linkedin_get_company_profileGet Company ProfileA

Fetch a company's profile information by its URN (e.g., 'urn:li:organization:123').

ParametersJSON Schema
NameRequiredDescriptionDefault
company_urnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations only provide a title, so the description carries the full burden. It discloses the read-only nature through 'Fetch,' but lacks details on behavioral traits like rate limits, authentication needs, or error handling. No contradiction with annotations exists, but the description adds minimal value beyond the implied read operation.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the key action and resource, with no wasted words. It directly addresses the tool's function and parameter usage, making it easy to parse and understand quickly.

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

Completeness4/5

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

Given the tool's low complexity (1 parameter, no nested objects) and the presence of an output schema (which handles return values), the description is reasonably complete. It covers the core purpose and parameter usage, but could improve by adding context on authentication or error cases, though annotations are minimal.

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

Parameters4/5

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

With 0% schema description coverage and only 1 parameter, the description compensates by explaining the parameter's purpose ('company's profile information by its URN') and providing an example format ('urn:li:organization:123'). This adds meaningful semantics beyond the bare schema, though it could specify URN constraints or validation rules.

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

Purpose5/5

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

The description clearly states the specific action ('Fetch') and resource ('company's profile information'), and distinguishes it from sibling tools like 'linkedin_search_companies' by focusing on retrieval by URN rather than search. It provides a concrete example of the URN format, making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description implies usage context by specifying retrieval by URN, which helps differentiate it from search-based siblings (e.g., 'linkedin_search_companies'). However, it does not explicitly state when to use alternatives or any exclusions, such as whether it works for all company types or requires specific permissions.

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

linkedin_get_job_detailsGet Job DetailsB

Fetch details for a specific job posting by its URN.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_urnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations only provide a title, so the description carries the burden. It implies a read-only operation ('Fetch'), but doesn't disclose behavioral traits like authentication requirements, rate limits, error handling, or what details are returned. No contradiction with annotations exists, but minimal context is added.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the core purpose with no wasted words. It directly states what the tool does without unnecessary elaboration, making it easy to parse quickly.

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

Completeness4/5

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

Given the tool's low complexity (1 parameter, no nested objects) and the presence of an output schema (which handles return values), the description is reasonably complete. It covers the basic purpose but lacks usage context and detailed parameter guidance, which are minor gaps in this simple case.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains that 'job_urn' identifies 'a specific job posting', adding meaning beyond the schema's type definition. However, it doesn't clarify the URN format, examples, or where to obtain it, leaving gaps in parameter understanding.

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

Purpose4/5

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

The description clearly states the action ('Fetch details') and resource ('for a specific job posting'), distinguishing it from siblings like 'linkedin_search_jobs' which searches rather than fetches details. However, it doesn't explicitly differentiate from other get tools like 'linkedin_get_company_profile' beyond the resource type.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., authentication), when not to use it, or how it differs from similar tools like 'linkedin_search_jobs' for broader queries.

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

linkedin_get_member_profileGet Member ProfileA

Fetch a specific member's profile by their URN (e.g., 'urn:li:person:123').

ParametersJSON Schema
NameRequiredDescriptionDefault
member_urnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

Annotations only provide a title, so the description carries the burden of behavioral disclosure. It describes a read-only fetch operation, which aligns with the tool name and purpose, but does not mention rate limits, authentication requirements, error handling, or what data is returned (though an output schema exists). It adds minimal context beyond the basic action, leaving gaps in behavioral understanding.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the key information ('Fetch a specific member's profile') and includes a helpful example. There is no wasted text, and it directly supports the tool's purpose without redundancy, making it highly concise and well-structured.

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

Completeness4/5

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

Given the simple input schema (one required parameter) and the presence of an output schema, the description is mostly complete. It covers the parameter semantics well but lacks details on authentication, rate limits, or error scenarios. For a read-only fetch tool, this is adequate, though adding a bit more behavioral context would enhance completeness.

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

Parameters5/5

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

The input schema has 0% description coverage, so the description fully compensates by explaining the 'member_urn' parameter's purpose and providing a concrete example ('urn:li:person:123'). This adds essential meaning beyond the bare schema, clarifying the parameter's format and usage, which is critical for correct tool invocation.

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

Purpose5/5

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

The description clearly states the specific action ('Fetch') and resource ('a specific member's profile'), distinguishing it from sibling tools like 'linkedin_get_my_profile' (which fetches the user's own profile) or 'linkedin_search_people' (which searches for multiple profiles). It provides a concrete example of the required parameter format ('urn:li:person:123'), making the purpose unambiguous.

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

Usage Guidelines4/5

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

The description implicitly indicates when to use this tool—when you have a specific member's URN and need their profile. However, it does not explicitly state when not to use it (e.g., vs. 'linkedin_search_people' for broader searches) or mention prerequisites like authentication, though the context of sibling tools suggests it's part of a LinkedIn API suite. The guidance is clear but lacks explicit alternatives or exclusions.

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

linkedin_get_my_profileGet My ProfileA

Fetch the authenticated user's profile information (Name, Email, Picture).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior3/5

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

The description adds value beyond annotations by specifying the data fields returned (Name, Email, Picture), which isn't covered in annotations. However, it doesn't disclose additional behavioral traits like authentication requirements, rate limits, or error handling. With annotations limited to title only, the description carries more burden but does not fully compensate.

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

Conciseness5/5

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

The description is a single, well-structured sentence that efficiently conveys the tool's purpose, scope, and output fields. It is front-loaded with the key action and resource, with no wasted words.

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

Completeness4/5

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

Given the tool's low complexity (0 parameters, read-only operation implied by 'Fetch'), an output schema exists, and annotations are minimal, the description is reasonably complete. It specifies the returned data fields, which complements the output schema. However, it could benefit from mentioning authentication context or usage constraints.

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

Parameters4/5

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

The tool has 0 parameters, and schema description coverage is 100%, so no parameter documentation is needed. The description appropriately focuses on the tool's purpose without redundant parameter info, earning a high score for efficiency.

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

Purpose5/5

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

The description clearly states the specific action ('Fetch') and resource ('authenticated user's profile information'), explicitly listing the data fields returned (Name, Email, Picture). It distinguishes from siblings like 'linkedin_get_member_profile' by specifying it's for the authenticated user only.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: to fetch the authenticated user's profile. It implies when not to use it (e.g., for other users' profiles, where 'linkedin_get_member_profile' would be the alternative). This provides clear context for selection among sibling tools.

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

linkedin_get_oauth_urlGet LinkedIn Auth URLA

Generate the LinkedIn OAuth 2.0 authorization URL for browser login.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

Annotations provide only a title, so the description carries full burden. It correctly describes the tool's function but doesn't disclose behavioral traits like whether this requires prior configuration, what permissions/scopes the URL includes, rate limits, or error conditions. The description adds basic context but lacks operational details.

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

Conciseness5/5

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

Single sentence with zero waste - every word contributes essential information. Front-loaded with the core action and resource, efficiently structured for immediate understanding.

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

Completeness4/5

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

Given the tool's simple purpose (generate URL), no parameters, and existence of an output schema (which presumably documents the URL format), the description is reasonably complete. However, it could benefit from mentioning typical next steps (like redirecting users to the URL) for full context.

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

Parameters4/5

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

With 0 parameters and 100% schema description coverage, the baseline is 4. The description appropriately doesn't discuss parameters since none exist, and the schema already documents this completely.

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

Purpose5/5

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

The description clearly states the specific action ('Generate') and resource ('LinkedIn OAuth 2.0 authorization URL') with precise scope ('for browser login'). It distinguishes from sibling tools like 'linkedin_exchange_code' which handles token exchange rather than URL generation.

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

Usage Guidelines4/5

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

The description implies usage context ('for browser login') suggesting this tool is for initiating OAuth flow, but doesn't explicitly state when to use it versus alternatives like direct API calls or other auth methods. No explicit exclusions or prerequisites are mentioned.

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

linkedin_get_post_commentsGet CommentsB

Get comments for a specific post/share.

ParametersJSON Schema
NameRequiredDescriptionDefault
object_urnYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations are minimal (only a title), so the description carries the burden of behavioral disclosure. It implies a read-only operation by using 'Get', but does not specify aspects like authentication needs, rate limits, pagination, or error handling. No contradiction with annotations exists, but it adds limited context beyond the basic action.

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

Conciseness5/5

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

The description is a single, direct sentence with no wasted words, making it highly concise and front-loaded. Every part contributes to understanding the tool's basic function efficiently.

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

Completeness3/5

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

Given the tool's moderate complexity (a read operation with one parameter) and the presence of an output schema (which handles return values), the description is minimally adequate. However, with no annotations and low parameter coverage, it should provide more context on usage and parameters to be fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for undocumented parameters. It mentions 'for a specific post/share', which hints at the 'object_urn' parameter's purpose, but does not explain the format, syntax, or how to obtain it. This adds some meaning but is insufficient for full clarity.

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

Purpose4/5

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

The description clearly states the action ('Get') and target resource ('comments for a specific post/share'), making the purpose understandable. However, it does not explicitly differentiate from sibling tools like 'linkedin_get_recent_posts' or 'linkedin_search_companies', which might also involve retrieving content, so it lacks sibling distinction for a perfect score.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It does not mention prerequisites, such as needing a valid post identifier, or compare it to siblings like 'linkedin_get_recent_posts' for broader queries, leaving usage context implied at best.

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

linkedin_get_recent_postsGet Recent PostsA

List the user's recent posts (Requires 'r_member_social' permission).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations are minimal (only a title), so the description carries the burden of behavioral disclosure. It adds the permission requirement, which is valuable context beyond the annotations. However, it doesn't describe other traits like rate limits, pagination, or what 'recent' means in terms of time range, leaving gaps in behavioral understanding.

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

Conciseness5/5

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

The description is a single, efficient sentence that states the action and includes a key prerequisite. It is front-loaded with the main purpose and avoids any unnecessary details, making it highly concise and well-structured.

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

Completeness3/5

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

Given the tool's complexity (a read operation with no parameters) and the presence of an output schema (which handles return values), the description is adequate but minimal. It covers the purpose and a permission requirement, but lacks details on behavioral aspects like scope or limitations, making it just sufficient for basic use.

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

Parameters4/5

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

The input schema has 0 parameters with 100% coverage, meaning no parameters are documented in the schema. The description doesn't mention any parameters, which is appropriate here. It adds no semantic details beyond the schema, but with zero parameters, the baseline is 4 as it doesn't need to compensate for missing information.

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

Purpose4/5

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

The description clearly states the verb ('List') and resource ('user's recent posts'), making the purpose specific and understandable. However, it doesn't explicitly differentiate from sibling tools like 'linkedin_get_post_comments' or 'linkedin_search_people', which might also retrieve posts or related content, so it falls short of a perfect score.

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

Usage Guidelines3/5

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

The description includes a prerequisite ('Requires 'r_member_social' permission'), which provides some context for when to use it, but it doesn't offer explicit guidance on when to choose this tool over alternatives like 'linkedin_get_post_comments' or 'linkedin_search_people' for post-related queries. Usage is implied rather than fully specified.

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

linkedin_search_companiesSearch CompaniesB

Search for companies on LinkedIn by keywords.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations only provide a title, so the description carries the burden of behavioral disclosure. It states the search functionality but doesn't add context about rate limits, authentication needs, result format, or pagination. This is minimal but not contradictory, scoring a baseline 3 for adding some value beyond the sparse annotations.

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

Conciseness5/5

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

The description is a single, efficient sentence with zero waste. It's front-loaded and appropriately sized for the tool's complexity, earning a top score for conciseness.

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

Completeness3/5

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

Given the tool has an output schema (which handles return values) and low complexity, the description is somewhat complete but lacks usage context and behavioral details. It's adequate as a basic search tool description but misses opportunities to guide the agent effectively.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It mentions 'by keywords,' which aligns with the single parameter 'keywords,' adding semantic meaning. However, it doesn't detail syntax, format, or examples, leaving gaps. With one parameter and partial compensation, a score of 3 is appropriate.

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

Purpose4/5

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

The description clearly states the action ('Search for companies') and the resource ('on LinkedIn'), providing a specific verb+resource combination. However, it doesn't explicitly differentiate from sibling tools like 'linkedin_search_people' or 'linkedin_search_jobs', which would require a 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'linkedin_get_company_profile' or other search tools. It lacks context about use cases, prerequisites, or exclusions, offering only a basic functional statement.

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

linkedin_search_jobsSearch JobsB

Search for jobs on LinkedIn by keywords and optional location.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsYes
locationNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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

Annotations only provide a title, so the description carries full burden. It mentions searching but doesn't disclose behavioral traits like pagination, result limits, authentication requirements, rate limits, or what the output contains. For a search tool with no annotation coverage, this leaves significant gaps in understanding its operation.

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

Conciseness5/5

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

The description is a single, efficient sentence that front-loads the core purpose. Every word earns its place, with no redundant information or unnecessary elaboration, making it easy to parse quickly.

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

Completeness3/5

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

Given the tool's moderate complexity (search with two parameters), no annotations, and an output schema present, the description is minimally adequate. It covers the basic purpose but lacks context on usage, behavior, and parameter details, relying on the output schema for return values without explaining them.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining that 'keywords' are used for searching and 'location' is optional, which clarifies beyond the bare schema. However, it doesn't detail format (e.g., city names, coordinates) or constraints, leaving parameters partially documented.

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

Purpose4/5

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

The description clearly states the action ('Search for jobs') and resource ('on LinkedIn'), with specific filtering criteria ('by keywords and optional location'). It distinguishes from siblings like linkedin_search_companies or linkedin_search_people by focusing on jobs, but doesn't explicitly differentiate from other job-related tools like linkedin_get_job_details.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to choose this over linkedin_get_job_details (for specific job details) or linkedin_search_companies/people (for other search types), nor does it specify prerequisites like authentication or rate limits.

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

linkedin_search_peopleSearch PeopleC

Search for people on LinkedIn by keywords.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

Annotations only provide a title, so the description carries full burden for behavioral disclosure. It mentions searching by keywords but doesn't explain what the search returns (e.g., profiles, contact info), any limitations (e.g., rate limits, authentication needs), or how results are structured. This leaves significant gaps for a search tool.

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

Conciseness5/5

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

The description is a single, direct sentence with no wasted words, making it highly concise and front-loaded. It efficiently communicates the core function without unnecessary elaboration, earning full marks for brevity and clarity.

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

Completeness3/5

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

Given the tool's low complexity (one parameter) and the presence of an output schema, the description is minimally adequate. However, it lacks details on behavioral aspects like search scope or limitations, and with no annotations to fill gaps, it doesn't fully prepare an agent for effective use, scoring at the baseline for viability.

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

Parameters2/5

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

With 0% schema description coverage and one parameter ('keywords'), the description adds minimal value beyond the schema. It specifies that searching is 'by keywords,' which gives a hint about the parameter's purpose, but doesn't detail format, examples, or constraints, failing to compensate for the low schema coverage.

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

Purpose4/5

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

The description clearly states the action ('Search for people') and resource ('on LinkedIn'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'linkedin_search_companies' or 'linkedin_search_jobs' beyond the resource type, which keeps it from a perfect score.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'linkedin_get_member_profile' for specific profiles or 'linkedin_search_companies' for company searches. It lacks context about use cases, prerequisites, or exclusions, offering only a basic functional statement.

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

linkedin_update_postUpdate PostA

Update a post's text. ⚠️ Warning: This deletes the old post and creates a new one with a new ID, as LinkedIn does not support editing published posts via API.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_urnYes
textYes
visibilityNoPUBLIC

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only provide a title, so the description carries full burden. It discloses key behavioral traits: the operation deletes the old post and creates a new one with a new ID, and notes LinkedIn's API limitation. This adds crucial context beyond basic annotations.

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

Conciseness5/5

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

Two sentences, front-loaded with the core purpose followed by a critical warning. Every word earns its place, with no redundancy or fluff, making it highly efficient.

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

Completeness5/5

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

Given the tool's complexity (destructive update), lack of rich annotations, and presence of an output schema, the description is complete. It covers purpose, behavioral nuances, and usage context, compensating well for minimal structured data.

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

Parameters4/5

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

With 0% schema description coverage, the description adds value by implying parameters (post_urn for the post to update, text for new content). However, it doesn't detail all three parameters (e.g., visibility's default or meaning), leaving some gaps.

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

Purpose5/5

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

The description clearly states the specific action ('Update a post's text') and resource ('post'), distinguishing it from siblings like linkedin_create_post (creation) and linkedin_delete_post (deletion). It precisely defines the operation's scope.

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

Usage Guidelines5/5

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

It explicitly states when to use this tool (to update post text) and provides a critical warning about LinkedIn's API limitation, which implicitly guides usage by highlighting its destructive nature and alternative considerations. This addresses the tool's unique context among siblings.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 17 tool updates
    • First observedlinkedin_create_comment
    • First observedlinkedin_create_image_post
    • First observedlinkedin_create_post
    • First observedlinkedin_delete_comment
    • First observedlinkedin_delete_post
    • First observedlinkedin_exchange_code
    • First observedlinkedin_get_company_profile
    • First observedlinkedin_get_job_details
    • First observedlinkedin_get_member_profile
    • First observedlinkedin_get_my_profile
    • First observedlinkedin_get_oauth_url
    • First observedlinkedin_get_post_comments
    • First observedlinkedin_get_recent_posts
    • First observedlinkedin_search_companies
    • First observedlinkedin_search_jobs
    • First observedlinkedin_search_people
    • First observedlinkedin_update_post

TDQS

A3.7/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose targeting specific LinkedIn resources and actions. For example, linkedin_create_post, linkedin_create_image_post, and linkedin_create_comment handle different content types, while search tools (companies, jobs, people) and get tools (profile, post details) are well-separated. No tools appear to overlap in functionality.

Naming Consistency5/5

All tools follow a consistent 'linkedin_verb_noun' pattern with snake_case throughout. The verbs are appropriate and predictable (e.g., create, delete, get, search, update), and nouns clearly indicate the resource (e.g., post, comment, profile). There are no deviations in naming conventions.

Tool Count4/5

With 17 tools, the count is slightly high but reasonable for a comprehensive LinkedIn API server covering posts, comments, profiles, companies, jobs, and OAuth. It includes core CRUD operations and search functionalities, though it might benefit from slight consolidation in some areas like OAuth-related tools.

Completeness4/5

The tool set provides strong coverage for LinkedIn's social and professional features, including create, read, update, delete for posts and comments, profile fetching, and searches. Minor gaps include lack of tools for liking/reacting to content or managing connections, but agents can perform core workflows effectively without dead ends.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    Not graded
    maintenance
    Enables AI assistants to interact with LinkedIn and LinkedIn Sales Navigator for searching profiles, managing leads, and handling messaging via cookie-based authentication. It supports professional networking tasks such as sending connection requests and retrieving account details through the Model Context Protocol.
    22
    1
    -
  • A
    license
    B
    quality
    C
    maintenance
    Enables AI agents to manage LinkedIn profiles, posts, connections, skills, education, and certifications through the LinkedIn API.
    18
    176
    64
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents with read/write access to LinkedIn API, including profile, posts, media, organizations, comments, reactions, and analytics.
    20
    15
    MIT

Latest Blog Posts

MCP directory API

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

curl -X GET 'https://glama.ai/api/mcp/v1/servers/SARAMALI15792/Linkedin_mcp_custom_server'

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