Skip to main content
Glama

Reach MCP — LinkedIn for AI agents

list_conversation_messages

Read-onlyIdempotent

List messages in a LinkedIn conversation via Voyager /messaging/conversations/{id}/events (Kanbox get_conversation_messages), with optional created_before paging — same as GET /api/linkedin/{account_id}/conversations/{conversation_linkedin_id}/messages. Do not call this in a loop to wait for replies: the same read is refused if repeated within 60s, inbox reads are capped at 300 per account per day, and polling gets LinkedIn accounts restricted. Subscribe a webhook to message.received instead. Use after list_conversations to read a thread before replying; the conversation_linkedin_id comes from list_conversations.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "account_id": "<account_id>",
      "conversation_linkedin_id": "<conversation_linkedin_id>"
    },
    "name": "list_conversation_messages"
  }
}

Input Schema

NameRequiredDescriptionDefault
page_idNoThe conversation is in this company page's inbox (page_id from list_managed_pages). Returns the latest messages; created_before is not supported there.
account_idYesReach id of the LinkedIn account to act on, from list_accounts.
created_beforeNoOnly messages created before this Unix timestamp in milliseconds, to page back in time.
conversation_linkedin_idYesConversation (thread) id, as returned by list_conversations.

Output Schema

NameRequiredDescriptionDefault
has_moreNoTrue when LinkedIn likely has older events (page size 20).
messagesNo
total_countNoNumber of messages in this response.
next_created_beforeNoPass as ``created_before`` to fetch the next (older) page.
conversation_linkedin_idNoKanbox ``Conversation.linkedin_id`` / conversation key.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / page_id
      Added value: +{
      +  "description": "The conversation is in this company page's inbox (page_id from list_managed_pages). Returns the latest messages; created_before is not supported there.",
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the readOnlyHint/idempotentHint annotations by disclosing operational constraints an agent cannot infer: repeated identical reads refused within 60s, 300 inbox reads per account per day, and the consequence that polling gets LinkedIn accounts restricted. It also flags that created_before paging is unsupported on the page_id path, which changes call strategy.

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?

Front-loads the core operation before the constraints, and each sentence carries information. It is dense—long em-dash and parenthetical chains in the first two sentences—which slightly slows parsing, but no sentence is filler.

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 an output schema exists (no need to describe returns), the description still covers source of the required id, paging behavior, page-inbox scoping, rate limits, and the safer polling alternative. Nothing an agent needs to call this correctly is missing.

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 100%, so the schema already documents all four parameters, including that conversation_linkedin_id comes from list_conversations and created_before is a millisecond Unix timestamp. The description's mention of created_before paging and the page_id caveat largely restates schema content, so it clears the baseline but adds little new semantics.

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?

Opens with a specific verb plus resource ('List messages in a LinkedIn conversation') and pins it to concrete endpoints (Voyager /messaging/conversations/{id}/events, Kanbox get_conversation_messages, GET /api/linkedin/.../messages), so an agent knows exactly which operation this is. The relationship to list_conversations is stated explicitly, making it distinguishable from the thread-listing siblings.

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?

Gives both the positive trigger ('Use after list_conversations to read a thread before replying') and a hard anti-pattern ('Do not call this in a loop to wait for replies') with the correct alternative named (subscribe to the message.received webhook). This is the explicit when/when-not/alternative pattern.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources