Skip to main content
Glama

Send message

messages_send

Send message

201 for a new send. A replay of an Idempotency-Key returns the original result with 200.

Input Schema

NameRequiredDescriptionDefault
targetYes
contentYesUp to the platform's `limits.characters`. Longer content fails with `contentRejected`.
idempotencyKeyNoMakes retries safe: a replay with the same key and body returns the original message. Scoped to the team.
replyToMessageIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / $defs / Platform / description
      Previous value: -"The platform. Every team can use twitter, linkedin; a team may have others enabled."New value: +"The platform. Every team can use twitter, linkedin, whatsapp; a team may have others enabled."
    • changedInput schema / $defs / Platform / examples
      Previous value: -[
      -  "twitter",
      -  "linkedin"
      -]New value: +[
      +  "twitter",
      +  "linkedin",
      +  "whatsapp"
      +]
  2. Changed2 schema fields changed
    • changedInput schema / $defs / Platform / description
      Previous value: -"The platform. Every team can use twitter; a team may have others enabled."New value: +"The platform. Every team can use twitter, linkedin; a team may have others enabled."
    • changedInput schema / $defs / Platform / examples
      Previous value: -[
      -  "twitter"
      -]New value: +[
      +  "twitter",
      +  "linkedin"
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / target / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "description": "An existing thread.",
      -    "properties": {
      -      "threadId": {
      -        "$ref": "#/$defs/Cuid2"
      -      },
      -      "type": {
      -        "enum": [
      -          "thread"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "threadId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "The contact's profile on the account link's platform, in its existing thread or a new one. Fails with `recipientUnavailable` when the contact has none there, and `profileAmbiguous` when it has several.",
      -    "properties": {
      -      "accountLinkId": {
      -        "allOf": [
      -          {
      -            "$ref": "#/$defs/Cuid2"
      -          },
      -          {
      -            "description": "The account link to send from."
      -          }
      -        ]
      -      },
      -      "contactId": {
      -        "$ref": "#/$defs/Cuid2"
      -      },
      -      "type": {
      -        "enum": [
      -          "contact"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "accountLinkId",
      -      "contactId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "description": "A platform user, in its existing thread or a new one. Without the Advanced API add-on, the profile must already belong to one of the team's contacts.",
      -    "properties": {
      -      "accountLinkId": {
      -        "allOf": [
      -          {
      -            "$ref": "#/$defs/Cuid2"
      -          },
      -          {
      -            "description": "The account link to send from."
      -          }
      -        ]
      -      },
      -      "platform": {
      -        "allOf": [
      -          {
      -            "$ref": "#/$defs/Platform"
      -          },
      -          {
      -            "description": "Must be the account link's platform."
      -          }
      -        ]
      -      },
      -      "platformId": {
      -        "description": "The ID the platform gives this object. Only meaningful next to its `platform`.",
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "type": {
      -        "enum": [
      -          "profile"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "type",
      -      "accountLinkId",
      -      "platform",
      -      "platformId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "description": "An existing thread.",
      +    "properties": {
      +      "threadId": {
      +        "$ref": "#/$defs/Cuid2"
      +      },
      +      "type": {
      +        "enum": [
      +          "thread"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "threadId"
      +    ],
      +    "title": "Thread",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "The contact's profile on the account link's platform, in its existing thread or a new one. Fails with `recipientUnavailable` when the contact has none there, and `profileAmbiguous` when it has several.",
      +    "properties": {
      +      "accountLinkId": {
      +        "allOf": [
      +          {
      +            "$ref": "#/$defs/Cuid2"
      +          },
      +          {
      +            "description": "The account link to send from."
      +          }
      +        ]
      +      },
      +      "contactId": {
      +        "$ref": "#/$defs/Cuid2"
      +      },
      +      "type": {
      +        "enum": [
      +          "contact"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "accountLinkId",
      +      "contactId"
      +    ],
      +    "title": "Contact",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A platform user, in its existing thread or a new one. Without the Advanced API add-on, the profile must already belong to one of the team's contacts.",
      +    "properties": {
      +      "accountLinkId": {
      +        "allOf": [
      +          {
      +            "$ref": "#/$defs/Cuid2"
      +          },
      +          {
      +            "description": "The account link to send from."
      +          }
      +        ]
      +      },
      +      "platform": {
      +        "allOf": [
      +          {
      +            "$ref": "#/$defs/Platform"
      +          },
      +          {
      +            "description": "Must be the account link's platform."
      +          }
      +        ]
      +      },
      +      "platformId": {
      +        "description": "The person's ID on the platform. Reaching someone Inboxapp hasn't stored needs the account link's `profile:resolve:id`.",
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "type": {
      +        "enum": [
      +          "profile"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "accountLinkId",
      +      "platform",
      +      "platformId"
      +    ],
      +    "title": "Profile by platform ID",
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "description": "A platform user, in its existing thread or a new one. Without the Advanced API add-on, the profile must already belong to one of the team's contacts.",
      +    "properties": {
      +      "accountLinkId": {
      +        "allOf": [
      +          {
      +            "$ref": "#/$defs/Cuid2"
      +          },
      +          {
      +            "description": "The account link to send from."
      +          }
      +        ]
      +      },
      +      "platform": {
      +        "allOf": [
      +          {
      +            "$ref": "#/$defs/Platform"
      +          },
      +          {
      +            "description": "Must be the account link's platform."
      +          }
      +        ]
      +      },
      +      "type": {
      +        "enum": [
      +          "profile"
      +        ],
      +        "type": "string"
      +      },
      +      "username": {
      +        "description": "The person's username on the platform, without a display prefix such as `@`. On LinkedIn, what follows `/in/` in their profile URL: the vanity name or the `ACoA…` profile ID. Reaching someone Inboxapp hasn't stored needs the account link's `profile:resolve:username`.",
      +        "examples": [
      +          "jane",
      +          "ACoAABcdEfGh1234567890"
      +        ],
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "accountLinkId",
      +      "platform",
      +      "username"
      +    ],
      +    "title": "Profile by username",
      +    "type": "object"
      +  }
      +]
  4. First observed

TDQS

C2.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so safety and world scope are covered. The description adds one genuinely new behavioral fact beyond them: a `201` on new sends and a `200` replay when an `Idempotency-Key` is reused. It omits rate limits, permission/add-on requirements, and what happens without an idempotency key (duplicate sends), so it earns only partial credit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is short and front-loaded with no padding, but the first line duplicates the title and the remaining sentence is an implementation detail rather than guidance. Conciseness is achieved through omission rather than tightness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with four parameters, a four-way polymorphic target union, optional idempotency, and no output schema, the description leaves the agent to infer the entire send model from the schema. Nothing covers error behavior (recipientUnavailable, profileAmbiguous, contentRejected) or the Advanced API add-on constraint, which the agent needs to route a send correctly.

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

Parameters2/5

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

At 50% schema description coverage the description is expected to compensate, but it explains no parameter. It only gestures at "Idempotency-Key" (the field is named idempotencyKey) without explaining scoping or when to supply it, and never mentions the polymorphic target variants, content limits, or replyToMessageId. The schema's own nested descriptions carry nearly all the meaning here.

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

Purpose2/5

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

The description's only purpose statement is "Send message", which is a verbatim restatement of the tool title and the name messages_send. It does not say what a send targets (thread, contact, or platform profile), nor does it distinguish this from siblings such as messages_edit, messages_attachment, messages_react, or threads_typing.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives: no mention of when to reply via replyToMessageId, when to reach a new profile vs. an existing contact, or when messages_edit/threads_typing would be the right call instead. The only conditional statement concerns status codes, not tool selection.

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