What it does
A thoughtful public comment on a prospect's post is the best-received first touch on LinkedIn — and the most damaging when it reads like a bot. A person checks every one.
This tool drives a real LinkedIn account
Arguments
| Name | Type | Required | Meaning |
|---|---|---|---|
| post | string | yes | Post URL, activity id, or URN (urn:li:activity:…, urn:li:ugcPost:…, urn:li:share:…) |
| text | string | yes | The comment, up to 1,250 characters |
| reply_to | string | no | A comment id from list_post_comments, to reply to it |
| reason | string | no | Why, in one or two sentences — shown to the person who approves it |
| account | string | no | Sender account id or name to act as. Defaults to the healthiest connected account. |
| dry_run | boolean | no | Check everything (target, do-not-contact, duplicates, text, limits) and return the verdict without proposing anything |
This table is generated from the literal inputSchema that tools/list returns, so what your client sees and what this page says are the same object:
{
"type": "object",
"properties": {
"post": {
"type": "string",
"description": "Post URL, activity id, or URN (urn:li:activity:…, urn:li:ugcPost:…, urn:li:share:…)"
},
"text": {
"type": "string",
"description": "The comment, up to 1,250 characters"
},
"reply_to": {
"type": "string",
"description": "A comment id from list_post_comments, to reply to it"
},
"reason": {
"type": "string",
"description": "Why, in one or two sentences — shown to the person who approves it"
},
"account": {
"type": "string",
"description": "Sender account id or name to act as. Defaults to the healthiest connected account."
},
"dry_run": {
"type": "boolean",
"description": "Check everything (target, do-not-contact, duplicates, text, limits) and return the verdict without proposing anything"
}
},
"required": [
"post",
"text"
]
}Request
Paste this, swap the key, and you have called the tool.
curl -s https://topclozer.com/api/mcp \
-H "Authorization: Bearer tcz_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "propose_comment",
"arguments": { "post": "urn:li:activity:7332661864792854528", "text": "The part about …", "reason": "On-topic, she is in our ICP" }
}
}'Returns
{ approval_id, status, duplicate, kind, target, warnings, account, next }. With dry_run: { dry_run: true, would_propose: true|false, refusal?, target, checks: { do_not_contact, duplicate, text, limit } } and nothing is queued.
The payload arrives inside an MCP content block — one text block whose body is this JSON, pretty-printed. Parse the string; there is no structured-content field.
{
"approval_id": "apr_lx3k2a9fq",
"status": "pending",
"duplicate": false,
"kind": "comment",
"target": { "label": "Post by Dana Whitfield", "id": "urn:li:activity:7332661864792854528" },
"warnings": [],
"account": "Marcus Feld",
"next": "Waiting for a person in the TopClozer console → Approvals. Poll get_approval."
}Worth knowing
Nothing reaches LinkedIn from this call. A person approves (and may edit) it on the console's Approvals page; it then goes out under the account's Smart Limits, one action per account per pass, inside working hours. The do-not-contact list is checked here and again at send time. LinkedIn caps comments at 1,250 characters.
Rate limit
30 LinkedIn tool calls per 5 minutes, per workspace. Exceeding it returns HTTP 429 with JSON-RPC error -32002 and a Retry-After header. The budget is shared by every LinkedIn tool and counted per workspace, so minting a second key does not buy a second allowance.
The limit exists because an agent retrying in a loop is the request pattern that gets a LinkedIn account restricted, and a restricted account is a much worse outcome for you than a 429. Workspace tools do not spend this budget.
Related tools
get_post
One LinkedIn post: text, author, reactions, comments, reposts, and whether the account can react or comment
list_post_comments
Comments on a LinkedIn post, or replies to one comment — with each commenter's headline and degree
get_approval
The status of a proposal made with any propose_* tool: pending, approved, sent, rejected, failed or expired
All 65 tools are listed on the tool index. Connecting a client is on the Claude setup page, and the protocol details are on the server page.