Markaestro
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MARKAESTRO_API_KEY | No | Workspace API key from Settings, API Access (e.g. mk_live_...). Only needed when running the local stdio package `npx -y @markaestro/mcp`, which reads media from your own disk. The hosted MCP server at https://markaestro.com/api/public/v1/mcp requires no key or arguments; it authenticates via OAuth 2.1 with PKCE and dynamic client registration. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_productsA | List the brands (products) this connection can act on, with their connected channels: one brand for a single-brand connection, every brand in the workspace for an all-brands one. Call this first to learn each productId and which channels can be posted to. |
| list_destinationsA | List the publishable destinations (Facebook Page, Instagram account, TikTok account, ...) of a brand, with their ids and delivery modes. Use a destinationId on create_post only when a channel has more than one destination. |
| get_brand_profileA | A brand's description, website, categories, voice, and visual identity as set in Markaestro. Read it before writing captions so they sound like the brand. Read-only. |
| list_postsA | List posts, newest first. Filter by status: draft, scheduled, publishing, published, platform_action_required, failed, partial_failed. On an all-brands connection, pass productId to list one brand. Use cursor from a previous page to continue. |
| get_postB | Fetch one post with its targets, status, media, schedule, publish results, and live URL when published. |
| update_postA | Change a draft or scheduled post: its caption, its media, one channel's settings (settings.__type names the channel), or, for a scheduled post, its time. Omitted fields stay as they are. Every change is checked against the rules of every channel the post targets, and a scheduled post must still be publishable afterwards. Published and failed posts cannot be edited. Channels are fixed once a post exists; to post somewhere else, create a new post. |
| create_postA | Create a post for this brand. Without scheduledAt the post is saved as a DRAFT and nothing is published; with scheduledAt it is scheduled and the worker publishes it at that time. Pass either a single channel or a targets array (one entry per channel). Upload media first with upload_media and pass the asset ids. Read channel rules with get_channel_rules before posting. |
| publish_postA | Queue an immediate publish of a draft post. Returns a job run; poll get_job_run until status is succeeded or failed. For manual_reminder targets this queues a reminder for a person instead of calling the platform. The post goes public on the platform as soon as the run succeeds. |
| mark_post_postedA | Record that a person has posted a manual-reminder or TikTok-inbox post natively, which moves it from platform_action_required to published. Only for posts in platform_action_required that the user has already posted themselves. Nothing is sent to any platform. |
| delete_postA | Delete a draft, or cancel a scheduled, failed, or waiting-to-be-posted post before it reaches any platform. Published posts cannot be deleted or taken down from here: that stays with the user in Markaestro. Posts mid-publish cannot be deleted until the run settles. |
| bulk_postsA | Apply one action to up to 25 posts: reschedule (needs scheduledAt), or status (draft or scheduled). Per-post failures are reported individually. To remove posts, use delete_post on each draft. |
| create_postsA | Create up to 25 posts in one call, for example a week of scheduled content. Each item takes the same fields as create_post. Failures are per item: the response lists ok/error for each, and the successful ones are created even when others fail. |
| preview_evergreen_queueA | Check whether a published post has mature measured performance and get a recommended Evergreen cadence. This does not create or schedule anything. |
| list_evergreen_queuesA | List this brand's Intelligent Evergreen queues and their activation evidence, cadence, next run, and status. |
| get_evergreen_queueB | Get one Intelligent Evergreen queue including its caption variants. |
| create_evergreen_queueA | Create a draft Evergreen queue from an eligible published post. Creation does not activate it or schedule anything; activate_evergreen_queue does that separately. |
| update_evergreen_queueA | Update a queue's cadence, review policy, expiry, name, or full caption-variant set. Pass the current version from get_evergreen_queue; a stale version is rejected so concurrent edits are not overwritten. |
| activate_evergreen_queueA | Activate a draft or paused queue. This schedules future public posts. The user must have confirmed the caption variants (contentConfirmed on create_evergreen_queue or update_evergreen_queue); otherwise this answers EVERGREEN_CONTENT_REVIEW_REQUIRED. |
| pause_evergreen_queueA | Pause a queue and unschedule any pending occurrence generated by it. |
| resume_evergreen_queueB | Resume a paused queue and compute its next occurrence from the current time. |
| list_evergreen_runsC | List the generated occurrences and evaluation outcomes for a queue. |
| get_evergreen_analyticsA | Get source metrics, queue-lifetime metrics, tracked clicks, attributed conversions, and recent run outcomes. Unavailable provider metrics are null, not zero. |
| get_analyticsA | Performance over a window for the connection's brand, or on an all-brands connection for the workspace or the one brand named by productId: totals with the prior period for deltas, per-channel rollups, daily series, engagement breakdown, follower trend, top posts, posting-time heatmap, content-type averages, computed insights, and coverage. Covers the whole account: posts published through Markaestro and posts published directly on the platform (discovered from the connected account); coverage.bySource says how many of each. Read this before recommending what, when, or where to post. The window is clamped to the plan's history (the response reports maxDays). Unavailable provider metrics are null, not zero. |
| list_post_analyticsA | Every post in the window (the connection's brand, or on an all-brands connection the workspace or the brand named by productId) with its latest metrics (views, reach, likes, comments, shares, saves, clicks, engagements, engagement rate), one row per post, sorted. Includes posts published directly on the platform; each row's source says markaestro or native (canTakeDown is informational: taking a live post down is done by the user in Markaestro, not by delete_post). Use sort=engagements or sort=views to find what worked; sort=published_at (default) for a chronological read. Pair with get_post for the full caption and media of a Markaestro post (native posts have externalUrl instead). |
| get_post_analytics_historyA | How one post earned its numbers over time: the metric snapshots taken 1h, 6h, 24h, 72h, 7d, 14d, 30d, 60d, and 90d after publish (a post published directly on the platform starts with a discovered snapshot), with the growth between stages, plus the current totals and whether polling is still active. Takes any id from get_analytics or list_post_analytics. Answers NOT_FOUND for posts outside this brand. |
| refresh_analyticsA | Pull live metrics from the platforms now instead of waiting for the next scheduled poll: posts in the window (optionally one channel, or one brand on an all-brands connection) and today's follower counts. The answer says how many posts were updated and how many remain, since a large window may take more than one refresh. Limited to a few calls a minute. |
| suggest_post_timesA | When this brand's audience responds best, learned by Markaestro Intelligence from the brand's own post history (not an industry table). timing is null until there is enough history; readiness says how much there is. Use it to pick scheduledAt. Needs a plan with Intelligence. |
| upload_mediaA | Upload an image or video from a local file path, an http(s) URL, or a data: URL. Returns the media asset; pass its id in create_post mediaAssetIds. Counts against the workspace's monthly upload quota. |
| list_mediaB | List uploaded media assets with their ids, type, dimensions, and how many posts reference them. |
| get_mediaA | Fetch one media asset: type, dimensions, processing state, thumbnail, and how many posts reference it. |
| get_job_runA | Check the status of a publish run returned by publish_post: queued, running, succeeded, or failed, with the message and details. |
| list_job_runsB | List recent publish runs, optionally filtered by status or by the post id (resourceId). |
| get_channel_rulesA | The per-channel media, caption, and delivery-mode rules the API enforces, plus the draft-then-publish model. Read before creating posts. |
| get_tiktok_posting_optionsA | The connected TikTok creator's live posting options: allowed privacy levels, whether comments, duets, and stitches can be enabled, and the longest video. TikTok requires a Direct Post to use these, so read them right before building one and pass the chosen privacyLevel in the tiktok settings. Test keys get a sandbox answer. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| schedule_post | Walk through creating and scheduling a post for this brand. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| channel-rules | Per-channel media, caption, and delivery-mode rules. |
TDQS
Scored across 34 tools
Most tools have distinct resource+action targets (posts, media, evergreen queues, jobs). The four analytics tools (get_analytics, list_post_analytics, get_post_analytics_history, get_evergreen_analytics) and the create_post/create_posts/bulk_posts/update_post cluster overlap somewhat, but descriptions clearly scope each to a level (account vs per-post list vs single-post history) or operation, so misselection is limited.
Strong, predictable verb_noun convention throughout (list_posts, get_post, create_post, update_post, delete_post, activate_evergreen_queue, refresh_analytics). The few deviations (bulk_posts, mark_post_posted, preview_evergreen_queue) are still readable and don't significantly break the pattern.
34 tools is on the heavy side and clearly above the ideal 3-15 range. The breadth is partially justified by several genuine sub-domains (posts, media, evergreen lifecycle, analytics, jobs), but the analytics and post-creation clusters in particular could be consolidated.
Covers full lifecycle: post CRUD plus bulk create/reschedule, media upload/list/get, complete evergreen queue lifecycle (create/update/activate/pause/resume/preview/runs/analytics), multi-level analytics with refresh, job runs, brand profile, channel rules, destinations, and products. Only trivial gaps (e.g. no media delete), so no real dead ends for the stated domain.