Skip to main content
Glama
hermoso-ai

Hermoso

Official

Send a Bluesky direct message

send_bluesky_dm

Send a direct message on Bluesky to a handle or existing conversation. Use the dry run to verify deliverability before sending, with specific refusal reasons like blocked, suspended, or nonexistent accounts.

Instructions

Send ONE direct message on the connected Bluesky account, either into an existing conversation (convoId) or to a named handle (a conversation is opened for you — the handle is resolved to a DID first, because Bluesky identifies chat members by DID). A DM allows 1000 characters, NOT the 300 a post allows. Refusals name the real situation rather than a generic failure: the recipient has DMs off, only accepts DMs from people they follow, has blocked this account, is suspended, or does not exist. There is deliberately no broadcast form — a recipient is always named.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
toNothe recipient’s Bluesky handle, e.g. alice.bsky.social. Ignored when convoId is given.
textYesthe message, up to 1000 characters
dryRunNoCHECK FIRST, SEND NOTHING. Asks Bluesky whether a DM to `to` would be delivered at all and returns canChat plus the reason when it would not — that account has DMs off, only accepts them from people it follows, has blocked this one, is suspended, or does not exist. Free, and the message is NOT sent. Use it before writing a long DM to someone who has never been messaged, so a refusal costs nothing instead of arriving after the words were written. `text` is still validated for length so a dry run cannot pass on a message the real send would refuse.
convoIdNoreply into an existing conversation (from list_bluesky_convos). Omit to start one with `to`.
replyToMessageIdNoreply to a specific message in the conversation
Behavior4/5

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

Annotations already indicate readOnlyHint=false and destructiveHint=false, so the agent knows it's a mutating but non-destructive operation. The description adds valuable context: the 1000-character limit (unusual vs posts), refusal reasons (DMs off, only follows, blocked, suspended, does not exist), and the automatic conversation opening. This goes beyond the annotations and helps set expectations for error handling.

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

Conciseness5/5

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

Three tight sentences with zero fluff. The core action is first, followed by the character-limit nuance, then refusal behavior, all front-loaded and essential. No redundancy with the schema or annotations.

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

Completeness4/5

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

For a tool with 5 params and no output schema, the description covers the main entry points (convoId vs to), the key constraint (1000 chars), and the failure modes. It doesn't describe the return value, but the absence of an output schema makes that less critical. The dryRun param is well-covered in the schema. Overall, the description provides sufficient context for correct invocation.

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 all parameters are documented. The description adds meaning beyond the schema by explaining the DID resolution for `to` and implying mutual exclusivity between `to` and `convoId`. It also reinforces the 1000-character limit in text, which aligns with the schema description. This extra context justifies a score above the baseline of 3.

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 states the exact action: 'Send ONE direct message on the connected Bluesky account.' It distinguishes from siblings like post_to_bluesky by explicitly noting the character limit difference (1000 vs 300) and states there is 'deliberately no broadcast form,' making it clear this is for one-on-one messaging, not public posting.

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

Usage Guidelines4/5

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

It clearly explains the two modes: reply into an existing conversation (convoId) or start a new one with a handle (to), and mentions that the handle is resolved to a DID. The dryRun param is described in schema as a check-first option, and the description's 'no broadcast form' implies alternatives exist but doesn't explicitly name them. It provides strong situational guidance without needing to enumerate every alternative.

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

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/hermoso-ai/hermoso'

If you have feedback or need assistance with the MCP directory API, please join our Discord server