Get Post
get_postUse this when you need one post's details to act on it: to edit it, check its media or checks, approve or review it at its current rev, or read several posts for a task. It returns data and draws nothing; when the person wants to see or review a post themselves, use show_post. Returns one post: body, channel fields, media (asset ids and names; on an X thread, meta.thread holds the replies and meta.threadMedia the asset ids on each reply, in the same order, with post 1 holding the rest; a social post's images from the CMS are meta.cmsImages, and meta.mediaOrder, when set, is the order of post 1's media across both), schedule, status, updatedAt, claim flags, comments (oldest first; each adds author, the display name or the raw id when the name cannot be resolved, and via, the client it was posted through or null), approval history, who approved it (approvedBy: { id, name, at }; name is "Mark (automatic)" for auto-approval and the raw id when the name cannot be resolved; null unless the post is approved, scheduled or published), the live URL (externalUrl), the reason it failed or was not sent (reviewNote), the handoff of an approved social post to the publisher (handoff: { state: handing_off } for the few seconds before it reads scheduled, { state: stuck, reason } when it can't go, with the fix: no scheduled time, no connected account for the channel, or no progress 5 minutes after approval; on an approved LinkedIn Article { state: publish_by_hand, reason } before its scheduled time and { state: publish_now, reason } from it on; on an approved website post whose post type no CMS maps { state: publish_by_hand, reason }, recorded with record_post_published once it is live on the site; null otherwise), the buyer questions a website post answers (buyerQuestions: id, question), the idea it was made for (idea: id, title, archived; null when none), a website post's language (language: a BCP 47 code such as de-CH, the locale its CMS page is saved in; null when unset), the post it translates (translationOf: id, language, title; null when it is not a translation) and the posts that translate it (translations: id, language, title), and, on a refresh of a live page Mark published, refresh: { text, pageUrl } with the reason Mark queued it (null otherwise; approving updates that same page). A published social post carries metricHistory: every metrics reading, oldest first, as { date (YYYY-MM-DD in the render timezone), day (whole days since publish), impressions, engagement }, the newest matching get_content_performance; impressions is the platform's impressions count and engagement is likes + comments + shares + saves, each the total the platform reported at that reading ([] before the first reading; null on unpublished posts). A published blog, FAQ or competitor post's metricHistory is instead its daily site-tag readings, oldest first, as { date (YYYY-MM-DD, the workspace calendar day it covers, whatever timezone is passed), pageviews, submissions (form submissions whose visit started on the page) }, with dataThrough (the newest reading's date, null before the first) and connection (ready, or no-posthog when the workspace has no PostHog project of its own; metricHistory is then [] and the person connects PostHog under Connections); [] before the first reading. Blog, FAQ and competitor posts also carry website: where the page goes, its delivery state (preview, queued, sent_to_cms, published, taken_down, failed, removed, conflict, out_of_sync), the page URL, the draft preview link on the tenant's site (previewUrl) with previewSentAt and previewStale for a pre-approval preview, previewLeftAt (set when the post was rejected or archived and Mark left that preview draft in the CMS; reviewNote says why), previewBlocked (why send_cms_preview is refused, or null), a failed job id to pass to sync_connections retryJobId, a live retry error when the job is still pending, and the exact document Mark sends to the CMS. conflict means the CMS page changed since Mark last sent it and needs an explicit overwrite-or-keep choice; conflictDiff then lists each changed field with its CMS value (cms) and Mark's value (mark); choose with resolve_cms_conflict. checks runs Mark's content checks on the current body, meta and language (exclusion, char_limit, required_meta, ai_fluff, unsourced_number, placeholder; table and open_placeholder on a competitor_page; keyword on a website post with meta.seo.keyword). revisionChecks are the results Mark stored for the current rev when it was sent to review, the ones the reviewer sees ([] at rev 0 or when Mark didn't check that revision); they include brand_fit (the brand voice and offer check, warn or pass) once it lands, up to a minute after submit, and never when the workspace's intelligence is off or its voice is unconfirmed. rev is the frozen revision. It advances on submit, and when save_post edits a post in review, approved or scheduled; saving a draft leaves it alone, and updatedAt confirms that save. Call this before approve_posts, review_post, or a save_post edit to a post in review, so you have the current rev. Optional timezone (IANA) renders scheduled and published times in that zone; it does not change stored data. Related: show_post, search_posts, save_post, approve_posts.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"postId": "<postId>"
},
"name": "get_post"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| postId | Yes | The post id from search_posts or save_post. | |
| timezone | No | IANA zone to render times in. Does not change stored data. Defaults to the workspace timezone. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes |