@mcp-s/connectors 0.0.20261022190708 → 0.0.20261022202319

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"id":"linkedin","status":"active","applications":["linkedin"],"definition":{"display":{"name":"LinkedIn","description":"LinkedIn is a professional network. Publish and manage posts, comments and reactions as a member or Company Page, and look up organizations.","icon":"linkedin.svg","website":"https://www.linkedin.com","category":"marketing-growth","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/linkedin"},"api":{"base_url":"https://api.linkedin.com","headers":{"Linkedin-Version":"202610","X-Restli-Protocol-Version":"2.0.0"}},"auth":{"methods":{"oauth":{"authUrl":"https://www.linkedin.com/oauth/v2/authorization","tokenUrl":"https://www.linkedin.com/oauth/v2/accessToken","scopes":["openid","profile","email","w_member_social","r_member_social","w_organization_social","r_organization_social","r_organization_admin"],"defaultScopes":["openid","profile","email","w_member_social"],"codeExchangeConfig":{"isForm":true,"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"refresh_token_expires_at\": refresh_token_expires_in ? $fromMillis($millis() + refresh_token_expires_in * 1000) : null,\n \"scope\": scope\n }"}}},"default":"oauth"},"tools":[{"name":"Get My Profile","description":"Returns the authenticated member's name, profile picture URL, locale and (if granted) email. The `sub` value is the member id: the person URN is `urn:li:person:{sub}`, which other tools need as an author or actor.","slug":"get_my_profile","enabled":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"action":{"path":"/v2/userinfo","method":"GET","mapping":{"response":"{\n \"sub\": response.sub,\n \"person_urn\": \"urn:li:person:\" & response.sub,\n \"name\": response.name,\n \"given_name\": response.given_name,\n \"family_name\": response.family_name,\n \"picture\": response.picture,\n \"locale\": response.locale,\n \"email\": response.email,\n \"email_verified\": response.email_verified\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":["openid","profile"]},{"name":"Create Post","description":"Publishes a post as a member or a Company Page. Text only by default; pass article_url and article_title to attach a link, or reshare_parent to reshare an existing post. LinkedIn returns the new post URN only in the x-restli-id response header, which this tool cannot show, so use List Posts by Author to find it afterwards.","slug":"create_post","enabled":true,"inputSchema":{"type":"object","properties":{"author":{"type":"string","description":"Who posts: `urn:li:person:{id}` (see Get My Profile) or `urn:li:organization:{id}` for a Company Page the member administers."},"commentary":{"type":"string","description":"The post text. Supports hashtags like #coding and mentions like @[Name](urn:li:organization:123)."},"visibility":{"type":"string","description":"Who can see the post. Defaults to PUBLIC."},"article_url":{"type":"string","description":"URL to attach as an article card. Needs article_title."},"article_title":{"type":"string","description":"Title shown on the article card."},"article_description":{"type":"string","description":"Description shown on the article card."},"article_thumbnail":{"type":"string","description":"Optional image URN (`urn:li:image:{id}`) for the card thumbnail."},"reshare_parent":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) to reshare. Commentary is shown above it."},"is_reshare_disabled":{"type":"boolean","description":"Set true to stop others resharing this post."}},"required":["author","commentary"],"additionalProperties":false},"action":{"path":"/rest/posts","method":"POST","mapping":{"body":"$merge([\n {\n \"author\": arguments.author,\n \"commentary\": arguments.commentary,\n \"visibility\": arguments.visibility ? arguments.visibility : \"PUBLIC\",\n \"distribution\": {\n \"feedDistribution\": \"MAIN_FEED\",\n \"targetEntities\": [],\n \"thirdPartyDistributionChannels\": []\n },\n \"lifecycleState\": \"PUBLISHED\",\n \"isReshareDisabledByAuthor\": arguments.is_reshare_disabled = true\n },\n arguments.article_url ? {\n \"content\": {\n \"article\": $sift({\n \"source\": arguments.article_url,\n \"title\": arguments.article_title,\n \"description\": arguments.article_description,\n \"thumbnail\": arguments.article_thumbnail\n }, function($v) { $v != null })\n }\n } : {},\n arguments.reshare_parent ? {\n \"reshareContext\": { \"parent\": arguments.reshare_parent }\n } : {}\n ])"}},"annotations":{"openWorldHint":true},"risk":"high","requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Get Post","description":"Gets one post by URN: text, author, visibility, lifecycle state and attached content.","slug":"get_post","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."},"view_context":{"type":"string","enum":["READER","AUTHOR"],"description":"READER (default) returns the published version. AUTHOR returns the latest version, including drafts."}},"required":["post_urn"],"additionalProperties":false},"action":{"path":"/rest/posts/{post_urn}","method":"GET","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","query":"$sift({ \"viewContext\": arguments.view_context }, function($v) { $v != null })","response":"response.{\n \"id\": id,\n \"author\": author,\n \"commentary\": commentary,\n \"visibility\": visibility,\n \"lifecycleState\": lifecycleState,\n \"content\": content,\n \"reshareContext\": reshareContext,\n \"isReshareDisabledByAuthor\": isReshareDisabledByAuthor,\n \"createdAt\": createdAt,\n \"publishedAt\": publishedAt,\n \"lastModifiedAt\": lastModifiedAt\n}"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social"]}]},{"name":"List Posts by Author","description":"Lists posts written by a member or Company Page, newest first. Listing a member's posts needs r_member_social and a Page's needs r_organization_social, both granted only to approved apps.","slug":"list_posts_by_author","enabled":true,"inputSchema":{"type":"object","properties":{"author":{"type":"string","description":"`urn:li:person:{id}` or `urn:li:organization:{id}` whose posts to list."},"count":{"type":"number","description":"Posts per page, 1-100. Defaults to 10."},"start":{"type":"number","description":"Index of the first post to return. Defaults to 0."},"sort_by":{"type":"string","enum":["LAST_MODIFIED","CREATED"],"description":"Sort order, descending. Defaults to LAST_MODIFIED."},"view_context":{"type":"string","enum":["READER","AUTHOR"],"description":"READER (default) returns published versions. AUTHOR includes drafts and posts still processing."}},"required":["author"],"additionalProperties":false},"action":{"path":"/rest/posts","method":"GET","mapping":{"query":"$sift({\n \"q\": \"author\",\n \"author\": arguments.author,\n \"count\": arguments.count ? $string(arguments.count) : undefined,\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined,\n \"sortBy\": arguments.sort_by,\n \"viewContext\": arguments.view_context\n }, function($v) { $v != null })","response":"{\n \"posts\": response.elements.{\n \"id\": id,\n \"author\": author,\n \"commentary\": commentary,\n \"visibility\": visibility,\n \"lifecycleState\": lifecycleState,\n \"content\": content,\n \"reshareContext\": reshareContext,\n \"isReshareDisabledByAuthor\": isReshareDisabledByAuthor,\n \"createdAt\": createdAt,\n \"publishedAt\": publishedAt,\n \"lastModifiedAt\": lastModifiedAt\n},\n \"paging\": { \"start\": response.paging.start, \"count\": response.paging.count, \"total\": response.paging.total }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social"]}]},{"name":"Update Post","description":"Edits the text of an existing post. Only the commentary (and an optional call-to-action) can be changed after publishing.","slug":"update_post","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."},"commentary":{"type":"string","description":"The new post text, replacing the old text."}},"required":["post_urn","commentary"],"additionalProperties":false},"action":{"path":"/rest/posts/{post_urn}","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","headers":"{ \"X-RestLi-Method\": \"PARTIAL_UPDATE\" }","body":"{ \"patch\": { \"$set\": { \"commentary\": arguments.commentary } } }"}},"annotations":{"openWorldHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Delete Post","description":"Deletes a post. Deleting an already deleted post still succeeds.","slug":"delete_post","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."}},"required":["post_urn"],"additionalProperties":false},"action":{"path":"/rest/posts/{post_urn}","method":"DELETE","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"List Comments","description":"Lists the comments on a post, or the replies to a comment when given a comment URN.","slug":"list_comments","enabled":true,"inputSchema":{"type":"object","properties":{"target_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`), or a comment URN `urn:li:comment:(urn:li:activity:{id},{commentId})` to list its replies."}},"required":["target_urn"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{target_urn}/comments","method":"GET","mapping":{"params":"{ \"target_urn\": $encodeUrlComponent(arguments.target_urn) }","response":"{ \"comments\": response.elements.{\n \"id\": id,\n \"commentUrn\": commentUrn,\n \"actor\": actor,\n \"object\": object,\n \"parentComment\": parentComment,\n \"text\": message.text,\n \"createdAt\": created.time,\n \"totalLikes\": likesSummary.totalLikes\n} }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Get Comment","description":"Gets one comment by its id on a post or on a parent comment.","slug":"get_comment","enabled":true,"inputSchema":{"type":"object","properties":{"target_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or parent comment URN the comment sits on."},"comment_id":{"type":"string","description":"The comment id (the `id` field of a comment)."}},"required":["target_urn","comment_id"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{target_urn}/comments/{comment_id}","method":"GET","mapping":{"params":"{ \"target_urn\": $encodeUrlComponent(arguments.target_urn), \"comment_id\": arguments.comment_id }","response":"response.{\n \"id\": id,\n \"commentUrn\": commentUrn,\n \"actor\": actor,\n \"object\": object,\n \"parentComment\": parentComment,\n \"text\": message.text,\n \"createdAt\": created.time,\n \"totalLikes\": likesSummary.totalLikes\n}"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Create Comment","description":"Comments on a post as a member or Company Page. Pass parent_comment to reply to an existing comment. The new comment id is returned only in the x-restli-id response header, so use List Comments to find it.","slug":"create_comment","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}` to comment on."},"actor":{"type":"string","description":"Who comments: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"text":{"type":"string","description":"The comment text."},"parent_comment":{"type":"string","description":"Comment URN `urn:li:comment:(urn:li:activity:{id},{commentId})` to reply to. Omit for a top-level comment."}},"required":["post_urn","actor","text"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{post_urn}/comments","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","body":"$sift({\n \"actor\": arguments.actor,\n \"object\": arguments.post_urn,\n \"message\": { \"text\": arguments.text },\n \"parentComment\": arguments.parent_comment\n }, function($v) { $v != null })"}},"annotations":{"openWorldHint":true},"risk":"high","requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Edit Comment","description":"Changes the text of a comment. Pass actor only when editing as a Company Page.","slug":"edit_comment","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}` the comment is on."},"comment_id":{"type":"string","description":"The comment id."},"text":{"type":"string","description":"The new comment text."},"actor":{"type":"string","description":"`urn:li:organization:{id}`, only when editing as a Company Page."}},"required":["post_urn","comment_id","text"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{post_urn}/comments/{comment_id}","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn), \"comment_id\": arguments.comment_id }","query":"$sift({ \"actor\": arguments.actor }, function($v) { $v != null })","headers":"{ \"X-RestLi-Method\": \"PARTIAL_UPDATE\" }","body":"{ \"patch\": { \"message\": { \"$set\": { \"text\": arguments.text } } } }","response":"response.{\n \"id\": id,\n \"commentUrn\": commentUrn,\n \"actor\": actor,\n \"object\": object,\n \"parentComment\": parentComment,\n \"text\": message.text,\n \"createdAt\": created.time,\n \"totalLikes\": likesSummary.totalLikes\n}"}},"annotations":{"openWorldHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Delete Comment","description":"Deletes a comment. Pass actor only when deleting as a Company Page.","slug":"delete_comment","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}` the comment is on."},"comment_id":{"type":"string","description":"The comment id."},"actor":{"type":"string","description":"`urn:li:organization:{id}`, only when deleting as a Company Page."}},"required":["post_urn","comment_id"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{post_urn}/comments/{comment_id}","method":"DELETE","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn), \"comment_id\": arguments.comment_id }","query":"$sift({ \"actor\": arguments.actor }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"List Reactions","description":"Counts and lists reactions (like, celebrate, love, insightful, support, funny) on a post or comment, newest first. Returns `count` and `by_type` for this page; LinkedIn's own paging total is unreliable, so use these to answer how many reactions a post has. When `has_more` is true, call again with `start` advanced by `count`. Set include_reactions to also get each reaction and who reacted.","slug":"list_reactions","enabled":true,"inputSchema":{"type":"object","properties":{"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}`, `urn:li:ugcPost:{id}` or `urn:li:activity:{id}` from the post URL) or comment URN to list reactions on."},"start":{"type":"integer","minimum":0,"description":"Index of the first reaction to return. Default 0."},"count":{"type":"integer","minimum":1,"description":"Reactions per page. Default 100."},"include_reactions":{"type":"boolean","description":"Also return each reaction (type, actor URN, time). Default false, which returns only the counts."}},"required":["entity_urn"],"additionalProperties":false},"action":{"path":"/rest/reactions/(entity:{entity_urn})","method":"GET","mapping":{"params":"{ \"entity_urn\": $encodeUrlComponent(arguments.entity_urn) }","query":"{\n \"q\": \"entity\",\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined,\n \"count\": $exists(arguments.count) ? $string(arguments.count) : \"100\"\n }","response":"(\n $page := $exists(arguments.count) ? arguments.count : 100;\n $elements := response.elements[];\n {\n \"count\": $count($elements),\n \"by_type\": $count($elements) > 0 ? $elements{ reactionType: $count(reactionType) } : {},\n \"start\": $exists(arguments.start) ? arguments.start : 0,\n \"has_more\": $count($elements) >= $page,\n \"reactions\": arguments.include_reactions = true ? $elements.{\n \"id\": id,\n \"reactionType\": reactionType,\n \"root\": root,\n \"actor\": created.actor,\n \"createdAt\": created.time\n} : undefined\n }\n )"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed","r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Create Reaction","description":"Reacts to a post or comment as a member or Company Page. LIKE is the thumbs-up; PRAISE is Celebrate, EMPATHY is Love, INTEREST is Insightful, APPRECIATION is Support, ENTERTAINMENT is Funny.","slug":"create_reaction","enabled":true,"inputSchema":{"type":"object","properties":{"actor":{"type":"string","description":"Who reacts: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or comment URN to react to."},"reaction_type":{"type":"string","enum":["LIKE","PRAISE","EMPATHY","INTEREST","APPRECIATION","ENTERTAINMENT"],"description":"The reaction to add."}},"required":["actor","entity_urn","reaction_type"],"additionalProperties":false},"action":{"path":"/rest/reactions","method":"POST","mapping":{"query":"{ \"actor\": arguments.actor }","body":"{ \"root\": arguments.entity_urn, \"reactionType\": arguments.reaction_type }","response":"response.{\n \"id\": id,\n \"reactionType\": reactionType,\n \"root\": root,\n \"actor\": created.actor,\n \"createdAt\": created.time\n}"}},"annotations":{"openWorldHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Delete Reaction","description":"Removes the actor's reaction from a post or comment.","slug":"delete_reaction","enabled":true,"inputSchema":{"type":"object","properties":{"actor":{"type":"string","description":"Who reacted: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or comment URN the reaction is on."}},"required":["actor","entity_urn"],"additionalProperties":false},"action":{"path":"/rest/reactions/(actor:{actor},entity:{entity_urn})","method":"DELETE","mapping":{"params":"{\n \"actor\": $encodeUrlComponent(arguments.actor),\n \"entity_urn\": $encodeUrlComponent(arguments.entity_urn)\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Get Social Metadata","description":"Gets engagement totals for a post or comment: reaction counts by type, comment counts, and whether comments are open or closed.","slug":"get_social_metadata","enabled":true,"inputSchema":{"type":"object","properties":{"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or comment URN."}},"required":["entity_urn"],"additionalProperties":false},"action":{"path":"/rest/socialMetadata/{entity_urn}","method":"GET","mapping":{"params":"{ \"entity_urn\": $encodeUrlComponent(arguments.entity_urn) }","response":"{\n \"entity\": response.entity,\n \"commentsState\": response.commentsState,\n \"commentSummary\": response.commentSummary,\n \"reactionSummaries\": response.reactionSummaries\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Set Comments State","description":"Opens or closes comments on a post. Closing comments deletes all existing comments on it; reactions are kept.","slug":"set_comments_state","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."},"actor":{"type":"string","description":"Who changes it: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"comments_state":{"type":"string","enum":["OPEN","CLOSED"],"description":"CLOSED turns comments off and deletes existing ones."}},"required":["post_urn","actor","comments_state"],"additionalProperties":false},"action":{"path":"/rest/socialMetadata/{post_urn}","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","query":"{ \"actor\": arguments.actor }","body":"{ \"patch\": { \"$set\": { \"commentsState\": arguments.comments_state } } }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"List My Organization Roles","description":"Lists the Company Pages the authenticated member has a role on, with the role and its state. Use it to find organization URNs to post as.","slug":"list_my_organization_roles","enabled":true,"inputSchema":{"type":"object","properties":{"role":{"type":"string","description":"Only this role, e.g. ADMINISTRATOR or DIRECT_SPONSORED_CONTENT_POSTER."},"state":{"type":"string","description":"Only this role state, e.g. APPROVED or REQUESTED."},"count":{"type":"number","description":"Results per page. Defaults to 10."},"start":{"type":"number","description":"Index of the first result. Defaults to 0."}},"additionalProperties":false},"action":{"path":"/rest/organizationAcls","method":"GET","mapping":{"query":"$sift({\n \"q\": \"roleAssignee\",\n \"role\": arguments.role,\n \"state\": arguments.state,\n \"count\": arguments.count ? $string(arguments.count) : undefined,\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined\n }, function($v) { $v != null })","response":"{\n \"roles\": response.elements.{\n \"organization\": organization ? organization : organizationTarget,\n \"role\": role,\n \"state\": state,\n \"roleAssignee\": roleAssignee\n },\n \"paging\": { \"start\": response.paging.start, \"count\": response.paging.count }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_organization_admin","rw_organization_admin"]}]},{"name":"List Organization Roles","description":"Lists who has which role on a Company Page, such as its administrators.","slug":"list_organization_roles","enabled":true,"inputSchema":{"type":"object","properties":{"organization":{"type":"string","description":"Organization URN, `urn:li:organization:{id}`."},"role":{"type":"string","description":"Only this role, e.g. ADMINISTRATOR."},"state":{"type":"string","description":"Only this role state, e.g. APPROVED."},"count":{"type":"number","description":"Results per page. Defaults to 10."},"start":{"type":"number","description":"Index of the first result. Defaults to 0."}},"required":["organization"],"additionalProperties":false},"action":{"path":"/rest/organizationAcls","method":"GET","mapping":{"query":"$sift({\n \"q\": \"organization\",\n \"organization\": arguments.organization,\n \"role\": arguments.role,\n \"state\": arguments.state,\n \"count\": arguments.count ? $string(arguments.count) : undefined,\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined\n }, function($v) { $v != null })","response":"{\n \"roles\": response.elements.{\n \"organization\": organization ? organization : organizationTarget,\n \"role\": role,\n \"state\": state,\n \"roleAssignee\": roleAssignee\n },\n \"paging\": { \"start\": response.paging.start, \"count\": response.paging.count }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_organization_admin","rw_organization_admin"]}]},{"name":"Get Organization","description":"Gets a Company Page by numeric id. Full details need the member to be an ADMINISTRATOR of that page; otherwise LinkedIn answers 403 and Find Organization by Vanity Name returns the public fields.","slug":"get_organization","enabled":true,"inputSchema":{"type":"object","properties":{"organization_id":{"type":"string","description":"Numeric organization id, e.g. 2414183."}},"required":["organization_id"],"additionalProperties":false},"action":{"path":"/rest/organizations/{organization_id}","method":"GET","mapping":{"params":"{ \"organization_id\": arguments.organization_id }","response":"{\n \"id\": response.id,\n \"urn\": \"urn:li:organization:\" & $string(response.id),\n \"name\": response.localizedName,\n \"vanityName\": response.vanityName,\n \"website\": response.localizedWebsite,\n \"description\": response.localizedDescription,\n \"staffCountRange\": response.staffCountRange,\n \"industries\": response.industries,\n \"organizationType\": response.organizationType,\n \"primaryOrganizationType\": response.primaryOrganizationType,\n \"specialties\": response.localizedSpecialties\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Find Organization by Vanity Name","description":"Finds a Company Page or school by the vanity name in its URL (linkedin.com/company/{vanityName}). Returns public fields and the numeric id used to build `urn:li:organization:{id}`.","slug":"find_organization_by_vanity_name","enabled":true,"inputSchema":{"type":"object","properties":{"vanity_name":{"type":"string","description":"The vanity name, e.g. `linkedin` or `boisestate`."}},"required":["vanity_name"],"additionalProperties":false},"action":{"path":"/rest/organizations","method":"GET","mapping":{"query":"{ \"q\": \"vanityName\", \"vanityName\": arguments.vanity_name }","response":"{\n \"organizations\": response.elements.{\n \"id\": id,\n \"urn\": \"urn:li:organization:\" & $string(id),\n \"name\": localizedName,\n \"vanityName\": vanityName,\n \"website\": localizedWebsite,\n \"primaryOrganizationType\": primaryOrganizationType\n }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Organization Follower Count","description":"Gets how many members follow a Company Page.","slug":"get_organization_follower_count","enabled":true,"inputSchema":{"type":"object","properties":{"organization":{"type":"string","description":"Organization URN, `urn:li:organization:{id}`."}},"required":["organization"],"additionalProperties":false},"action":{"path":"/rest/networkSizes/{organization}","method":"GET","mapping":{"params":"{ \"organization\": $encodeUrlComponent(arguments.organization) }","query":"{ \"edgeType\": \"COMPANY_FOLLOWED_BY_MEMBER\" }","response":"{ \"followers\": response.firstDegreeSize }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}}]}}
1
+ {"id":"linkedin","status":"active","applications":["linkedin"],"definition":{"display":{"name":"LinkedIn","description":"LinkedIn is a professional network. Publish and manage posts, comments and reactions as a member or Company Page, and look up organizations.","icon":"linkedin.svg","website":"https://www.linkedin.com","category":"marketing-growth","docs_url":"https://docs.withwillow.ai/docs/mcp-servers/built-in/linkedin"},"api":{"base_url":"https://api.linkedin.com","headers":{"Linkedin-Version":"202610","X-Restli-Protocol-Version":"2.0.0"}},"auth":{"methods":{"oauth":{"authUrl":"https://www.linkedin.com/oauth/v2/authorization","tokenUrl":"https://www.linkedin.com/oauth/v2/accessToken","scopes":["openid","profile","email","w_member_social","r_member_social","w_organization_social","r_organization_social","r_organization_admin"],"defaultScopes":["openid","profile","email","w_member_social"],"codeExchangeConfig":{"isForm":true,"modelCredentialsMapping":"{\n \"access_token\": access_token,\n \"expires_at\": $fromMillis($millis() + expires_in * 1000),\n \"refresh_token\": refresh_token,\n \"refresh_token_expires_at\": refresh_token_expires_in ? $fromMillis($millis() + refresh_token_expires_in * 1000) : null,\n \"scope\": scope\n }"}}},"default":"oauth"},"tools":[{"name":"Get My Profile","description":"Returns the authenticated member's name, profile picture URL, locale and (if granted) email. The `sub` value is the member id: the person URN is `urn:li:person:{sub}`, which other tools need as an author or actor.","slug":"get_my_profile","enabled":true,"inputSchema":{"type":"object","properties":{},"additionalProperties":false},"action":{"path":"/v2/userinfo","method":"GET","mapping":{"response":"{\n \"sub\": response.sub,\n \"person_urn\": \"urn:li:person:\" & response.sub,\n \"name\": response.name,\n \"given_name\": response.given_name,\n \"family_name\": response.family_name,\n \"picture\": response.picture,\n \"locale\": response.locale,\n \"email\": response.email,\n \"email_verified\": response.email_verified\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":["openid","profile"]},{"name":"Create Post","description":"Publishes a post as a member or a Company Page. Text only by default; pass article_url and article_title to attach a link, or reshare_parent to reshare an existing post. LinkedIn returns the new post URN only in the x-restli-id response header, which this tool cannot show, so use List Posts by Author to find it afterwards.","slug":"create_post","enabled":true,"inputSchema":{"type":"object","properties":{"author":{"type":"string","description":"Who posts: `urn:li:person:{id}` (see Get My Profile) or `urn:li:organization:{id}` for a Company Page the member administers."},"commentary":{"type":"string","description":"The post text. Supports hashtags like #coding and mentions like @[Name](urn:li:organization:123)."},"visibility":{"type":"string","description":"Who can see the post. Defaults to PUBLIC."},"article_url":{"type":"string","description":"URL to attach as an article card. Needs article_title."},"article_title":{"type":"string","description":"Title shown on the article card."},"article_description":{"type":"string","description":"Description shown on the article card."},"article_thumbnail":{"type":"string","description":"Optional image URN (`urn:li:image:{id}`) for the card thumbnail."},"reshare_parent":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) to reshare. Commentary is shown above it."},"is_reshare_disabled":{"type":"boolean","description":"Set true to stop others resharing this post."}},"required":["author","commentary"],"additionalProperties":false},"action":{"path":"/rest/posts","method":"POST","mapping":{"body":"$merge([\n {\n \"author\": arguments.author,\n \"commentary\": arguments.commentary,\n \"visibility\": arguments.visibility ? arguments.visibility : \"PUBLIC\",\n \"distribution\": {\n \"feedDistribution\": \"MAIN_FEED\",\n \"targetEntities\": [],\n \"thirdPartyDistributionChannels\": []\n },\n \"lifecycleState\": \"PUBLISHED\",\n \"isReshareDisabledByAuthor\": arguments.is_reshare_disabled = true\n },\n arguments.article_url ? {\n \"content\": {\n \"article\": $sift({\n \"source\": arguments.article_url,\n \"title\": arguments.article_title,\n \"description\": arguments.article_description,\n \"thumbnail\": arguments.article_thumbnail\n }, function($v) { $v != null })\n }\n } : {},\n arguments.reshare_parent ? {\n \"reshareContext\": { \"parent\": arguments.reshare_parent }\n } : {}\n ])"}},"annotations":{"openWorldHint":true},"risk":"high","requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Get Post","description":"Gets one post by URN: text, author, visibility, lifecycle state and attached content. Requires the Community Management API product on the LinkedIn app.","slug":"get_post","enabled":false,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."},"view_context":{"type":"string","enum":["READER","AUTHOR"],"description":"READER (default) returns the published version. AUTHOR returns the latest version, including drafts."}},"required":["post_urn"],"additionalProperties":false},"action":{"path":"/rest/posts/{post_urn}","method":"GET","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","query":"$sift({ \"viewContext\": arguments.view_context }, function($v) { $v != null })","response":"response.{\n \"id\": id,\n \"author\": author,\n \"commentary\": commentary,\n \"visibility\": visibility,\n \"lifecycleState\": lifecycleState,\n \"content\": content,\n \"reshareContext\": reshareContext,\n \"isReshareDisabledByAuthor\": isReshareDisabledByAuthor,\n \"createdAt\": createdAt,\n \"publishedAt\": publishedAt,\n \"lastModifiedAt\": lastModifiedAt\n}"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social"]}]},{"name":"List Posts by Author","description":"Lists posts written by a member or Company Page, newest first. Listing a member's posts needs r_member_social and a Page's needs r_organization_social, both granted only to approved apps. Requires the Community Management API product on the LinkedIn app.","slug":"list_posts_by_author","enabled":false,"inputSchema":{"type":"object","properties":{"author":{"type":"string","description":"`urn:li:person:{id}` or `urn:li:organization:{id}` whose posts to list."},"count":{"type":"number","description":"Posts per page, 1-100. Defaults to 10."},"start":{"type":"number","description":"Index of the first post to return. Defaults to 0."},"sort_by":{"type":"string","enum":["LAST_MODIFIED","CREATED"],"description":"Sort order, descending. Defaults to LAST_MODIFIED."},"view_context":{"type":"string","enum":["READER","AUTHOR"],"description":"READER (default) returns published versions. AUTHOR includes drafts and posts still processing."}},"required":["author"],"additionalProperties":false},"action":{"path":"/rest/posts","method":"GET","mapping":{"query":"$sift({\n \"q\": \"author\",\n \"author\": arguments.author,\n \"count\": arguments.count ? $string(arguments.count) : undefined,\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined,\n \"sortBy\": arguments.sort_by,\n \"viewContext\": arguments.view_context\n }, function($v) { $v != null })","response":"{\n \"posts\": response.elements.{\n \"id\": id,\n \"author\": author,\n \"commentary\": commentary,\n \"visibility\": visibility,\n \"lifecycleState\": lifecycleState,\n \"content\": content,\n \"reshareContext\": reshareContext,\n \"isReshareDisabledByAuthor\": isReshareDisabledByAuthor,\n \"createdAt\": createdAt,\n \"publishedAt\": publishedAt,\n \"lastModifiedAt\": lastModifiedAt\n},\n \"paging\": { \"start\": response.paging.start, \"count\": response.paging.count, \"total\": response.paging.total }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social"]}]},{"name":"Update Post","description":"Edits the text of an existing post. Only the commentary (and an optional call-to-action) can be changed after publishing.","slug":"update_post","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."},"commentary":{"type":"string","description":"The new post text, replacing the old text."}},"required":["post_urn","commentary"],"additionalProperties":false},"action":{"path":"/rest/posts/{post_urn}","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","headers":"{ \"X-RestLi-Method\": \"PARTIAL_UPDATE\" }","body":"{ \"patch\": { \"$set\": { \"commentary\": arguments.commentary } } }"}},"annotations":{"openWorldHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Delete Post","description":"Deletes a post. Deleting an already deleted post still succeeds.","slug":"delete_post","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."}},"required":["post_urn"],"additionalProperties":false},"action":{"path":"/rest/posts/{post_urn}","method":"DELETE","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"List Comments","description":"Lists the comments on a post, or the replies to a comment when given a comment URN. Requires the Community Management API product on the LinkedIn app.","slug":"list_comments","enabled":false,"inputSchema":{"type":"object","properties":{"target_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`), or a comment URN `urn:li:comment:(urn:li:activity:{id},{commentId})` to list its replies."}},"required":["target_urn"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{target_urn}/comments","method":"GET","mapping":{"params":"{ \"target_urn\": $encodeUrlComponent(arguments.target_urn) }","response":"{ \"comments\": response.elements.{\n \"id\": id,\n \"commentUrn\": commentUrn,\n \"actor\": actor,\n \"object\": object,\n \"parentComment\": parentComment,\n \"text\": message.text,\n \"createdAt\": created.time,\n \"totalLikes\": likesSummary.totalLikes\n} }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Get Comment","description":"Gets one comment by its id on a post or on a parent comment. Requires the Community Management API product on the LinkedIn app.","slug":"get_comment","enabled":false,"inputSchema":{"type":"object","properties":{"target_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or parent comment URN the comment sits on."},"comment_id":{"type":"string","description":"The comment id (the `id` field of a comment)."}},"required":["target_urn","comment_id"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{target_urn}/comments/{comment_id}","method":"GET","mapping":{"params":"{ \"target_urn\": $encodeUrlComponent(arguments.target_urn), \"comment_id\": arguments.comment_id }","response":"response.{\n \"id\": id,\n \"commentUrn\": commentUrn,\n \"actor\": actor,\n \"object\": object,\n \"parentComment\": parentComment,\n \"text\": message.text,\n \"createdAt\": created.time,\n \"totalLikes\": likesSummary.totalLikes\n}"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Create Comment","description":"Comments on a post as a member or Company Page. Pass parent_comment to reply to an existing comment. The new comment id is returned only in the x-restli-id response header, so use List Comments to find it.","slug":"create_comment","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}` to comment on."},"actor":{"type":"string","description":"Who comments: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"text":{"type":"string","description":"The comment text."},"parent_comment":{"type":"string","description":"Comment URN `urn:li:comment:(urn:li:activity:{id},{commentId})` to reply to. Omit for a top-level comment."}},"required":["post_urn","actor","text"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{post_urn}/comments","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","body":"$sift({\n \"actor\": arguments.actor,\n \"object\": arguments.post_urn,\n \"message\": { \"text\": arguments.text },\n \"parentComment\": arguments.parent_comment\n }, function($v) { $v != null })"}},"annotations":{"openWorldHint":true},"risk":"high","requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Edit Comment","description":"Changes the text of a comment. Pass actor only when editing as a Company Page.","slug":"edit_comment","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}` the comment is on."},"comment_id":{"type":"string","description":"The comment id."},"text":{"type":"string","description":"The new comment text."},"actor":{"type":"string","description":"`urn:li:organization:{id}`, only when editing as a Company Page."}},"required":["post_urn","comment_id","text"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{post_urn}/comments/{comment_id}","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn), \"comment_id\": arguments.comment_id }","query":"$sift({ \"actor\": arguments.actor }, function($v) { $v != null })","headers":"{ \"X-RestLi-Method\": \"PARTIAL_UPDATE\" }","body":"{ \"patch\": { \"message\": { \"$set\": { \"text\": arguments.text } } } }","response":"response.{\n \"id\": id,\n \"commentUrn\": commentUrn,\n \"actor\": actor,\n \"object\": object,\n \"parentComment\": parentComment,\n \"text\": message.text,\n \"createdAt\": created.time,\n \"totalLikes\": likesSummary.totalLikes\n}"}},"annotations":{"openWorldHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Delete Comment","description":"Deletes a comment. Pass actor only when deleting as a Company Page.","slug":"delete_comment","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}` the comment is on."},"comment_id":{"type":"string","description":"The comment id."},"actor":{"type":"string","description":"`urn:li:organization:{id}`, only when deleting as a Company Page."}},"required":["post_urn","comment_id"],"additionalProperties":false},"action":{"path":"/rest/socialActions/{post_urn}/comments/{comment_id}","method":"DELETE","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn), \"comment_id\": arguments.comment_id }","query":"$sift({ \"actor\": arguments.actor }, function($v) { $v != null })"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"List Reactions","description":"Counts and lists reactions (like, celebrate, love, insightful, support, funny) on a post or comment, newest first. Returns `count` and `by_type` for this page; LinkedIn's own paging total is unreliable, so use these to answer how many reactions a post has. When `has_more` is true, call again with `start` advanced by `count`. Set include_reactions to also get each reaction and who reacted.","slug":"list_reactions","enabled":true,"inputSchema":{"type":"object","properties":{"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}`, `urn:li:ugcPost:{id}` or `urn:li:activity:{id}` from the post URL) or comment URN to list reactions on."},"start":{"type":"integer","minimum":0,"description":"Index of the first reaction to return. Default 0."},"count":{"type":"integer","minimum":1,"description":"Reactions per page. Default 100."},"include_reactions":{"type":"boolean","description":"Also return each reaction (type, actor URN, time). Default false, which returns only the counts."}},"required":["entity_urn"],"additionalProperties":false},"action":{"path":"/rest/reactions/(entity:{entity_urn})","method":"GET","mapping":{"params":"{ \"entity_urn\": $encodeUrlComponent(arguments.entity_urn) }","query":"{\n \"q\": \"entity\",\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined,\n \"count\": $exists(arguments.count) ? $string(arguments.count) : \"100\"\n }","response":"(\n $page := $exists(arguments.count) ? arguments.count : 100;\n $elements := response.elements[];\n {\n \"count\": $count($elements),\n \"by_type\": $count($elements) > 0 ? $elements{ reactionType: $count(reactionType) } : {},\n \"start\": $exists(arguments.start) ? arguments.start : 0,\n \"has_more\": $count($elements) >= $page,\n \"reactions\": arguments.include_reactions = true ? $elements.{\n \"id\": id,\n \"reactionType\": reactionType,\n \"root\": root,\n \"actor\": created.actor,\n \"createdAt\": created.time\n} : undefined\n }\n )"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed","r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Create Reaction","description":"Reacts to a post or comment as a member or Company Page. LIKE is the thumbs-up; PRAISE is Celebrate, EMPATHY is Love, INTEREST is Insightful, APPRECIATION is Support, ENTERTAINMENT is Funny.","slug":"create_reaction","enabled":true,"inputSchema":{"type":"object","properties":{"actor":{"type":"string","description":"Who reacts: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or comment URN to react to."},"reaction_type":{"type":"string","enum":["LIKE","PRAISE","EMPATHY","INTEREST","APPRECIATION","ENTERTAINMENT"],"description":"The reaction to add."}},"required":["actor","entity_urn","reaction_type"],"additionalProperties":false},"action":{"path":"/rest/reactions","method":"POST","mapping":{"query":"{ \"actor\": arguments.actor }","body":"{ \"root\": arguments.entity_urn, \"reactionType\": arguments.reaction_type }","response":"response.{\n \"id\": id,\n \"reactionType\": reactionType,\n \"root\": root,\n \"actor\": created.actor,\n \"createdAt\": created.time\n}"}},"annotations":{"openWorldHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Delete Reaction","description":"Removes the actor's reaction from a post or comment.","slug":"delete_reaction","enabled":true,"inputSchema":{"type":"object","properties":{"actor":{"type":"string","description":"Who reacted: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or comment URN the reaction is on."}},"required":["actor","entity_urn"],"additionalProperties":false},"action":{"path":"/rest/reactions/(actor:{actor},entity:{entity_urn})","method":"DELETE","mapping":{"params":"{\n \"actor\": $encodeUrlComponent(arguments.actor),\n \"entity_urn\": $encodeUrlComponent(arguments.entity_urn)\n }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"Get Social Metadata","description":"Gets engagement totals for a post or comment: reaction counts by type, comment counts, and whether comments are open or closed. Requires the Community Management API product on the LinkedIn app.","slug":"get_social_metadata","enabled":false,"inputSchema":{"type":"object","properties":{"entity_urn":{"type":"string","description":"Post URN (`urn:li:share:{id}` or `urn:li:ugcPost:{id}`) or comment URN."}},"required":["entity_urn"],"additionalProperties":false},"action":{"path":"/rest/socialMetadata/{entity_urn}","method":"GET","mapping":{"params":"{ \"entity_urn\": $encodeUrlComponent(arguments.entity_urn) }","response":"{\n \"entity\": response.entity,\n \"commentsState\": response.commentsState,\n \"commentSummary\": response.commentSummary,\n \"reactionSummaries\": response.reactionSummaries\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_member_social","r_organization_social","r_member_social_feed","r_organization_social_feed"]}]},{"name":"Set Comments State","description":"Opens or closes comments on a post. Closing comments deletes all existing comments on it; reactions are kept.","slug":"set_comments_state","enabled":true,"inputSchema":{"type":"object","properties":{"post_urn":{"type":"string","description":"`urn:li:share:{id}` or `urn:li:ugcPost:{id}`."},"actor":{"type":"string","description":"Who changes it: `urn:li:person:{id}` or `urn:li:organization:{id}`."},"comments_state":{"type":"string","enum":["OPEN","CLOSED"],"description":"CLOSED turns comments off and deletes existing ones."}},"required":["post_urn","actor","comments_state"],"additionalProperties":false},"action":{"path":"/rest/socialMetadata/{post_urn}","method":"POST","mapping":{"params":"{ \"post_urn\": $encodeUrlComponent(arguments.post_urn) }","query":"{ \"actor\": arguments.actor }","body":"{ \"patch\": { \"$set\": { \"commentsState\": arguments.comments_state } } }"}},"annotations":{"destructiveHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["w_member_social","w_organization_social","w_member_social_feed","w_organization_social_feed"]}]},{"name":"List My Organization Roles","description":"Lists the Company Pages the authenticated member has a role on, with the role and its state. Use it to find organization URNs to post as. Requires the Community Management API product on the LinkedIn app.","slug":"list_my_organization_roles","enabled":false,"inputSchema":{"type":"object","properties":{"role":{"type":"string","description":"Only this role, e.g. ADMINISTRATOR or DIRECT_SPONSORED_CONTENT_POSTER."},"state":{"type":"string","description":"Only this role state, e.g. APPROVED or REQUESTED."},"count":{"type":"number","description":"Results per page. Defaults to 10."},"start":{"type":"number","description":"Index of the first result. Defaults to 0."}},"additionalProperties":false},"action":{"path":"/rest/organizationAcls","method":"GET","mapping":{"query":"$sift({\n \"q\": \"roleAssignee\",\n \"role\": arguments.role,\n \"state\": arguments.state,\n \"count\": arguments.count ? $string(arguments.count) : undefined,\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined\n }, function($v) { $v != null })","response":"{\n \"roles\": response.elements.{\n \"organization\": organization ? organization : organizationTarget,\n \"role\": role,\n \"state\": state,\n \"roleAssignee\": roleAssignee\n },\n \"paging\": { \"start\": response.paging.start, \"count\": response.paging.count }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_organization_admin","rw_organization_admin"]}]},{"name":"List Organization Roles","description":"Lists who has which role on a Company Page, such as its administrators. Requires the Community Management API product on the LinkedIn app.","slug":"list_organization_roles","enabled":false,"inputSchema":{"type":"object","properties":{"organization":{"type":"string","description":"Organization URN, `urn:li:organization:{id}`."},"role":{"type":"string","description":"Only this role, e.g. ADMINISTRATOR."},"state":{"type":"string","description":"Only this role state, e.g. APPROVED."},"count":{"type":"number","description":"Results per page. Defaults to 10."},"start":{"type":"number","description":"Index of the first result. Defaults to 0."}},"required":["organization"],"additionalProperties":false},"action":{"path":"/rest/organizationAcls","method":"GET","mapping":{"query":"$sift({\n \"q\": \"organization\",\n \"organization\": arguments.organization,\n \"role\": arguments.role,\n \"state\": arguments.state,\n \"count\": arguments.count ? $string(arguments.count) : undefined,\n \"start\": $exists(arguments.start) ? $string(arguments.start) : undefined\n }, function($v) { $v != null })","response":"{\n \"roles\": response.elements.{\n \"organization\": organization ? organization : organizationTarget,\n \"role\": role,\n \"state\": state,\n \"roleAssignee\": roleAssignee\n },\n \"paging\": { \"start\": response.paging.start, \"count\": response.paging.count }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true},"requiredScopes":[{"oneOf":["r_organization_admin","rw_organization_admin"]}]},{"name":"Get Organization","description":"Gets a Company Page by numeric id. Full details need the member to be an ADMINISTRATOR of that page; otherwise LinkedIn answers 403 and Find Organization by Vanity Name returns the public fields. Requires the Community Management API product on the LinkedIn app.","slug":"get_organization","enabled":false,"inputSchema":{"type":"object","properties":{"organization_id":{"type":"string","description":"Numeric organization id, e.g. 2414183."}},"required":["organization_id"],"additionalProperties":false},"action":{"path":"/rest/organizations/{organization_id}","method":"GET","mapping":{"params":"{ \"organization_id\": arguments.organization_id }","response":"{\n \"id\": response.id,\n \"urn\": \"urn:li:organization:\" & $string(response.id),\n \"name\": response.localizedName,\n \"vanityName\": response.vanityName,\n \"website\": response.localizedWebsite,\n \"description\": response.localizedDescription,\n \"staffCountRange\": response.staffCountRange,\n \"industries\": response.industries,\n \"organizationType\": response.organizationType,\n \"primaryOrganizationType\": response.primaryOrganizationType,\n \"specialties\": response.localizedSpecialties\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}},{"name":"Find Organization by Vanity Name","description":"Finds a Company Page or school by the vanity name in its URL (linkedin.com/company/{vanityName}). Returns public fields and the numeric id used to build `urn:li:organization:{id}`. Requires the Community Management API product on the LinkedIn app.","slug":"find_organization_by_vanity_name","enabled":false,"inputSchema":{"type":"object","properties":{"vanity_name":{"type":"string","description":"The vanity name, e.g. `linkedin` or `boisestate`."}},"required":["vanity_name"],"additionalProperties":false},"action":{"path":"/rest/organizations","method":"GET","mapping":{"query":"{ \"q\": \"vanityName\", \"vanityName\": arguments.vanity_name }","response":"{\n \"organizations\": response.elements.{\n \"id\": id,\n \"urn\": \"urn:li:organization:\" & $string(id),\n \"name\": localizedName,\n \"vanityName\": vanityName,\n \"website\": localizedWebsite,\n \"primaryOrganizationType\": primaryOrganizationType\n }\n }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}},{"name":"Get Organization Follower Count","description":"Gets how many members follow a Company Page. Requires the Community Management API product on the LinkedIn app.","slug":"get_organization_follower_count","enabled":false,"inputSchema":{"type":"object","properties":{"organization":{"type":"string","description":"Organization URN, `urn:li:organization:{id}`."}},"required":["organization"],"additionalProperties":false},"action":{"path":"/rest/networkSizes/{organization}","method":"GET","mapping":{"params":"{ \"organization\": $encodeUrlComponent(arguments.organization) }","query":"{ \"edgeType\": \"COMPANY_FOLLOWED_BY_MEMBER\" }","response":"{ \"followers\": response.firstDegreeSize }"}},"annotations":{"readOnlyHint":true,"idempotentHint":true}}]}}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema_version": 1,
3
- "generated_at": "2026-10-22T19:07:08.584Z",
3
+ "generated_at": "2026-10-22T20:23:19.320Z",
4
4
  "connectors": [
5
5
  {
6
6
  "id": "github",
@@ -183,7 +183,7 @@
183
183
  "applications": [
184
184
  "linkedin"
185
185
  ],
186
- "hash": "51ec323b9180c6aad1559f4f2cba69bc05e97b2c5cf45c21b24b671a34b46d36"
186
+ "hash": "8a450f75e1d62a5f3e18d97c99bd1a5bc4d72c1699127f998399c26d6917843b"
187
187
  },
188
188
  {
189
189
  "id": "linear-official",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-s/connectors",
3
- "version": "0.0.20261022190708",
3
+ "version": "0.0.20261022202319",
4
4
  "description": "Willow connector catalog: one schema for every connector, plus the published catalog JSON",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",