POST /services/data/vXX.0/connect/files/users/me with the binary file content using multipart/form-data to upload the file and obtain a ContentDocument ID
Construct a JSON body with 'feedElementType':'FeedItem', 'subjectId' set to the target record ID, and a 'capabilities.files.items' array containing the ContentDocument ID
POST /services/data/vXX.0/connect/feed-elements to create the feed item with the attachment
Capture the returned 'id' (feed element ID) and poll or subscribe to confirm the item appears in the record feed
Use GET /services/data/vXX.0/connect/feed-elements/{feedElementId} to verify the attachment and body are correct
Known gotchas
The Connect REST API uses its own URL namespace (/connect/) which is separate from the SObject REST API; mixing endpoints causes 404 errors
File uploads via Connect REST have size limits distinct from the org's file size setting — check the 'maxFileSizeBytes' from /connect/organization
ContentDocument IDs uploaded to a user's personal library must be shared to the record's library or the feed attachment will not render for other users
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp