create_rich_text_post
Create a post with rich text formatting including mentions, links, and hashtags.
Authentication
Required: Yes (Private tool)
Parameters
text (required)
- Type:
string - Constraints: 1-300 characters
- Description: Post text with rich formatting
facets (optional)
- Type:
Array<Facet> - Description: Rich text facets (mentions, links, tags)
reply (optional)
- Type:
object - Description: Reply information
- Properties:
root: Root post URIparent: Parent post URI
embed (optional)
- Type:
object - Description: Embedded content
langs (optional)
- Type:
string[] - Description: Language codes
Facet Types
Mention
typescript
{
index: {
byteStart: number;
byteEnd: number;
};
features: [{
$type: "app.bsky.richtext.facet#mention";
did: string;
}];
}Link
typescript
{
index: {
byteStart: number;
byteEnd: number;
};
features: [{
$type: "app.bsky.richtext.facet#link";
uri: string;
}];
}Tag (Hashtag)
typescript
{
index: {
byteStart: number;
byteEnd: number;
};
features: [{
$type: "app.bsky.richtext.facet#tag";
tag: string;
}];
}Response
typescript
{
uri: string;
cid: string;
success: boolean;
message: string;
}Examples
Post with Mention
json
{
"text": "Great work @alice.bsky.social!",
"facets": [
{
"index": {
"byteStart": 11,
"byteEnd": 30
},
"features": [
{
"$type": "app.bsky.richtext.facet#mention",
"did": "did:plc:abc123"
}
]
}
]
}Post with Link
json
{
"text": "Check out this article: https://example.com",
"facets": [
{
"index": {
"byteStart": 24,
"byteEnd": 43
},
"features": [
{
"$type": "app.bsky.richtext.facet#link",
"uri": "https://example.com"
}
]
}
]
}Post with Hashtag
json
{
"text": "Loving the #atproto community!",
"facets": [
{
"index": {
"byteStart": 11,
"byteEnd": 19
},
"features": [
{
"$type": "app.bsky.richtext.facet#tag",
"tag": "atproto"
}
]
}
]
}Post with Multiple Facets
json
{
"text": "Hey @alice check out #atproto at https://atproto.com",
"facets": [
{
"index": { "byteStart": 4, "byteEnd": 10 },
"features": [{
"$type": "app.bsky.richtext.facet#mention",
"did": "did:plc:abc123"
}]
},
{
"index": { "byteStart": 21, "byteEnd": 29 },
"features": [{
"$type": "app.bsky.richtext.facet#tag",
"tag": "atproto"
}]
},
{
"index": { "byteStart": 33, "byteEnd": 53 },
"features": [{
"$type": "app.bsky.richtext.facet#link",
"uri": "https://atproto.com"
}]
}
]
}Error Handling
Common Errors
Invalid Byte Indices
json
{
"error": "Facet byte indices are invalid",
"code": "VALIDATION_ERROR"
}Invalid DID
json
{
"error": "Invalid DID format for mention",
"code": "VALIDATION_ERROR"
}Best Practices
Byte Indices
- Use UTF-8 byte positions, not character positions
- Ensure indices don't overlap
- Validate indices before submission
Mentions
- Resolve handles to DIDs before creating facets
- Verify user exists before mentioning
- Limit mentions to avoid spam
Links
- Use full URLs with protocol (https://)
- Validate URLs before creating facets
- Consider using link previews
Hashtags
- Use lowercase for tags
- Remove # symbol from tag value
- Keep tags relevant and specific
Related Tools
- create_post - Create simple posts
- generate_link_preview - Generate link previews