Marketing & SEO
Google Search Console
Request indexing, removals, users and index reports for your sites.
15 endpoints
Schedule posts, answer comments and messages, invite leads and search people and companies from your AI agent. It works in your own signed-in LinkedIn, so there is no API key or developer app. Cotlet runs it hosted, around the clock.
15 tools Read and write
LinkedIn has no official MCP server, and most of its official API needs an approved application (checked 6 Nov 2026). Cotlet adds 15 LinkedIn tools for Claude, ChatGPT and scripts: no API key to request, no developer app to register, hosted all day, and one account for your other apps too.
| What you need | Official API | GitHub server | Cotlet |
|---|---|---|---|
| Post and comment as yourself | Yes, your own app | Depends on the server | Yes, after your OK |
| Send messages and invitations | No | Some servers | Yes, after your OK |
| Search people and companies | No | Yes | Yes |
| No developer app to register | Register and apply | Yes | Yes |
| Runs with your computer off | Yes | Mostly no | Yes, hosted |
| Inside the Claude and ChatGPT apps | You build the tools | Claude Desktop and Code | Yes |
Checked 6 Nov 2026. Sources: Microsoft Learn: Getting Access to LinkedIn APIs · Microsoft Learn: Community Management API overview · Zapier: LinkedIn integrations · Zapier MCP for LinkedIn
Once, in a browser we run for you.
Paste one address.
The agent works in your account.
We never see or store your LinkedIn password, and every post, comment, message or invitation waits for your OK. Who can see your session
Three steps, then one code block for your client.
Enable LinkedIn for agents. Sign up, sign in to LinkedIn in its Cloud Browser with your own login, then press Enable for agents.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as a custom MCP server or connector in your agent.
Approve the connection. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts use an API key from the console.
One shared address, https://cotlet.dev/mcp/v1, also carries LinkedIn next to your other apps. Turned LinkedIn on after connecting? Refresh the connector so the agent sees the 15 new tools.
Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet-linkedin \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet-linkedin": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet-linkedin]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: linkedin_read Make: MCP Client > Call a tool
Zapier: MCP Client by Zapier > Run Tool
Server URL: https://cotlet.dev/mcp/v1
Token: <your key>
Tool: linkedin_write A post can go out now or at a set time. Give as_page to work as a Company Page you administer.
Returns posts from your profile activity, newest first. Pass as_page to read the posts of a Company Page you administer. Each post has a post_id for list_post_comments and comment_on_post, and the counts LinkedIn shows under the post. Scheduled posts are listed with status scheduled and their publish time.
MCP calllinkedin_read → list_my_posts
REST endpointGET https://cotlet.dev/api/v1/linkedin/my-posts
| Name | Type | Description |
|---|---|---|
| as_page string | string | Name of a Company Page you administer, to act as that Page. Leave out to act as yourself. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"posts": [
{
"post_id": "p_7390001",
"text": "Why we dropped the weekly report",
"status": "published",
"reactions": 58,
"comments": 12,
"posted_at": "2026-11-03T08:00:00Z",
"url": "https://www.linkedin.com/feed/update/p_7390001"
},
{
"post_id": "p_7390002",
"text": "Three questions to ask before hiring an agency",
"status": "published",
"reactions": 94,
"comments": 31,
"posted_at": "2026-10-30T08:00:00Z",
"url": "https://www.linkedin.com/feed/update/p_7390002"
}
],
"next_cursor": "c_3"
} Returns the comments under one post in the order LinkedIn shows them, with the commenter name, headline and comment text. replied is true when you already answered that comment. Pass comment_id to comment_on_post to reply in the thread.
MCP calllinkedin_read → list_post_comments
REST endpointGET https://cotlet.dev/api/v1/linkedin/post-comments
| Name | Type | Description |
|---|---|---|
| post_id string required | string | Post ID from list_my_posts. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"post_id": "post_8c41d2"
} {
"comments": [
{
"comment_id": "c_5521",
"author": "Jonas Weber",
"headline": "Head of Growth at Example GmbH",
"text": "How long did the switch take?",
"replied": false,
"posted_at": "2026-11-04T09:12:00Z"
}
],
"next_cursor": null
} Creates a text post, with a link in the text if you add one. visibility is anyone or connections, and comments is anyone, connections or off, as in the post settings. Set schedule_at to schedule it instead of publishing now. Returns the post_id and the post URL. By default you confirm each call; you can switch that off for this tool.
MCP calllinkedin_write → create_post
REST endpointPOST https://cotlet.dev/api/v1/linkedin/posts
| Name | Type | Description |
|---|---|---|
| text string required | string | Post text. |
| visibility enum | enum | anyone or connections. Default: anyone. |
| comments enum | enum | Who can comment: anyone, connections or off. Default: anyone. |
| schedule_at datetime | datetime | ISO 8601 time to publish at. Leave out to post now. |
| as_page string | string | Name of a Company Page you administer, to act as that Page. Leave out to act as yourself. |
{
"text": "Three questions to ask before hiring an agency. 1) Who does the work? 2) How do you report? 3) What happens if we stop?",
"visibility": "anyone",
"comments": "anyone",
"schedule_at": "2026-11-10T09:00:00+01:00"
} {
"post_id": "p_7390010",
"status": "scheduled",
"publish_at": "2026-11-10T09:00:00+01:00",
"url": "https://www.linkedin.com/feed/update/p_7390010"
} Posts a text comment under a post as you, or as a Company Page you administer. Pass comment_id to reply inside a thread. Returns the new comment_id. By default you confirm each call; you can switch that off for this tool.
MCP calllinkedin_write → comment_on_post
REST endpointPOST https://cotlet.dev/api/v1/linkedin/posts/{post_id}/replies
| Name | Type | Description |
|---|---|---|
| post_id string required | string | Post ID from list_my_posts or a post URL. |
| text string required | string | Comment text. |
| comment_id string | string | Comment ID from list_post_comments, to reply to that comment. |
| as_page string | string | Name of a Company Page you administer, to act as that Page. Leave out to act as yourself. |
{
"post_id": "post_8c41d2",
"text": "text"
} {
"comment_id": "c_5530",
"post_id": "p_7390002",
"status": "published"
} Read only. What a profile shows follows your connection degree, as it does when you look yourself.
Runs the LinkedIn people search with the filters you set and returns one page of matches: name, headline, location and connection degree. Results follow the order LinkedIn shows. Use get_profile on a match for the full profile. What you see depends on your account and the connection degree.
MCP calllinkedin_read → search_people
REST endpointGET https://cotlet.dev/api/v1/linkedin/peoples/search
| Name | Type | Description |
|---|---|---|
| keywords string required | string | Search words, for example a job title. |
| location string | string | Place name as LinkedIn shows it in the Locations filter. |
| company string | string | Current company name. |
| connection_degree enum | enum | 1st, 2nd or 3rd. Default: all. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"keywords": "keywords"
} {
"people": [
{
"name": "Anna Keller",
"headline": "Head of Marketing at Example Software",
"location": "Berlin, Germany",
"connection_degree": "2nd",
"url": "https://www.linkedin.com/in/anna-keller-example"
},
{
"name": "Lukas Brandt",
"headline": "Head of Marketing at Sample Cloud",
"location": "Berlin, Germany",
"connection_degree": "3rd",
"url": "https://www.linkedin.com/in/lukas-brandt-example"
}
],
"next_cursor": "c_2"
} Runs the LinkedIn company search and returns one page of Company Pages: name, industry, size range as LinkedIn shows it, location and follower count. Use the company name in search_people to find the people who work there.
MCP calllinkedin_read → search_companies
REST endpointGET https://cotlet.dev/api/v1/linkedin/companies/search
| Name | Type | Description |
|---|---|---|
| keywords string required | string | Search words, for example a product category. |
| location string | string | Place name as LinkedIn shows it in the Locations filter. |
| industry string | string | Industry name as LinkedIn shows it in the Industry filter. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"keywords": "keywords"
} {
"companies": [
{
"name": "Sample Freight Software",
"industry": "Software Development",
"size": "51-200 employees",
"location": "Rotterdam, Netherlands",
"followers": 4210,
"url": "https://www.linkedin.com/company/sample-freight-software"
}
],
"next_cursor": null
} Opens one member profile as you see it while signed in. Returns the headline, location, current company and role, the about text and recent positions. connection_degree tells whether the person is a 1st, 2nd or 3rd degree connection, which decides whether send_message or send_invitation fits. Leave profile empty to read your own profile.
MCP calllinkedin_read → get_profile
REST endpointGET https://cotlet.dev/api/v1/linkedin/profile
| Name | Type | Description |
|---|---|---|
| profile string | string | Profile URL or the part after /in/. Default: your own profile. |
{
"name": "Anna Keller",
"headline": "Head of Marketing at Example Software",
"location": "Berlin, Germany",
"company": "Example Software",
"connection_degree": "2nd",
"mutual_connections": 4,
"about": "I lead demand generation for a B2B software team.",
"url": "https://www.linkedin.com/in/anna-keller-example"
} A withdrawn invitation tells nobody. LinkedIn blocks a new invitation to the same person for up to three weeks.
Reads My Network, Connections, in the order LinkedIn shows it (recently added first). Each row has the name, headline, profile URL and connected_at. Use search to filter by name, company or title.
MCP calllinkedin_read → list_connections
REST endpointGET https://cotlet.dev/api/v1/linkedin/connections
| Name | Type | Description |
|---|---|---|
| search string | string | Filter by name, company or title. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"connections": [
{
"name": "Marta Nowak",
"headline": "Founder at Example Studio",
"connected_at": "2026-10-28",
"url": "https://www.linkedin.com/in/marta-nowak-example"
}
],
"next_cursor": "c_2"
} Reads My Network, Manage invitations. direction is received or sent. Each row has an invitation_id for accept_invitation or withdraw_invitation, the person, their headline, the note if there is one and the date.
MCP calllinkedin_read → list_invitations
REST endpointGET https://cotlet.dev/api/v1/linkedin/invitations
| Name | Type | Description |
|---|---|---|
| direction enum | enum | received or sent. Default: received. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"invitations": [
{
"invitation_id": "i_4410",
"direction": "received",
"name": "Tom Becker",
"headline": "Operations Manager at Sample Logistics",
"note": "Saw your post on reporting.",
"sent_at": "2026-11-04"
}
],
"next_cursor": null
} Sends a connection invitation from the person's profile, with a note if you give one. The person gets it in My Network, Manage invitations. It stays pending until they accept or you withdraw it. Returns the invitation_id. By default you confirm each call; you can switch that off for this tool.
MCP calllinkedin_write → send_invitation
REST endpointPOST https://cotlet.dev/api/v1/linkedin/invitations
| Name | Type | Description |
|---|---|---|
| profile string required | string | Profile URL or the part after /in/. |
| note string | string | Optional note shown with the invitation. |
{
"profile": "profile"
} {
"invitation_id": "i_4502",
"status": "pending",
"name": "Anna Keller"
} Accepts one received invitation from Manage invitations. The person becomes a connection and LinkedIn tells them. Returns the new connection. By default you confirm each call; you can switch that off for this tool.
MCP calllinkedin_write → accept_invitation
REST endpointPOST https://cotlet.dev/api/v1/linkedin/invitations/{invitation_id}/accept
| Name | Type | Description |
|---|---|---|
| invitation_id string required | string | Invitation ID from list_invitations. |
{
"invitation_id": "invitation_8c41d2"
} {
"invitation_id": "i_4410",
"status": "accepted",
"name": "Tom Becker"
} Withdraws one sent invitation from Manage invitations. The person is not notified, and one call undoes nothing for anyone else, so it needs no confirmation. LinkedIn does not allow a new invitation to the same person for up to three weeks after a withdrawal.
MCP calllinkedin_write → withdraw_invitation
REST endpointPOST https://cotlet.dev/api/v1/linkedin/invitations/{invitation_id}/withdraw
| Name | Type | Description |
|---|---|---|
| invitation_id string required | string | Invitation ID from list_invitations with direction sent. |
{
"invitation_id": "invitation_8c41d2"
} {
"invitation_id": "i_4502",
"status": "withdrawn"
} You message connections directly. People outside your network need InMail, a Premium feature.
Reads Messaging and returns the threads in the order LinkedIn shows them. Each has a conversation_id, the people in it, the last message and last_from, which is you or them. unread_only returns only threads with unread messages.
MCP calllinkedin_read → list_conversations
REST endpointGET https://cotlet.dev/api/v1/linkedin/conversations
| Name | Type | Description |
|---|---|---|
| unread_only boolean | boolean | Only threads with unread messages. Default: false. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"conversations": [
{
"conversation_id": "m_8802",
"with": "Tom Becker",
"last_message": "Thanks, can you send the pricing?",
"last_from": "them",
"unread": true,
"last_at": "2026-11-05T14:20:00Z"
}
],
"next_cursor": null
} Returns the messages of one thread in order, each with the sender, text and time. Opening a thread marks it as read in LinkedIn, the same as opening it yourself.
MCP calllinkedin_read → read_conversation
REST endpointGET https://cotlet.dev/api/v1/linkedin/conversations/{conversation_id}/read
| Name | Type | Description |
|---|---|---|
| conversation_id string required | string | Conversation ID from list_conversations. |
| limit integer | integer | How many results to return. Default: 10. |
| cursor string | string | Next page cursor from the previous call. |
{
"conversation_id": "conversation_8c41d2"
} {
"messages": [
{
"from": "you",
"text": "Hi Tom, thanks for connecting.",
"sent_at": "2026-11-04T10:00:00Z"
},
{
"from": "Tom Becker",
"text": "Thanks, can you send the pricing?",
"sent_at": "2026-11-05T14:20:00Z"
}
],
"next_cursor": null
} Sends a text message as you. Give conversation_id to answer in a thread, or recipient (a profile URL) to start one. LinkedIn lets you message your connections directly; for people you are not connected to it needs InMail, a Premium feature. Returns the message time. By default you confirm each call; you can switch that off for this tool.
MCP calllinkedin_write → send_message
REST endpointPOST https://cotlet.dev/api/v1/linkedin/messages
| Name | Type | Description |
|---|---|---|
| text string required | string | Message text. |
| conversation_id string | string | Conversation ID from list_conversations. Use this or recipient. |
| recipient string | string | Profile URL of a connection. Use this or conversation_id. |
{
"text": "text"
} {
"conversation_id": "m_8802",
"status": "sent",
"sent_at": "2026-11-06T09:15:00Z"
} Your signed-in LinkedIn browser profile, encrypted with AES-256-GCM, in Finland. We never see or store your password.
The 15 LinkedIn tools. Never the cookie or the login.
Your own LinkedIn: feed, posts, messages, connections and invitations, and the Company Pages you administer.
Billing, Premium, password, two-step verification, account settings and ads.
A code goes to you by email or phone. You type it in, we never do.
Disable for agents, reset the browser or delete the API key. The next call fails.
cotlet.dev gets A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results). There is no SOC 2 report or third-party pentest yet.
| Action | What LinkedIn says |
|---|---|
| create_post as yourself | A post can be scheduled from 10 minutes to 3 months ahead. Events, Jobs and Services posts cannot be scheduled. |
| create_post with as_page | Only a super admin or a content admin of the Page can schedule. Posts can be scheduled from an hour to three months ahead. |
| comment_on_post with as_page | LinkedIn lets you react or comment as the Page: pick the Page next to your profile picture on the post. |
| create_post, visibility | Anyone, Connections only or a Group. Who can comment: anyone, connections only or off. A post holds up to 3,000 characters. |
Scheduled posts are the safe start: you see each one in LinkedIn's scheduled posts list before it goes out.
The tools read each screen as your account shows it. When LinkedIn moves a button or renames a field, the fix is on our side. status.cotlet.dev checks the site, console and API every 3 minutes.
| Action | Undo |
|---|---|
| Publish a post | Delete or edit it in LinkedIn; people who saw it have seen it |
| Schedule a post | Change or delete it in LinkedIn before it goes out |
| Comment on a post | Delete your comment in LinkedIn; the author may have been told |
| Send a message | No tool unsends it |
| Send an invitation | withdraw_invitation; a new one to the same person waits up to three weeks |
| Accept an invitation | Remove the connection in LinkedIn; the person was told |
5 of 15 tools ask first: create_post, comment_on_post, send_message, send_invitation and accept_invitation, the ones that reach another person. withdraw_invitation tells nobody, so it runs at once with the 9 reads. Turn the wait off per tool for a scheduled run, such as a weekly post.
A withdrawn invitation cannot be bulk-withdrawn in LinkedIn and the person is not told.
{
"name": "create_post",
"arguments": {
"text": "Three questions to ask before hiring an agency. 1) Who does the work? 2) How do you report? 3) What happens if we stop?",
"visibility": "anyone",
"comments": "anyone",
"schedule_at": "2026-11-10T09:00:00+01:00"
}
} curl -X POST https://cotlet.dev/api/v1/linkedin/posts \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Three questions to ask before hiring an agency. 1) Who does the work? 2) How do you report? 3) What happens if we stop?","visibility":"anyone","comments":"anyone","schedule_at":"2026-11-10T09:00:00+01:00"}' {
"post_id": "p_7390010",
"status": "scheduled",
"publish_at": "2026-11-10T09:00:00+01:00",
"url": "https://www.linkedin.com/feed/update/p_7390010"
} Scripts and cron jobs reach the same tools over REST at /api/v1/linkedin, with the same key and price. A write answers 202 while it waits for your OK. Each row in the tools table shows its REST path.
About $37 a monthfor one person who runs LinkedIn as a channel, 6,360 credits. Your LinkedIn plan is billed by LinkedIn as before.
| Job | Calls | Credits |
|---|---|---|
| Schedule the week's 5 posts | 5 × 4 | 200 |
| Reply to new comments, workdays | 8 × 22 | 1,760 |
| Search, read profiles, invite 10 leads | 22 × 4 | 880 |
| Follow up in messages, workdays | 7 × 22 | 1,540 |
| Tidy invitations, weekly | 12 × 4 | 480 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 6,360 |
The month is our example: a post every workday, replies and message follow-ups on workdays, 10 invitations a week. LinkedIn publishes no typical account activity, so the volume is our assumption. LinkedIn sells Premium and Sales Navigator by subscription; Cotlet works on a free account too. Dollars at the $29 pack rate.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| LinkedIn API | Official: sign-in, Share on LinkedIn for posts, comments and likes, and approved programs for Pages, ads, sales and talent. | You register an app and apply; no messages, invitations or people search in the open permissions. |
| Zapier MCP for LinkedIn | The Zapier LinkedIn app as an MCP server: Create Share Update and Create Company Update. | Two post actions and no triggers; nothing for comments, messages or invitations. |
| stickerdaniel/linkedin-mcp-server | Open-source server that uses your own browser session: profiles, companies, jobs, conversations and connection requests. Apache 2.0, 4,128 stars, last commit 4 Nov 2026. | Runs on your computer; you install and update it. |
| eliasbiondo/linkedin-mcp-server | Open-source server for people, company and job search and profile data. MIT, 212 stars, last commit 24 Oct 2026. | Runs on your computer; built around search and reading. |
| gtm-api | Managed server with 160+ typed LinkedIn actions over MCP and REST. Its repository holds the public interface; MIT, 68 stars, last commit 6 Nov 2026. | A paid service; we did not check its price. |
| TalkToHumans | Hosted server for Claude, ChatGPT and Cursor that reads your inbox and network and drafts messages you review and send. MIT, 36 stars, last commit 5 Nov 2026. | A paid service; we did not check its price. |
If you have a developer and only need to publish posts from your own system, the LinkedIn API and its Share on LinkedIn permission are the direct route. Cotlet is for the founder, marketer or sales lead who wants an agent in Claude or ChatGPT working in their own account, with no app to register.
Take Group sp. z o.o. runs Cotlet. It is a software company registered in Poland, EU (VAT PL6342984273), working since 2019, founded by Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the LinkedIn tools.
Sign up at cotlet.dev, sign in to LinkedIn once in its Cloud Browser and add Cotlet to ChatGPT or Claude, following the steps in your console. No API key is needed. ChatGPT and Claude then work in your LinkedIn account through Cotlet, in their phone apps too.
With Cotlet, ChatGPT, Claude and other AI agents handle jobs like these in LinkedIn: schedule a week of posts; reply to comments on your posts; invite a lead list to connect. You ask in plain words, and anything that reaches other people waits for your OK first.
LinkedIn has no connector of its own for Claude or ChatGPT that works in your account (checked 6 Nov 2026). Cotlet adds one to both: you add Cotlet once and ChatGPT or Claude works in your own LinkedIn.
LinkedIn gives API keys to a registered developer app, and most products need LinkedIn to approve the app first. With Cotlet you need no LinkedIn API key: you sign in to LinkedIn once and your agent uses the Cotlet tools.
Create a free account at https://cotlet.dev, open LinkedIn under Integrations in the console and sign in to LinkedIn in its Cloud Browser. The trial starts with your first app, no card asked.
We found none from LinkedIn for your own AI agent (checked 6 Nov 2026). LinkedIn has an official API for approved apps. Cotlet gives Claude, ChatGPT and scripts the LinkedIn tools above, hosted.
Yes, if your account has an admin role on the Page. LinkedIn lets Page super admins and content admins post and schedule from the Page admin view, and react or comment as the Page. Pass as_page to create_post and comment_on_post.
It does what your account can do in LinkedIn. You message connections directly. For people outside your network LinkedIn needs InMail, a Premium feature, so send_invitation is the usual first step.
Not through Cotlet. Cotlet reads and writes when your agent asks. For a morning check of new comments and unread messages, run your agent on a schedule.
Only the door is different. Both expose the same 15 tools, inputs and answers, with one API key and one price. Agents use MCP; scripts and cron jobs use REST.
No. Cotlet is independent and not affiliated with LinkedIn Corporation or Microsoft.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy