Skip to main content
Glama

Postkey: Instagram DM Automation and Comment-to-DM

List Inbox conversations

postkey_list_conversations
Read-onlyIdempotent

Postkey: Lists the profile's Instagram DM conversations, newest first, one page at a time: id, who it is with (untrusted), the last message and who wrote it, unread, state (open or closed) and who it is assigned to. Open conversations only unless state says otherwise. Use it to find a conversation_id; read the messages with postkey_get_conversation before replying, and find a person by name or handle with postkey_search_contacts. Pass next_cursor as cursor for the next page (null: the last page). On a profile with a team, team lists the member ids for postkey_assign_conversation.

Input Schema

NameRequiredDescriptionDefault
limitNoHow many to return, 1 to 50. Default 20.
stateNo"open" (default), "closed" or "all".
cursorNoThe next_cursor of the previous answer, as it was. Leave out for the first page.
unread_onlyNotrue: only conversations with unread messages, within state. Default false.

Output Schema

NameRequiredDescriptionDefault
okYesfalse: refused (isError; code, message, guide_topic, url); no change.
noteNoPresent when no DM account is connected or only the newest are listed.
teamNoOn a profile with a team: members with an Inbox seat (member_id, name).
totalNoConversations matching the filter.
unreadNoUnread conversations in the Inbox.
next_cursorNoPass as cursor for the next page; null on the last page.
conversationsNoNewest first: id, contact_id, with, handle, last_message, last_from, last_at, unread, state, assigned_to, labels.
untrusted_noteNoPresent when outside text is wrapped as { untrusted: true, text }.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / ok / description
      Previous value: -"false: refused (isError true; code, message, guide_topic, url), nothing changed."New value: +"false: refused (isError; code, message, guide_topic, url); no change."
  2. Changed5 schema fields changed
    • changedInput schema / properties / cursor / description
      Previous value: -"The next_cursor of the page before. Leave out for the first page."New value: +"The next_cursor of the previous answer, as it was. Leave out for the first page."
    • changedInput schema / properties / limit / description
      Previous value: -"How many to return (1 to 50). Default 20."New value: +"How many to return, 1 to 50. Default 20."
    • addedInput schema / properties / state / description
      Added value: +"\"open\" (default), \"closed\" or \"all\"."
    • changedInput schema / properties / unread_only / description
      Previous value: -"Only conversations with unread messages."New value: +"true: only conversations with unread messages, within state. Default false."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "conversations": {
      +      "description": "Newest first: id, contact_id, with, handle, last_message, last_from, last_at, unread, state, assigned_to, labels.",
      +      "items": {
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "next_cursor": {
      +      "description": "Pass as cursor for the next page; null on the last page.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "note": {
      +      "description": "Present when no DM account is connected or only the newest are listed.",
      +      "type": "string"
      +    },
      +    "ok": {
      +      "description": "false: refused (isError true; code, message, guide_topic, url), nothing changed.",
      +      "type": "boolean"
      +    },
      +    "team": {
      +      "description": "On a profile with a team: members with an Inbox seat (member_id, name).",
      +      "items": {
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "total": {
      +      "description": "Conversations matching the filter.",
      +      "type": "number"
      +    },
      +    "unread": {
      +      "description": "Unread conversations in the Inbox.",
      +      "type": "number"
      +    },
      +    "untrusted_note": {
      +      "description": "Present when outside text is wrapped as { untrusted: true, text }.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "ok"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. Beyond that, the description adds ordering (newest first), pagination mechanics ('Pass next_cursor as cursor... null: the last page'), the default open-only scope, the team member-id field for postkey_assign_conversation, and a prompt-injection caution ('who it is with (untrusted)') – all behavior not present in the structured fields.

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?

It is front-loaded and dense with no filler, but the long enumeration of returned fields partly duplicates what the output schema already provides, which is the one place the text does not fully earn its space.

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?

For a four-parameter, paginated read tool with full schema coverage, an output schema and rich annotations, the description covers purpose, routing, pagination and defaults. Nothing an agent needs in order to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds meaning: it explains the cursor round-trip ('pass next_cursor as cursor') and restates the state default, which clarifies how the parameters interact in practice rather than just defining them.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Lists the profile's Instagram DM conversations') and immediately scopes it ('newest first, one page at a time'), then enumerates the fields returned. That is enough for an agent to distinguish it from postkey_get_conversation or postkey_search_contacts without opening any schema.

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

Usage Guidelines5/5

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

It gives explicit routing: use this to find a conversation_id, then read messages with postkey_get_conversation before replying, and use postkey_search_contacts to find a person by name or handle. It also states the default filter ('Open conversations only unless state says otherwise'), so the agent knows both when to use it and how it differs from the alternatives.

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