Tools provided
Tools the agent exposes — your AI client calls them automatically when it needs them.
- build_voice_profile — Measure how your writing behaves, from writing you supply: mean sentence length and its spread, first- and second-person rates, contraction and hedging rates, question and exclamation rates, and the vocabulary that recurs across pieces rather than within one. Every rate comes back with the two counts behind it, so you can check any of them by hand. A thin sample is reported as thin rather than presented as a confident profile. It judges no quality - nothing in the input can support that.
- check_market_readiness — Say what another market reads DIFFERENTLY in copy you already have: dates whose first two numbers could both be a month, numbers whose separators are the reverse of that market's, and phrases restricted under several advertising codes. It does NOT translate and does not pretend to. A regulated phrase is flagged for a lawyer, never cleared - a false clearance is worse than no check. An unambiguous date is left alone: a flag nobody can act on trains people to ignore the real ones.
- check_material_coverage — Say which sections your notes actually support and which you are about to invent. Each heading comes back supported, thin or EMPTY, with the notes behind it listed so you can disagree. Notes supporting no section are reported too - either a heading is missing or they belong elsewhere. Below ${Math.round(SUPPORT_FLOOR * 100)} percent word overlap a section is empty. It writes NO prose: the tools it replaces returned a finished-looking draft with the unsupported sections filled in.
- check_voice_match — Say where a draft departs from how you actually write, measured against pieces you supply: first- and second-person rates, contractions, hedging, questions, exclamations, and which of your recurring words the draft never uses. Every difference carries the two counts behind it. A trait neither side can measure is reported as unmeasured and excluded from the score, never scored as a match - and with nothing comparable the score is absent rather than zero. It returns NO corrected draft.
- curate_newsletter — Order the candidates you collected by YOUR OWN score, fold near-duplicate stories together, and build an issue from what is actually there. Two candidates count as one story when they share at least ${Math.round(DUPLICATE_OVERLAP * 100)} percent of their significant words - matching exact titles removes almost nothing, because the same story arrives with a different headline. An unscored candidate is listed separately, never ordered last. Asked for more items than survive, it returns fewer and says so.
- find_content_gaps — Say which of your audience's questions nothing you have published answers. A query counts as answered when a title shares at least ${Math.round(ANSWER_OVERLAP * 100)} percent of the query's significant words, and the basis travels with the answer. Gaps are ranked by the volume YOU supplied; a query with none is listed unranked, never ranked at zero. Pieces under ${THIN_WORDS} words are reported as thin WITH that threshold, and a piece whose length you did not supply is unknown rather than thin. It proposes no topics.
- grade_published_content — Rank your published pieces by engagement rate - engagements over impressions, computed only where BOTH were supplied - and list the rest SEPARATELY as unmeasured rather than sorting them to the bottom. Unmeasured is not underperforming, and the difference decides whether you kill a piece or go and measure it. The median is of YOUR pieces; no industry benchmark is applied, because there is no honest source for one and an invented figure would be the most quotable number in the report.
- plan_video_script — Say how long a video script really runs, and what set that length. Every scene is measured on BOTH clocks - saying the voiceover at a stated pace, and READING the on-screen text at ${READING_CPS} characters per second - and the slower one wins. A scene held open by its text is named; the generators this replaces report it as fitting. Send no scenes and you get the word budget for your target instead. It writes NO voiceover, hook or b-roll.
- read_for_clarity — Quote the sentences that lose the reader, longest first, and count the words your audience does not know. It returns NO reading grade: a grade sees sentence length and syllables only, so "the cat sat on the mat" and "the SKU sat in the ERP" score the same - it rewards short jargon and penalises long plain English. Over ${LONG_SENTENCE_WORDS} words a sentence is quoted, never averaged away. Unfamiliar terms are counted only against the glossary you supply, because what is jargon is a fact about your audience.
- repurpose_to_channel — Cut one long piece into a version per channel, built only from sentences already in it, and say whether each version actually fits. Each draft reports the channel's own hard limit AND its fold - the point a feed truncates it behind 'see more', which is a different number and the one that decides whether it is read. A point that does not fit is left out WHOLE and counted, never trimmed mid-sentence. X is counted in weighted characters, because it counts CJK as two.
- review_content_calendar — Read your publishing calendar and say what the mix actually is: each theme's share of the slots that carry one, which dates are open, and which of your themes never got a slot. Every share is over PLANNED slots, never the total - an open date is a gap. One theme over ${Math.round(CONCENTRATION_LIMIT * 100)} percent is reported as concentrated; nothing planned is reported as empty, not as balanced. It proposes no topics: a calendar filled with topics nobody chose looks done.
- split_into_thread — Cut text into a numbered thread whose posts actually fit, because each part is measured WITH its counter - the defect in every tool this replaces, which checked the part and then added the '1/7' that pushed it over. Parts break at sentence boundaries only. A sentence too long to be a post on its own is reported and quoted for you to shorten, never cut. X is counted in weighted characters, because it counts CJK as two.
- write_listing_copy — Arrange the product facts YOU state into listing copy, and check it against the marketplace's own field rules. Nothing is described beyond what you supplied: the tools this replaces produced 'crafted from premium materials' from a name and a price, on a listing you answer for. A sentence whose attribute is missing is left out and reported so you can supply it. Required fields the marketplace refuses a listing without are named, and copy over a limit is reported rather than trimmed.
- run_full — Run every capability you supplied the input for, in registry order, and return one report. Capabilities whose input is missing are listed as skipped with the fields they need — never run against a fixture and never reported as zero.
- list_capabilities — List what this agent can do: every tool it advertises, what each one is for, and the arguments each one reads. Useful for discovery before the first call.
- plan_inputs — Plan the inputs for a tool: returns the questions to ask, the JSON schema of the arguments, and a ready-to-edit example. Every argument it names is an argument the tool actually reads.
- discover_intent — Understand your goal and co-design the exact input through clarifying questions before anything runs.
- open_form — Use this the moment the user wants to run this agent on their own input. It opens an interactive form that collects the run arguments. Do NOT check credentials, do NOT ask clarifying questions in chat, and do NOT run any analysis before calling this — the form is the entry point for running the agent.
- run_form — Internal: invoked by the open_form form when the user submits. Reads exactly the same arguments as run_full and forwards all of them. Not for direct use.