Tool reference
Every tool an AI agent can call in your Mark workspace, grouped by job, with read-only and write tools marked.
Mark's MCP server at https://app.use-mark.com/mcp has 110 tools. Each
workspace's own address (/mcp/o/‹workspace id›) has the same tools. An
agent calls them with your permissions in the workspace you picked when you
connected. To connect one, see
Connect your AI agent.
- Read-only tools never change anything.
- Write tools change data in your workspace.
- Write, destructive tools delete, disconnect, approve, or reject, or otherwise can't be taken back. Most clients ask you to confirm them.
A tool's reply text lists every row it returned, with ids, followed by a JSON copy of the result, so an agent whose client shows only text can pass those ids to the next tool.
Workspace and brand
| Tool | Name | What it does | Access |
|---|---|---|---|
| Get Workspace | get_workspace | Role, timezone, members, sites, each channel's account, approval mode and approver role, what needs attention, and this workspace's own MCP address (mcpUrl) | Read-only |
| Get Plan Usage | get_plan_usage | Plan, subscription status, trial end and the 4 plan caps with used and limit, the numbers Settings > Billing shows, plus links to change the plan in the app | Read-only |
| Set Workspace Timezone | set_workspace_timezone | Admin-only. Sets the workspace IANA timezone. Channels keep their local posting times | Write |
| Set Business Aliases | set_business_aliases | Set up to 5 other names AI answers count as naming your business, in past weeks too | Write |
| List Channels | list_channels | Each social channel: whether an account is connected and which one, approval mode, approver role, posting time, posting slots (each a weekday and a number of posts that day), and whether its rules were saved | Read-only |
| List Pinterest Boards | list_pinterest_boards | The connected Pinterest account's boards (id, name, privacy), read live, and which one new pins go to now. Use it to turn a board name into its id | Read-only |
| Set Pinterest Board | set_pinterest_board | Change the default board new pins go to. The board must be on the account's list. Posts that name their own board, and pins already scheduled or published, keep theirs | Write |
| Get Brand Context | get_brand_context | Brand voice, visuals, entities and evidence, and offer with which sections a person has confirmed, plus personas (with pains, jobs to be done and their words), pillars, angles, markets, buyer questions, KPI targets, active claims with their quotes, sources, active content exclusions, and the ready-to-paste Organization JSON-LD from your identity links (with your logo when you imported it from a public web address) | Read-only |
| Update Brand Profile | update_brand_profile | Edit brand voice (including posts that don't sound like the brand), visuals and logo, entities and evidence, or the offer (what you sell today, what is planned, pricing, promises, claims to avoid). Confirms a section only when you ask | Write |
| Export Context Pack | export_context_pack | Your context pack as four markdown files (company, customer, offer, voice) built from what is saved in Mark, with the workspace name and export date | Read-only |
| Save Content Exclusion | save_content_exclusion | Create or retire a phrase Mark blocks or warns on, optionally limited to one channel. Can link to the feedback report that asked for it | Write |
| Report Feedback | report_feedback | Record what you asked to change while drafting and the assistant's own checks, as short excerpts, never the conversation, so Mark can later suggest brand rules | Write |
| Suggest Brand Rules | suggest_brand_rules | Lists rules suggested from drafting feedback: phrases to block or warn on, and voice lines, each with your own words and how many reports asked for it. Saves nothing until you approve one | Read-only |
| Save Strategy Item | save_strategy_item | Create, edit, deactivate, or reactivate a persona (including pains, jobs to be done and their words), pillar, angle, market, buyer question, or KPI target. Edits send only the fields that change. A second target for the same metric and month is refused with the existing id. A new buyer question returns item.firstCheck: questions × markets × engines = checks the next AI answer check sends | Write |
| Delete Strategy Item | delete_strategy_item | Permanently delete a persona, pillar, angle, market, or KPI target, or delete a buyer question. A deleted buyer question leaves your list and future AI answer checks, its past results stay, and saving the same text again brings it back. A persona or pillar that angles use is refused, and the error names those angles. A market that posts, answer-engine checks or AI-visibility results use is refused | Write, destructive |
| List Market Locations | list_market_locations | Look up market locations by place name. Returns codes, country, and languages | Read-only |
| Set Up Market | set_up_market | Create or update an active market from a place name and language. A new market goes after the existing ones; an existing one keeps its name, priority and time zone | Write |
| Get Setup Status | get_setup_status | The setup checklist Home shows: each row done, to do or skipped, with its in-app link. gaps lists the rows to do and which tool or page fixes each; ready means every row is done or skipped and Social publishing is healthy. Connected social accounts and that connection's health are separate: with accounts connected but the connection needing attention, the social row is done and a separate gap gives the reason and when it was last checked | Read-only |
| Skip Setup Step | skip_setup_step | Skip one setup checklist row for the workspace (step: a row key from get_setup_status), or bring it back with skipped: false. A done row stays done | Write |
Claims and sources
| Tool | Name | What it does | Access |
|---|---|---|---|
| List Claims and Sources | list_claims | Active and retired claims with their quotes and sources, plus sources with their type and claim counts. Search, filter, or open one source's text | Read-only |
| Save Claim | save_claim | Add or revise a claim. The quote must appear in the source's text. Revising retires the old claim and returns both ids | Write |
| Retire Claim | retire_claim | Retire an active claim so drafts stop using it. It stays listed as retired and cannot be reactivated | Write, destructive |
| Add Source | add_source | Add pasted text, with an optional link, for claims to quote | Write |
| Update Source | update_source | Edit a pasted note's title, text, or link. Refuses a text edit that removes a passage any claim quotes | Write |
| Delete Source | delete_source | Delete a pasted note no claim or brand evidence cites. Cannot be undone | Write, destructive |
Posts, review, and calendar
| Tool | Name | What it does | Access |
|---|---|---|---|
| Get Channel Rules | get_channel_rules | Length limits, fields, and website CMS mapping for a channel; craft is in get_drafting_guide. For a LinkedIn Article (linkedin_article), the fields are title (required) and cover (optional) over a Markdown body. LinkedIn, Facebook and X, like Instagram, list altText (the post-wide alt text) and altTexts (one per image, in media order; on X, post 1's images, then each reply's) | Read-only |
| Get Drafting Guide | get_drafting_guide | The drafting guide for one channel (honesty rules, channel craft, writing craft, your brand rules and exclusions, your channel notes, limits) plus a guide version to pass to save_post. Every guide also covers when a post needs media and where to find it (your Assets or your CMS), design craft for a new graphic, and your brand's colors and fonts. Instagram, TikTok, YouTube and Pinterest guides also cover visual briefs (shot list, on-screen text, thumbnail, script) | Read-only |
| Search Posts | search_posts | Find posts by status (in_review is the review queue), channel, scheduled time range, website delivery state, or text. Each post lists its mediaCount (assets, a website cover and images from your CMS) and the buyer questions it answers, and a refresh of a live page carries refresh, the reason Mark queued it. An approved social post carries handoff: handing_off for the few seconds before it reads scheduled, or stuck with the reason and fix. An approved LinkedIn Article carries publish_by_hand, then publish_now once its time passes. Filtering on approved still returns all of them | Read-only |
| Get Post | get_post | One post's current revision, media (a website post's cover is meta.cover; on an X thread, meta.thread holds the replies and meta.threadMedia the asset ids on each reply, in the same order, and the first post has the rest; a social post's images from your CMS are meta.cmsImages, and meta.mediaOrder, when set, is the first post's media order), flags, comments (each with author, the writer's name or their id when Mark can't find the name, and via, the agent it came through or null), history, who approved it (approvedBy: id, name, time), the buyer questions a website post answers, the idea it was made for, language, the language a website post is written in (null when unset), translationOf and translations, the post it translates and the posts that translate it (each with id, language and title), refresh, the reason Mark queued a refresh of a live page, checks, Mark's content checks on the current text, revisionChecks, the checks Mark stored when the current revision was sent to review (including brand_fit, the brand voice and offer check, once it lands), and handoff: on an approved social post, handing_off for the few seconds before it reads scheduled, or stuck with the reason and fix (no scheduled time, no connected account, or no handoff 5 minutes after approval). An approved LinkedIn Article has publish_by_hand before its time and publish_now from it on. An approved website post with no CMS mapped has publish_by_hand. Every other post has handoff: null. A published social post has metricHistory: every metrics reading, oldest first, each with date, day (days since publish), impressions and engagement (likes, comments, shares and saves), counted the same way as Performance > Social. It's [] before the first reading and null on unpublished posts. A published blog, FAQ or competitor post's metricHistory is its daily readings from the site tag instead, oldest first, each with date (the workspace day it covers), pageviews and submissions (form submissions whose visit started on that page), plus dataThrough, the newest reading's date, and connection: ready, or no-posthog when the workspace has no PostHog project, with metricHistory then []. It's [] before the first reading | Read-only |
| Show Post | show_post | Use this when you want to see or review one post yourself. In Claude and ChatGPT it draws the post's preview, with Approve, Request changes and Reject on a post in review, and its comments with a box to add one; other clients get the same details as get_post. To read posts for a task, an agent uses get_post, which draws nothing | Read-only |
| Get Calendar | get_calendar | Scheduled and published posts, open slot positions (each with its slot id, local date, time: the channel's posting time plus 3 hours per post already that day, or now once that has passed today, and filled out of count), each channel's slot summary, and a next step for channels posting without slots. An approved social post's card carries handoff, as in get_post; an approved LinkedIn Article's reads publish_by_hand, or publish_now once its time passes. Each post card carries its pillar name (pillar, null when it has none) and pillarId, so an agent can filter by pillar or channel itself. It reads one week; for a month, call it once per week | Read-only |
| Check Draft | check_draft | Run Mark's content checks on draft text without saving: blocked or warned phrases, character limit, required details, AI-sounding words, numbers no claim states, and placeholders such as [needs source] or TODO left in the text. A competitor page also fails on a markdown table, a [confirm: …] fact left to confirm, or a number no active claim states. A website post with meta.seo.keyword also gets the keyword check, which warns, and never fails, when the SEO title or the first paragraph doesn't use the target keyword (plurals count). For an X thread, pass assetIds with meta.threadMedia and required details also checks each post's media. For a website post, pass language: when its post type's CMS collection stores pages per language, required details (required_meta) fails without one, and on another mapped collection it warns | Read-only |
| Save Post | save_post | Create or edit a post and return a save receipt. A draft or changes-requested post saves in place. A post in review, approved or scheduled needs rev from get_post: the edit saves as the next rev and the post goes back to in review for a person to approve again. A stale rev, a blocked phrase, a placeholder or a new website slug another page in your CMS uses is refused. An angle sets the post's pillar and persona to the angle's, and a pillar that contradicts the angle is refused. Website posts (blog, FAQ, competitor page) take a pillar, never an angle, and buyerQuestionIds: the buyer questions the page answers. A list replaces the set, null or an empty list clears it, and leaving it out keeps it. On a submitted or live website post, postId with buyerQuestionIds alone changes only its buyer questions: the status, rev, content and approval stay as they are, and nothing goes back to review. Adding any other field makes it a content edit with the rules above, and a published post's content stays locked: to fix a published social post's text, use edit_published_post. An archived post is refused. droppedMetaKeys lists the meta keys the channel doesn't take at any depth, as paths like cover.url or cmsImages[0].alt, which the save ignored; the save still goes through. A website post's cover is meta.cover: { source: "asset", assetId, alt } for a Mark asset, or { source: "cms", mediaId, collection, alt } for an image already in your CMS (from search_cms_media; collection is the media collection it's in, left out the post type's default; Mark fills in its type and size, and the alt defaults to your CMS's). It takes no other attachments. A website post's optional target keyword is meta.seo.keyword: one search query the page should rank for, kept in Mark and never sent to your CMS. A social post can also attach images from your CMS as meta.cmsImages: [{ mediaId, collection }] from search_cms_media (left out, collection is the default from get_website_cms; one Mark can't read is refused), published after the post's assets unless meta.mediaOrder sets another order. meta.mediaOrder lists the first post's media in order, as keys: an asset id, or cms:~<collection>:<mediaId> for an image from your CMS (an image saved before names a channel instead: cms:<channel>:<mediaId>; get_post shows which). For an image sent without either, cms::<mediaId> works too. An unknown or repeated key is dropped, media it leaves out goes last, and meta.altTexts follow this order. A meta without mediaOrder keeps the saved order; [] resets it. Mark fills in each one's type and size, refuses an id your CMS doesn't have or a type other than JPEG, PNG, WebP or GIF, and copies each image to the platform when the post is scheduled. On Instagram, LinkedIn, Facebook and X, meta.altTexts is one alt text per image (on X, post 1's images, then each reply's, in thread order; when meta.threadMedia moves media, send meta.altTexts in the new order) and meta.altText the post-wide one that a blank entry uses; videos and PDFs take none. On Instagram, LinkedIn, Facebook, X and Pinterest, a picked image's blank alt text starts from its CMS alt (on Pinterest, only for the pin's only image), and you can edit or clear it on the post. A LinkedIn post can carry one PDF asset and no other media, up to 100 MB, with meta.documentTitle as the title LinkedIn shows above it (left out, Mark uses the file name). A PDF with other media, over 100 MB, or on any other channel is refused with the same message submit_post gives. An X thread's replies are meta.thread, in order. To put media on a reply, list every asset in the thread in assetIds and give meta.threadMedia: one list of asset ids per reply, in the same order ([[], ["asset-id"]] puts it on the third post). The first post gets the assets no reply lists. An id that isn't in assetIds, or is on two posts, is refused with an error naming it. Each X post takes up to 4 images, or 1 video, or 1 GIF. meta replaces the saved meta, but when thread keeps its number of replies and threadMedia is left out, the saved threadMedia carries over. When the number of replies changes, send threadMedia too, or the save is refused. ideaId links the post to an idea (null unlinks) without changing its pillar, persona or angle; a new draft with ideaId takes the idea's pillar, angle, buyer question and a body seeded from its title and brief, unless the call sets them. A website post takes language, the language it is written in as a code like de or de-CH. Mark stores it canonical (de-ch saves as de-CH) and refuses anything that isn't a language code with "Enter a language code like de or de-CH." On Payload, the page is saved in that locale instead of your site's default language. translationOfId names the post this one translates: a website post in the workspace with a language, not itself a translation, in another language than this post. Each language takes one translation. On Payload, Mark writes the translation into the original's page in its own language, so publish the original first. For both, null clears it and leaving it out keeps it; a social post refuses them. The receipt lists the buyer questions the post answers after the save, and checks: Mark's content checks on the saved text (with keyword when a website post has a target keyword), each pass, warn or fail with the matched text. Takes an optional guideVersion from get_drafting_guide and reports guided; a save without a current guide still works and says how to fetch one. Never submits or publishes | Write |
| List Ideas | list_ideas | Content ideas, active, with no posts yet, or archived, optionally by pillar. Each lists its linked posts counted by stage, the last published date, and, when archived, covered or dropped | Read-only |
| Save Idea | save_idea | Create or edit an idea (title, brief, pillar or angle, buyer question), link or unlink existing posts in any status without touching their approval, or archive or unarchive one. Archiving never changes its posts. With a wrong answer id, it creates an idea from that wrong answer | Write |
| Submit Post for Review | submit_post | Send a draft to review. Refuses a post the channel would reject (for example a PDF off LinkedIn, with other media, or over 100 MB, with the message save_post gives) or that uses a phrase this workspace blocks or still has a placeholder like [needs source], and says what to fix. Content-check warnings never block. After submit, Mark checks the revision against your confirmed brand voice and offer and stores a brand_fit result, which only warns. Auto-approve names the next CMS or publish step | Write |
| Send CMS Preview | send_cms_preview | Save a post that is not yet approved to its website CMS as a draft and return the preview link. Never publishes. When another page uses the slug, names it; useCmsPageId sends into it instead | Write |
| Resolve CMS Conflict | resolve_cms_conflict | Settle a CMS conflict: overwrite the CMS page with Mark's version, or keep the CMS version and leave the post out of sync. Read get_post's conflictDiff first | Write, destructive |
| Approve Posts | approve_posts | Approve exact revisions. Names the next step (CMS draft, queued, or scheduled publish). An approved social post moves to scheduled within seconds; confirm with get_post. Each approved post carries handoff, and the result names any post that's stuck (no scheduled time, no connected account for its channel, or a handoff Mark couldn't start) with the reason. On a channel set to Admins only, only workspace admins can approve; other posts come back skipped. An approved LinkedIn Article stays approved until someone publishes it on LinkedIn and records it with record_post_published | Write, destructive |
| Request Changes or Reject | review_post | Send a post back, or reject it for good. On a channel set to Admins only, only workspace admins can decide. Rejecting a website post deletes its preview draft from your CMS, or says where it is and why it stays | Write, destructive |
| Comment on Post | comment_on_post | Add a review comment on the current revision | Write |
| Reschedule Post | reschedule_post | Move a post to a new future time, or fill one posting slot occurrence with slotId and date from get_calendar: the post takes the day's next free position, or the next minute once that time has passed today. A day before today or a full day is refused, so two callers can't overfill it | Write |
| Update Posting Slots | update_posting_slots | Add or remove a channel's posting slots, each a weekday and count, 1 to 5 posts that day. Adding a weekday the channel already has sets its count. Returns each slot's next open position and the channel's posting time | Write |
| Update Channel Settings | update_channel_settings | Channel settings including approval mode and postingTime (HH:MM, workspace timezone): when the first post on a slotted day goes out, each further post 3 hours later. Auto-approve skips human review | Write, destructive |
| Resolve External Post | resolve_external_post | Keep a post published outside Mark, or link it to an existing Mark post. Admin only | Write |
| Delete Post | delete_post | Permanently delete a post. A scheduled post is canceled first, and nothing changes if the cancel fails. Published posts are Admins only: by default Mark only forgets the post and it stays live; with takeDown, Mark first deletes it from LinkedIn, X, Facebook, YouTube or Pinterest, or unpublishes and deletes the website page in your CMS. Instagram and TikTok posts can't be taken down by apps, so remove them in the app. A failed take-down changes nothing. A website post's preview draft is deleted from your CMS, or the result says where it is and why it stays | Write, destructive |
| Edit Published Post | edit_published_post | Fix the text of a published LinkedIn, Facebook, X, YouTube or Pinterest post. It goes live right away, without review, and is recorded as your approval of a new version. Anyone who can approve the channel's posts can use it: on a channel set to Admins only, only workspace admins can. Text only: media and titles stay. X: single posts, within an hour of going live, X Premium accounts only. Instagram and TikTok posts are edited in their apps. A refusal changes nothing; an error that says Mark couldn't confirm the edit means check the live post before trying again | Write |
| Record Post Published | record_post_published | Record that an approved LinkedIn Article, or an approved website post whose post type has no CMS mapped, is live. For an Article, pass the post id and its linkedin.com post address, with urn:li:share: or urn:li:ugcPost: in it (a /pulse/ address is refused); Mark then reads its LinkedIn metrics daily for 30 days, then weekly until 90 days. LinkedIn has no API for Articles, so a person publishes it there first. For a website post, pass the page's https address on your site, after you publish it there by hand; a post type with a CMS mapped is refused, since Mark publishes those. The post becomes published with that URL. Repeating with the same URL changes nothing | Write |
| Unpublish Post | unpublish_post | Admin only. Take a published website page down in your CMS and keep the post. Approving it again updates the same page. Refused when the page is not live or the collection has no drafts | Write, destructive |
| Archive Post | archive_post | Stop a post from publishing. It stays in the workspace. Archiving a post that isn't a draft rejects it. On a channel set to Admins only, only workspace admins can archive it. Anyone in the workspace can archive a draft. A website post's preview draft is deleted from your CMS, or the result says where it is and why it stays | Write |
Assets
| Tool | Name | What it does | Access |
|---|---|---|---|
| Search Assets | search_assets | Search the media library, optionally inside one Google Drive folder and its subfolders. Returns asset ids, names, kind, and the url a website post body uses for an image | Read-only |
| List Asset Folders | list_asset_folders | Every Google Drive folder with synced assets, as paths to pass to search_assets as folder | Read-only |
| Search CMS Media | search_cms_media | Search the images already in one of your connected CMS's media collections, by file name or alt text. collection is any of the media collections get_website_cms lists; left out, Mark searches the default (where new media goes). A collection Mark can't read, such as the one your API key signs in with, is refused. For a website cover, pass its channel too: the search stays in the collections that post type's cover field accepts. Use a result as a cover with save_post meta.cover = { source: "cms", mediaId, collection }, put its url (the original file) in a website body as , which publishes by reference with no upload, or use it as a social post's image with meta.cmsImages = [{ mediaId, collection }]; these ids aren't Mark asset ids | Read-only |
| Get Asset | get_asset | Preview URL, details, and which posts use it | Read-only |
| Add Asset | add_asset | Import from a public URL, or upload a file through a signed link: an image, video or PDF. A PDF becomes an asset of kind document, which attaches to LinkedIn posts only | Write |
| Update Asset | update_asset | Rename an asset | Write |
| Delete Assets | delete_assets | Permanently delete assets. Can also detach them from drafts | Write, destructive |
Performance
| Tool | Name | What it does | Access |
|---|---|---|---|
| Get Weekly Brief | get_weekly_brief | The Monday weekly brief members get by email: posts waiting for review (a refresh of a live page carries refreshReason, why Mark queued it), the posts going out in the next 7 days (LinkedIn Articles to publish by hand first), last week's search clicks and impressions with tracked keywords that moved, the latest AI answer check, and up to 3 suggested next actions | Read-only |
| Get Content Performance | get_content_performance | Impressions and engagement social posts gained in the period (older posts still gaining included) and tracked clicks, plus website posts' pageviews in the period, by pillar and post, with daily, every day's gains, and previous, the same numbers for the period before. Plus each KPI target with its actual and progress, counted like the Targets page: impressions and engagement social posts gained in the target's month, wherever they were published | Read-only |
| Get Search Performance | get_search_performance | Search Console queries, pages, striking distance, and anomalies. Daily rows, totals and the data-through date are Google's final data; preliminary lists newer days Google may still revise, never counted in totals | Read-only |
| Get Page Detail | get_page_detail | One page across Search Console, tracked ranks, site audit, Mark posts, first-touch leads, site tag leads from PostHog (by the page the visit started on, never added to leads), and AI answer citations | Read-only |
| Get Visitor Locations | get_visitor_locations | Visitors and pageviews by country from PostHog, the Performance Visitors tab. source: "ai_referral" keeps only visits from an AI assistant's answer, the AI referrals card. A failed read has reason busy (PostHog didn't answer in time, so try again in a minute) or error | Read-only |
| Get Performance Overview | get_performance_overview | The Performance Overview tab: search impressions and clicks, site pageviews, AI answer Named rates per engine and leads for a range, with compare, each row's source and freshness, and the month's KPI target when the range is one month. A failed Site pageviews row has failure busy (PostHog didn't answer in time, so try again in a minute) or error | Read-only |
| Get GA4 Organic Overview | get_ga4_organic_overview | Google Analytics organic search sessions, users, and key events against the prior period, plus top landing pages. When the primary site waits for the cookie banner, a consent note says why Analytics reads lower than PostHog | Read-only |
| Inspect URL | inspect_url | Ask Google whether a page is indexed, and why. The page must be on the connected Search Console property; when it is not, the tool says which property that is. Uses Google quota | Read-only |
Keywords and competitors
| Tool | Name | What it does | Access |
|---|---|---|---|
| Research Keywords | research_keywords | Keyword ideas with volume, CPC, and competition from either source (labs or google_ads). On labs, the default, ideas contain their seed term and add difficulty and intent. SERP overview on request. 1 request per seed term (google_ads: 1 request), up to limit ideas. With the Google Ads source, close variants come back as one row listing the variants, so their volume counts once. Google Ads research is limited to about 12 calls a minute across Mark. A RATE_LIMITED error means wait the seconds it states, or run calls one at a time. The reply text lists up to 100 ideas in a table; the full set is in the structured result | Write |
| Check Keyword Audience | check_keyword_audience | Who currently ranks for a saved keyword, or a plain keyword and market. A plain lookup saves and tracks nothing. 1 search | Write |
| List Saved Keywords | list_saved_keywords | Saved keywords, tags, and exclusions; tracking and rank come from get_rankings | Read-only |
| Save Keywords | save_keywords | Save keywords and set tags, exclusion, and tracking | Write |
| Remove Keywords | remove_keywords | Remove saved keywords and their tracking history | Write, destructive |
| Analyze Domain | analyze_domain | Overview, top pages, page keywords, or backlinks for a domain. 1 domain per call | Write |
| Get Rankings | get_rankings | Tracked positions now and over time | Read-only |
| Run Rank Check | run_rank_check | Refresh rankings now, outside the schedule. Returns scope: 1 check per tracked keyword | Write |
| List Competitors | list_competitors | The competitors you track, up to 50, each with its vs and pricing page draft and status | Read-only |
| Track Competitor | track_competitor | Start tracking a competitor's domain | Write |
| Rename Competitor | rename_competitor | Change a competitor's name, which AI answer matching uses | Write |
| Untrack Competitor | untrack_competitor | Stop tracking a competitor. Its history stays | Write |
| Remove Competitor Lookup | remove_competitor_lookup | Remove an untracked domain from Other lookups in every market, with its stored lookups | Write, destructive |
| Set Competitor Aliases | set_competitor_aliases | Set up to 5 other names AI answers count as naming a competitor, in past weeks too | Write |
| Get Competitor Scorecard | get_competitor_scorecard | You and each tracked competitor: named and cited in AI answers, traffic, keywords, and share of AI mentions, plus the next comparison page to draft | Read-only |
| Draft Competitor Page | draft_competitor_page | Draft a vs or pricing page for a tracked competitor (the vs page also answers <competitor> alternative searches), with a Sources section for every competitor fact and [confirm: …] where Mark has none. Returns the existing post for that competitor and kind when there is one. Never submits | Write |
| Get Competitor AI Detail | get_competitor_ai_detail | One competitor against you by AI engine, with the questions and sources where AI picked them, not you, and those stored answers as markdown | Read-only |
| Suggest Competitors | suggest_competitors | Up to 20 sites that rank for the most of the same keywords as one of your sites, with whether you track each. Returns the stored list; refresh fetches 1 domain | Read-only |
Websites and site health
| Tool | Name | What it does | Access |
|---|---|---|---|
| List Sites | list_sites | Websites, primary site, readiness, latest audit, lead-capture config, each site's pasteable snippet (or why it isn't available yet), snippetNeedsRepaste when a site's pasted snippet no longer matches its settings, such as different Consent Mode defaults or a removed Tag Manager container or Cookiebot id, and each site's AI assistant tracking file (or why it isn't available yet) | Read-only |
| Get Site Audit | get_site_audit | Score, issues by severity, and a prioritized fix plan, with Article and JS-only schema recommendations, site structure (main sections the header and footer miss, key pages with few internal links, a missing Privacy, Terms, or Contact page), what robots.txt says to each AI crawler, each page's render class (needs JavaScript, pre-built HTML, or server HTML) with key pages that need JavaScript named, Google Lighthouse's experimental agentic browsing checks (N of M passed, not a score) with Mark's Markdown negotiation and Link header facts, and pages AI assistants can't find (aiCrawler404s) with a redirect suggestion or why a 404 is fine | Read-only |
| Dismiss AI Crawler 404 | dismiss_ai_crawler_404 | Hide one page AI assistants can't find for 90 days. It shows again if it still answers 404 after that | Write |
| Run Site Audit | run_site_audit | Start a crawl of up to 50 pages, returned as scope. Poll Get Site Audit for the result | Write |
| Check Site Readiness | check_site_readiness | Re-scan robots.txt, llms.txt, structured data, and speed. Says why when a re-scan can't finish | Read-only |
| Submit URLs to IndexNow | submit_urls_to_indexnow | Tell IndexNow search engines about changed URLs. Cannot be undone | Write, destructive |
| Save Site | save_site | Add or edit a website: hostname, name, primary, and lead capture, including consentRegions for where a wait site holds Google's tags back | Write |
| Delete Site | delete_site | Permanently remove a website and its audits and readiness history. The website your CMS publishes to is refused until the CMS is disconnected or moved to another site | Write, destructive |
| Set Check Cadence | set_check_cadence | How often a rank check or site audit runs (off or weekly). A rank cadence passed with only siteId applies to every market the site tracks | Write |
AI visibility
| Tool | Name | What it does | Access |
|---|---|---|---|
| Get AI Visibility | get_ai_visibility | Buyer questions with each one's answer pages (and how many active questions have none), suggestions from People Also Ask, Search Console, and Reddit, AI search volume, AI assistant bot fetches (with whether Mark's IP check is set up, and each top page's lastStatus from Mark's daily check, 404 for a page AI assistants can't find), readiness, how often each AI engine named or cited you in the latest weekly check, your share of mentions against tracked competitors, the top domains those answers cited, suggested competitors, and the size of the next weekly AI answer check (nextAnswerCheck: questions × markets × engines = checks). Each buyer question's AI search volume covers every market with a location and language: aiSearchVolume is the total, aiSearchVolumeByMarket the per-market split, highest first. A failed AI assistant traffic read has reason busy (PostHog didn't answer in time, so try again in a minute) or error | Read-only |
| Refresh AI Search Volume | refresh_ai_volume | Re-estimate how often buyer questions are asked in AI assistants, in every market with a location and language. Returns scope: 1 estimate per active question per market | Write |
| Estimate AI Search Volume | estimate_ai_volume | AI search volume for up to 50 phrases in every market with a location and language, without saving them: a total plus a per-market split for each phrase | Read-only |
| Run AI Answer Check | run_answer_engine_check | Start this week's AI answer check now and see its progress, or why nothing started (checks off, no questions, no market location). Returns scope: questions × engines = checks, or this week's run's when it exists. A workspace exempt from the weekly limit can start another once this week's run finishes; the earlier run's answers are kept | Write |
| Suggest Buyer Questions | suggest_buyer_questions | Up to 10 buyer questions to start tracking, each tagged with where it came from: your Brand page, a tracked competitor, People Also Ask, or Search Console. Writes new questions with one AI model call; saves nothing | Read-only |
| Check AI Assistant Tracking | check_ai_assistant_tracking | Check that ChatGPT, Perplexity, and other assistants are tracked on a site | Read-only |
| Get Buyer Question Answers | get_buyer_question_answers | One buyer question's stored AI answers per engine for a market and week, as markdown, with whether each answer names you (youNamed), the competitors and pages each answer named or cited, each cited page's stored title, each engine's first answered check, and the question's answer pages with which engines cited each that week | Read-only |
| Compare Buyer Question Answers | compare_buyer_question_answers | Two stored check runs of one buyer question side by side per engine: each answer as markdown, whether it named or cited you, and the cited pages, with their stored titles, added and dropped between them. By default it compares the last check before its answer page changed with the newest | Read-only |
| List Wrong Answers | list_wrong_answers | Wrong AI answers, open or resolved, newest first, each with its reason: ones members logged from any engine, and ones the weekly check found | Read-only |
| Save Wrong Answer | save_wrong_answer | Log a wrong AI answer with its reason, or resolve or reopen one | Write |
Connections
| Tool | Name | What it does | Access |
|---|---|---|---|
| List Connections | list_connections | Integrations, their health, last sync, and failed jobs. For Drive, the last sync's counts, including files removed because they left the shared folders, and skipped files by reason. Social accounts share one Social publishing row, which says when Social posts last synced while imports are failing. A connection that needs attention shows when it was last checked | Read-only |
| Get Connect Link | get_connect_link | Link to connect a provider in the Mark app. Connecting happens in the browser | Read-only |
| Sync Connections | sync_connections | Refresh an integration's health, retry a failed job, or ingest Drive. useCmsPageId with retryJobId uses the CMS page that took a website post's slug, then retries | Write |
| Update Connection Settings | update_connection_settings | Save a Search Console or GA4 property, or Drive folders to watch | Write |
| Get Website CMS | get_website_cms | Read every connected website CMS, the website it publishes to (site: id and domain), its mapping and discovered fields, the media collections Mark can read (mediaCollections) and where new media goes (mediaDestination, null for none). Each collection's localized says whether it stores pages per language, and locales lists the site's languages. Never the key | Read-only |
| Update Website CMS | update_website_cms | Set a website CMS publish mode, each channel's collection and fields, and mediaDestination: the one media collection Mark uploads a website post's Mark images into (null: Mark uploads nothing). A per-channel mediaCollection is refused | Write |
| Disconnect Account | disconnect_connection | Disconnect an integration. Social publishing disconnects every social account at once. For a website CMS, names the provider and warns when channels are still mapped | Write, destructive |
| Email Setup Checklist | send_setup_checklist | Email the signed-in user the setup steps still to do, with links, the steps skipped and done, and connections waiting on the customer | Write |
Last updated Nov 12, 2026