> This page is for Agent Handler.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.merge.dev/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.merge.dev/_mcp/server.

# Ordinal

**Authentication:** API key or company API key. See [Magic Link](/merge-agent-handler/features/magic-link) for the runtime auth flow.

## Sample use cases

* Draft a LinkedIn post from a product update and schedule it for Tuesday at 9am
* Pull post analytics for last month's X posts and rank them by engagement
* List posts waiting on approval and notify each reviewer

## Available Tools

#### get_linkedin_follower_growth

Retrieve follower counts over time for a connected LinkedIn profile, as one data point per recorded day. Use...

#### get_linkedin_post_analytics

Retrieve per-post LinkedIn metrics for a connected profile: impressions, reactions, comments, shares, clicks, video...

#### get_x_follower_growth

Retrieve follower counts over time for a connected X profile, as one data point per recorded day. Use...

#### get_x_post_analytics

Retrieve per-post X metrics for a connected profile: impressions, likes, replies, retweets, quotes, bookmarks...

#### get_analytics_cpm

Read the workspace's cost-per-mille values per platform. These are the multiplier behind the `emv` figure on every...

#### update_analytics_cpm

Set the workspace's cost-per-mille values, one or more platforms at a time. This retroactively changes the `emv`...

#### list_post_approvals

List the approval requests on a post, showing who was asked, who has signed off, and which requests block...

#### create_approvals

Ask one or more workspace members to approve a post, optionally with a note, due date, and a blocking flag that...

#### delete_approval

Withdraw an approval request from a post. If it was blocking, the post can publish again. Use list_post_approvals to...

#### list_post_comments

List the team's comments on a post, oldest first, with who wrote each one. These are internal review comments, not...

#### create_post_comment

Add an internal comment to a post for the team to see. To notify someone, mention them as `@[Display Name](userId)`...

#### delete_comment

Delete an internal comment from a post. Use list_post_comments to find comment IDs.

#### list_post_inline_comments

List inline comment threads on a post, each anchored to a highlighted piece of draft copy, with its replies and...

#### list_company_workspaces

List every workspace in the company. Requires a company API key, not a workspace key. Returns the workspace IDs that...

#### create_company_workspace

Create a new workspace in the company, optionally seeding it with members. Requires a company API key. Returns the...

#### get_company_workspace

Retrieve one workspace in the company by ID, including its timezone. Requires a company API key. Use...

#### list_workspace_api_keys

List the API keys issued for one workspace, with their names and last-used times. The key values are never returned...

#### create_workspace_api_key

Mint a new API key for one workspace. Requires a company API key. The key value is returned once here and never...

#### list_post_engagements

List the likes, comments, and reposts queued on a post for teammates' profiles to perform after it publishes, with...

#### create_post_engagements

Queue likes, comments, or reposts that teammates' profiles perform automatically after a post publishes. Call...

#### update_engagement

Change a queued engagement's comment text, delay, profile, or LinkedIn reaction. Only the fields you pass change...

#### delete_engagement

Remove a queued engagement so that profile will not like, comment, or repost when the post publishes. Use...

#### list_ideas

List unscheduled ideas, newest first. Filters by channel, profile, label, and creation date are applied by Ordinal...

#### create_idea

Create an unscheduled idea with copy for LinkedIn, X, TikTok, or YouTube Shorts. Ideas have no publish time; use...

#### get_idea

Retrieve one idea with its per-channel copy and media. Use list_ideas to find idea IDs.

#### update_idea

Update an idea's title, labels, campaign, notes, or per-channel copy. Only the fields you pass change. Use...

#### archive_idea

Archive an idea, moving it out of the idea list into the trash. Use unarchive_idea to restore it, and list_ideas to...

#### unarchive_idea

Restore an archived idea back to the idea list. Use list_ideas to find idea IDs.

#### add_idea_to_calendar

Promote an idea to a calendar post on a given date, carrying its copy across. Returns the new post ID, which...

#### list_invites

List workspace invitations that have not been accepted yet, with who sent each one. For members who have already...

#### create_invite

Invite someone to the workspace by email. Ordinal emails them immediately, so only call this for a real teammate...

#### delete_invite

Revoke a pending workspace invitation so the link stops working. Use list_invites to find invite IDs.

#### list_labels

List the labels defined in the workspace, with their IDs and colors. Call this before create_post, update_post...

#### create_label

Create a workspace label that can then be assigned to posts and ideas. Returns the new label ID for use as a...

#### delete_label

Delete a workspace label. It is removed from every post and idea that carried it. Use list_labels to find label IDs.

#### get_linkedin_mention_format

Resolve a LinkedIn vanity name into the `@[Name](urn)` string LinkedIn post copy needs to tag a person or company...

#### get_linkedin_profile

Look up a LinkedIn person or company by URN and get their display name, vanity name, and avatar. Use...

#### search_instagram_locations

Search Instagram locations by name for the pageId that tagging a location on an Instagram Feed or Reel post needs...

#### list_posts

List posts on the Ordinal calendar, newest first. Filters by status, channel, profile, label, publish date, and...

#### create_post

Create a post with copy for one or more channels. Call list_scheduling_profiles for profileIds, list_labels for...

#### get_post

Retrieve one post with its full per-channel copy, media, labels, and schedule. Use list_posts to find post IDs. For...

#### update_post

Update a post's title, publish time, status, labels, notes, or per-channel copy. Only the fields you pass change...

#### archive_post

Archive a post, moving it off the calendar into the trash without publishing it. Use unarchive_post to restore it...

#### unarchive_post

Restore an archived post back onto the calendar. Its schedule is not restored, so follow with schedule_post if it...

#### schedule_post

Queue a post to publish, optionally at a new time. This makes the post go live on the connected social accounts at...

#### unschedule_post

Remove a post from the publishing queue and return it to a draft status. The copy is kept. Use schedule_post to...

#### list_post_versions

List saved draft versions of a post's copy, grouped by channel, with who edited each one. Returns metadata only, so...

#### get_post_version

Read the plain-text copy of one saved draft version for one channel. Use list_post_versions to find version IDs and...

#### list_scheduling_profiles

List the connected social accounts posts can publish from, with the profile IDs that create_post, update_post...

#### list_engagement_profiles

List the connected social accounts that can like, comment, and repost on behalf of the team, with the profile IDs...

#### list_slack_webhooks

List the Slack channels connected to the workspace, with the slackWebhookId values create_slack_boost and...

#### list_post_slack_boosts

List the Slack notifications queued on a post, which channel each goes to, and whether Ordinal added it...

#### create_slack_boost

Queue a Slack notification asking a channel to go engage with a post when it publishes. Call list_slack_webhooks for...

#### get_slack_boost

Retrieve one Slack boost with its message text and target channel. Use list_post_slack_boosts to find boost IDs.

#### update_slack_boost

Change a Slack boost's message text or move it to a different channel. Only the fields you pass change. Use...

#### delete_slack_boost

Remove a Slack boost so no notification is sent for the post. Use list_post_slack_boosts to find boost IDs.

#### list_post_subscribers

List the workspace members subscribed to notifications about a post, and who added each of them. Use list_posts to...

#### add_post_subscribers

Subscribe workspace members to notifications about a post. Call list_users for userIds and list_posts for the...

#### delete_subscriber

Unsubscribe a member from a post's notifications. Use list_post_subscribers to find subscriber record IDs, which are...

#### upload_file_from_url

Import an image or video from a public URL so it can be attached to a post. Returns an upload job, not an asset...

#### prepare_file_upload

Reserve an upload slot and get signed credentials for sending local file bytes to Ordinal yourself, as a multipart...

#### get_upload_status

Check an upload job and read its assetId once processing finishes. Status is 'pending' or 'processing' while Ordinal...

#### list_webhooks

List the webhooks configured in the workspace, with their delivery URLs and subscribed event topics. Use get_webhook...

#### create_webhook

Create a webhook that POSTs Ordinal events to a URL. Subscribe to topics such as post.published...

#### get_webhook

Retrieve one webhook with its delivery URL, subscribed topics, and custom headers. Use list_webhooks to find webhook...

#### update_webhook

Change a webhook's name, delivery URL, subscribed topics, description, or custom headers. Passing topics or headers...

#### delete_webhook

Delete a webhook so Ordinal stops delivering events to it. Use list_webhooks to find webhook IDs.

#### get_workspace

Retrieve the workspace this API key belongs to: name, slug, and the IANA timezone that publishDate values and the...

#### list_users

List workspace members with the user IDs that create_approvals, add_post_subscribers, and `@[Name](userId)` comment...