The Frontitude MCP connector routes your AI agent's tool calls to Frontitude's own MCP server through Scalekit. Each user signs in to Frontitude once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 34 tools.
- Tools
- 34
- What they doRead · write · destructive
- 10 · 15 · 910 read15 write9 destructive
- Users sign in with
- OAuth
- OAuth app
- Your own Frontitude MCP server app
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Frontitude MCP connection
In AgentKit > Connections, create a Frontitude MCP connection and copy its redirect URI. The name you give it is the
connection_nameyour code passes. See Configure connections.Register an OAuth app
Frontitude MCP server connections use your own OAuth app. Register one with Frontitude MCP server and add the redirect URI you copied.
Then enter the app's Client ID and Client Secret on the Frontitude MCP connection.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'frontitudemcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Frontitude MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'frontitudemcp_frontitude_list_components',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "frontitudemcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Frontitude MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="frontitudemcp_frontitude_list_components",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolfrontitudemcp_frontitude_count_scopeCount how many components or texts are in a location before listing them, so you can pick a smaller location or a narrower filter instead of pulling thousands of rows.Read-onlyCount scope
Count how many components or texts are in a location before listing them, so you can pick a smaller location or a narrower filter instead of pulling thousands of rows. Counts the components filed directly in a library category, or every component in the whole library, or every text in a project, page, or frame, with an optional breakdown by status or by per-locale translation coverage. The count itself takes no filters. For a filtered number, call list_texts or list_components with the filter and read total on its first page. Reach for this first whenever a location might be large. The total and the status breakdown count the source language; the locale rollup is the one that reports translation coverage.
Inputs
scopeTypestringrequired- What to count: library counts every reusable component in the workspace library; category counts the components filed directly in one library category, not those in its subcategories; project, page and frame each count the texts in one design location.one of
librarycategoryprojectpageframe categoryIdstring- The category to count, from list_scopes. Pass it when scopeType is category; every other scopeType refuses it.
frameIdstring- The frame to count, from list_scopes or get_project_structure. Pass it when scopeType is frame; every other scopeType refuses it.
pageIdstring- The page to count, from list_scopes or get_project_structure. Pass it when scopeType is page; every other scopeType refuses it.
projectIdstring- The project to count, from list_scopes. Pass it when scopeType is project; every other scopeType refuses it.
rollupstring- Add a breakdown: status splits the total by status; locale splits it by how many are translated in each of the workspace locales; category splits it by library category and is accepted only when scopeType is library.one of
statuslocalecategory
frontitudemcp_frontitude_get_componentOpen one copy component and return its full details: name, value, status, path, key, tags, note, and character limit.Read-onlyGet component
Open one copy component and return its full details: name, value, status, path, key, tags, note, and character limit. textsCount is how many texts use it across the workspace; list those with list_component_instances. Use include to also load its edit history, per-locale translations, plural forms, resolved variables, or the comment threads on the component. It reads one language at a time, the source language unless you pass localeId. Call it with a componentId from search or a list tool.
Inputs
componentIdstringrequired- The id of the component to open, as returned by search or a list tool.
includearray- Extra detail to load alongside the component. history: the 20 most recent revisions, newest first; translations: value and status per workspace locale; variables: the resolved variable placeholders; plurals: the value of every plural form, empty when the component is not pluralized; discussions: comment threads on the component itself, each capped at its 50 latest comments.
localeIdstring- The language pane to read: value, status, history, variables and plurals all come from it. Omit it for the source language. It must be one locale of the workspace, and any other value is refused. translations and discussions cover every locale either way. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
frontitudemcp_frontitude_get_project_structureGet the page and frame layout of one project, with a per-frame count of how many texts sit in each status.Read-onlyGet project structure
Get the page and frame layout of one project, with a per-frame count of how many texts sit in each status. Use it to see how a project is organized and where the texts are before you list or count them. For the text content itself, use list_texts. The per-frame counts cover the visible source-language texts only, so count_scope and list_texts can report more for the same frame. At most 300 frames come back across the whole response, so a page can carry fewer frames than its frameCount, or none at all. Read the rest of a page with list_scopes, scopeType frame and parentId set to that page id, which pages. When hasMore is true, more rows follow: call again with offset set to nextOffset to read them.
Inputs
projectIdstringrequired- The project whose page/frame tree to return.
limitinteger- Pages to return, max 50, default 20.default
20 offsetinteger- Pages to skip. Pass the nextOffset a page returned to read the next one, or any position you already know to reach that row in one call. Narrow the request with a filter where one applies.default
0
frontitudemcp_frontitude_get_textOpen one text and return its full details: current value, status, key, tags, character limit, project, frame, and whether it is hidden.Read-onlyGet text
Open one text and return its full details: current value, status, key, tags, character limit, project, frame, and whether it is hidden. Use include to also load its edit history, per-locale translations, plural forms, comment threads, design context, or the copy component it is an instance of. It reads one language at a time, the source language unless you pass localeId. Call it with a textId from a list_texts result.
Inputs
textIdstringrequired- The id of the text to open, as returned by a list tool.
includearray- Extra detail to load alongside the text. history: the 20 most recent revisions, newest first; translations: value and status per workspace locale; discussions: comment threads on the text, each capped at its 50 latest comments; designContext: the design-side context and properties; component: the copy component this text is an instance of, absent when the text is not an instance of one, carrying its name, its note, the guidance for whoever edits it, its character limit, tag ids, parent category id, and textsCount, how many texts use it across the workspace; plurals: the value of every plural form, empty when the text is not pluralized.
localeIdstring- The language pane to read: value, status, history and plurals all come from it. Omit it for the source language. It must be one locale of the workspace, and any other value is refused. translations and discussions cover every locale either way. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
frontitudemcp_frontitude_list_component_instancesList the texts that use a copy component, oldest first, each with the project, page and frame it sits in.Read-onlyList component instances
List the texts that use a copy component, oldest first, each with the project, page and frame it sits in. Use it to answer where a component is used and how wide a change to it would reach. Only instances in projects you can access are listed, so the count can be smaller than the component textsCount from get_component. Each row carries the plural form that instance shows, so a form still in use is found from one call. Every row's value and pluralId is the source language, so use get_text with a localeId to read another. When hasMore is true, more rows follow: call again with offset set to nextOffset to read them.
Inputs
componentIdstringrequired- The id of the component whose instances to list, as returned by search or a list tool.
limitinteger- Instances to return, max 100, default 50.default
50 offsetinteger- Instances to skip. Pass the nextOffset a page returned to read the next one, or any position you already know to reach that row in one call. Narrow the request with a filter where one applies.default
0
frontitudemcp_frontitude_list_componentsList the reusable copy components in the copy library, in one category or across the whole library.Read-onlyList components
List the reusable copy components in the copy library, in one category or across the whole library. Filter by name, status, tag, unique key, whether they have design instances, translated or missing in a locale, variable use, or last-changed date. Each row carries its pluralId, so a batch can be partitioned into pluralized and plain components from one call; a row is one selected plural form, so dedupe by id before writing. Use it to browse or audit the library by attribute; to find components by meaning use search instead. Pass exactly one of categoryId or wholeLibrary. Every row's value and status is the source language; use get_component with a localeId to read a translation. When hasMore is true, more rows follow: call again with offset set to nextOffset to read them.
Inputs
categoryIdstring- List components filed directly in this category, not those in its subcategories. Takes a category id from list_scopes with scopeType category, not a name or a path. Pass exactly one of categoryId, wholeLibrary.
hasInstancesstring- Only components that have (or lack) attached design instances.one of
with-instanceswithout-instances hasKeystring- Only components that have (or lack) a unique key.one of
with-keywithout-key keyContainsstring- Only components whose unique key contains this text.
limitinteger- Rows to return, max 100, default 50.default
50 missingTranslationLocaleIdstring- Only components with no translation at all in this locale, not even one plural form. Use it to find what is left to translate; it is the exact complement of translatedInLocaleId.
nameMatchstring- Case-insensitive substring match on the component name, not on its value and not on its category path.
offsetinteger- Rows to skip. Pass the nextOffset a page returned to read the next one, or any position you already know to reach that row in one call. Narrow the request with a filter where one applies.default
0 sincestring- Only components changed at or after this ISO datetime (last change).
statusstring- Only components in this status.one of
newdraftreviewfinal tagIdsarray- Only components carrying all of these tag ids.
translatedInLocaleIdstring- Only components translated in this locale. A pluralized component counts as translated once any of its forms is.
variableNamestring- Only components whose value uses this variable.
wholeLibraryboolean- List across the whole library instead of one category. Count the library first (count_scope) and prefer a narrowing filter. Pass exactly one of categoryId, wholeLibrary.
frontitudemcp_frontitude_list_scopesFind Frontitude locations, tags, and variables by name and get the ids the other tools need.Read-onlyList scopes
Find Frontitude locations, tags, and variables by name and get the ids the other tools need. Lists folders, projects, categories, pages, frames, tags, variables, or locales, optionally narrowed to a name substring, each result carrying its id, name, parent, and how many children it holds. Start here when you have a name (a project called 'Checkout', a category called 'Errors', a tag called 'legal') but need its id. childCount is the scopes one level down, so subcategories for a category, except on a frame, where it is the frame's visible texts and count_scope and list_texts can report more for the same frame. A category also carries its fullPath and its componentCount, which is the components filed directly in it and never those in its subcategories, and a variable carries its list of values. A locale list that is not narrowed or paged past starts with the source language, whose id is main and whose own name Frontitude does not store, so it is reported as Source language. When you hold particular projects rather than the whole workspace, the folder and project lists name only those projects, and category is refused unless you can edit one of them. When hasMore is true, more rows follow: call again with offset set to nextOffset to read them.
Inputs
scopeTypestringrequired- What to list. folder/project/category/tag/variable/locale live under the workspace; page requires a project parentId; frame requires a page parentId.one of
folderprojectcategorypageframetagvariablelocale limitinteger- Rows to return, max 100, default 50.default
50 nameMatchstring- Case-insensitive substring match on the scope name. Omit to list all children.
offsetinteger- Rows to skip. Pass the nextOffset a page returned to read the next one, or any position you already know to reach that row in one call. Narrow the request with a filter where one applies.default
0 parentIdstring- Narrow to one parent: a folder id for projects, a parent category id for categories, a project id for pages (required), a page id for frames (required). folder, tag, variable, and locale sit under no parent and refuse it.
frontitudemcp_frontitude_list_textsList the texts placed in a project, page, frame, or across the whole workspace.Read-onlyList texts
List the texts placed in a project, page, frame, or across the whole workspace. Filter by status, type, tag, unique key, value, translation coverage, visibility, or last-changed date. Use it to enumerate the copy sitting in designs, as opposed to the reusable copy components (for those use list_components or search). Pass exactly one of projectId, pageId, frameId, or wholeWorkspace. Use valueContains to find copy in the designs by its wording and keyContains to find it by its developer key. Every row's value and status is the source language; use get_text with a localeId to read a translation. When hasMore is true, more rows follow: call again with offset set to nextOffset to read them.
Inputs
frameIdstring- List texts in this frame.
hasKeystring- Only texts that have (or lack) a unique key.one of
with-keywithout-key keyContainsstring- Only texts whose unique key contains this text.
limitinteger- Rows to return, max 100, default 50.default
50 offsetinteger- Rows to skip. Pass the nextOffset a page returned to read the next one, or any position you already know to reach that row in one call. Narrow the request with a filter where one applies.default
0 pageIdstring- List texts in this page.
projectIdstring- List texts in this project. Provide exactly one of projectId, pageId, frameId, or wholeWorkspace.
sincestring- Only texts changed at or after this ISO datetime (last change).
statusstring- Only texts in this status.one of
newdraftreviewfinal tagIdsarray- Only texts carrying all of these tag ids.
translatedInLocaleIdstring- Only texts that have a translation in this locale. The rows still carry the source-language value and status.
typestring- instance: attached to a component; regular: unattached.one of
instanceregular valueContainsstring- Only texts whose value contains this text, matched on the source language. It searches the copy placed in designs, so reach for search_components when you are after the library entry behind it.
visibilitystring- visible: exclude hidden texts; all: include them (default).one of
visibleall wholeWorkspaceboolean- Read every project you can access in this workspace instead of one location. Use it when you do not know which project a piece of copy sits in. It reaches a lot of copy, so narrow it with a filter, and read total on the first page before you page through the rest.
frontitudemcp_frontitude_pingCheck that the Frontitude connection is alive and your credentials work.Read-onlyPing
Check that the Frontitude connection is alive and your credentials work. Takes no arguments and returns the workspace your calls default to, plus that workspace's unique-key convention: the format and delimiter its keys are written in, and whether the product enforces them. The convention is a hint for writing a new key in the house style, and nothing validates a key against it. Call it when a call has failed and you need to know whether the connection is at fault, or before writing a key you want in the house style.
Inputs
This tool takes no inputs.
frontitudemcp_frontitude_search_componentsFind copy components by meaning rather than exact wording.Read-onlySearch the component library
Find copy components by meaning rather than exact wording. Give a natural-language query (for example 'error shown when a payment fails') and get the closest-matching components ranked by relevance, optionally filtered by category, status, or translation coverage. Use it when you know roughly what a piece of copy says but not where it lives. Only close matches come back, so an empty page is not proof the library holds nothing like the query: retry with different wording, or with the filters dropped, before treating the copy as missing. It returns a single ranked page and cannot be paged: if hasMore says the matches were cut, ask a narrower query or use list_components, which pages. Each row's fullPath ends in the component's own name, so drop the last segment to get the category path it is filed under. It covers the copy library only, not the texts placed in individual projects, so it is not a search of every piece of copy in the product. Every row's value and status is the source language, and so is the wording the query is matched against. get_component with a localeId reads what one translation says. translatedInLocaleId, translationStatus and missingTranslationLocaleId narrow on whether a translation exists and the status it holds, never on what it says.
Inputs
querystringrequired- Natural-language text to match semantically against component copy in the library. It is matched against the wording alone, so a project, screen or component name in the query pulls it away from the copy rather than narrowing it: describe what the copy says, and use categoryId to narrow where it lives.
categoryIdstring- Restrict to components under this category (and its subcategories). Takes a category id from list_scopes with scopeType category, not a name or a path.
limitinteger- Rows to return, max 50, default 20.default
20 missingTranslationLocaleIdstring- Only components with no translation at all in this locale, not even one plural form. It is the exact complement of translatedInLocaleId. It must be one locale of the workspace, and any other value is refused.
statusstring- Only components in this status.one of
newdraftreviewfinal translatedInLocaleIdstring- Only components that have a translation in this locale (optionally narrowed by translationStatus). A pluralized component counts as translated once any of its forms is. It must be one locale of the workspace, and any other value is refused.
translationStatusstring- Require the translation to be in this status. Pass it only alongside translatedInLocaleId, which names the locale it narrows; on its own it is refused.one of
newdraftreviewfinal
frontitudemcp_frontitude_add_commentPost a comment for the people who own this copy: answer a question they have asked, raise one of your own, flag a risk, or explain a change you are proposing.WriteComment on a text or component
Post a comment for the people who own this copy: answer a question they have asked, raise one of your own, flag a risk, or explain a change you are proposing. It writes no copy and changes no status, and it is the one write a viewer may make. Reply in a thread with discussionId, or start one on a text or a copy component. Posting the same message twice in a row is taken as one comment: an identical message from you within five minutes comes back with isChanged false and the comment already there. On a text or component target that covers every thread on it in that language pane, so a second thread carrying the same wording is not started there. Mentions are not delivered from here, so nobody is emailed. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
messagestringrequired- The comment to post. Plain text, written for the people who own this copy.
componentIdstring- One copy component, the reusable piece of copy in the library. Starts a new thread on the component itself rather than on any of its instances. Pass exactly one of discussionId, textId, componentId.
discussionIdstring- An existing comment thread, from get_text or get_component with include discussions. The reply joins that thread. Pass exactly one of discussionId, textId, componentId.
localeIdstring- The language pane the new thread belongs to. Omit it to comment on the source language. A reply already has the pane its thread was started in. Pass it only alongside textId or componentId; the other alternatives refuse it.
textIdstring- One text, meaning one use of copy in one project. Starts a new thread on it, in the project it belongs to. Pass exactly one of discussionId, textId, componentId.
frontitudemcp_frontitude_manage_tagCreate a workspace tag or relabel one.WriteCreate or rename a workspace tag
Create a workspace tag or relabel one. Creating is safe to repeat: a label already in the workspace comes back with isCreated false. Relabelling is too: a tag that already reads that way writes nothing and comes back with isChanged false, and a label another tag already holds is refused rather than duplicated. Use update_tags to put a tag on components or texts; this tool only manages the tag itself. Tags are not searchable copy, so nothing here changes search or list results. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
actionstringrequired- What to do: create adds a tag by label, or returns the one that already holds it; rename relabels an existing tag, leaving everything tagged with it tagged.one of
createrename labelstring- The tag label. Matched case-insensitively, so "Legal" and "legal" are the same tag. Pass it when action is create; every other action refuses it.
newLabelstring- The new label. Pass it when action is rename; every other action refuses it.
tagIdstring- The tag to relabel, from list_scopes with scopeType tag. Pass it when action is rename; every other action refuses it.
frontitudemcp_frontitude_manage_variableCreate a workspace variable, rename one, or manage the example values it offers.WriteManage a workspace variable
Create a workspace variable, rename one, or manage the example values it offers. rename and rename_value are the expensive ones: the name and the value are both stored inside every value that uses the variable, so both rewrite stored copy. rename writes a new revision of every component and text using the variable, in every locale, drops each of them from new or final to draft, leaving anything at review where it stands, and marks their translations as needing review. rename_value only swaps the shown value on the components and texts carrying that one value, writing no revision and changing no status. Both take at most 200 affected components and texts and both need expectedAffectedCount, counted over every use of the variable for rename and over the uses showing that one value for rename_value. A call that leaves the variable as it already is, including add_value with a value it already offers, writes nothing, comes back with isChanged false and does not check expectedAffectedCount. Search and list results reflect either as soon as this call returns; create and add_value change no stored copy. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
actionstringrequired- What to do: create adds a variable with no values yet; rename renames the variable and rewrites every stored value that uses it; add_value offers another example value on the variable; rename_value changes one of the example values, everywhere it is shown.one of
createrenameadd_valuerename_value variableNamestringrequired- The variable name, without braces. Matched exactly and case-sensitively, so firstName and firstname are two variables.
expectedAffectedCountinteger- The number of components and texts whose values will be rewritten. Pass it when action is rename or rename_value; every other action refuses it. Count it first: list_components with variableName gives the components, and list_texts with type regular gives the unattached texts one project at a time, whose values show which of them use it. Both reads show the source language and the plural form each component currently shows, so a use that appears only in a translation or only in another plural form is counted by the write and not by these reads. For rename_value, get_component with include variables says which components show that one value, and every instance of such a component is counted as well. The call is refused when the true number is different. The refusal writes nothing and reports that number, so a count that came out low costs one refused call and you send the number it named.
newNamestring- The new name, without braces. It must not already exist in the workspace. Pass it when action is rename; every other action refuses it.
newValuestring- The replacement example value. Pass it when action is rename_value; every other action refuses it.
valuestring- One of the example values the variable offers, shown in place of it in the app. Pass it when action is add_value or rename_value; every other action refuses it.
frontitudemcp_frontitude_move_componentsFile copy components under a category, or uncategorize them.WriteMove components
File copy components under a category, or uncategorize them. This changes where they sit, never their copy. Pass the destination by its id from list_scopes, or by a slash path when you would rather describe it. A component already filed there is left alone and comes back with isChanged false. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
componentIdsarrayrequired- The components to file, at most 50 per call.
categoryIdstring- The library category to file them in, straight from list_scopes. Pass null to uncategorize them. Pass exactly one of categoryId, categoryPath.
categoryPathstring- The library category to file them in, as a slash path at most three levels deep, for example "Checkout/Buttons". Pass exactly one of categoryId, categoryPath.
isCreateMissingCategoriesboolean- Create any category on the path that does not exist yet. Pass it only alongside categoryPath; the other alternatives refuse it.
frontitudemcp_frontitude_rename_scopeRename a project or a project folder.WriteRename a project or project folder
Rename a project or a project folder. Nothing inside it moves or changes: the texts, pages and frames keep their own names, and no copy is touched. Use move_project to put a project in a different folder. The previous name comes back so a rename can be reported or undone, and a rename to the name already shown writes nothing and comes back with isChanged false. A project that has never been renamed here shows the design tool's own name and reports a null previousName, so naming it that is still a real write. If somebody else renames it while this call runs it is refused rather than written, so the name that comes back is always the one this call replaced. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
namestringrequired- The new name. It replaces the shown name only; nothing inside the project or folder changes.
scopeIdstringrequired- The project or project folder to rename, from list_scopes.
scopeTypestringrequired- Which kind of container to rename. Read both from list_scopes.one of
projectfolder
frontitudemcp_frontitude_set_selected_pluralChoose which plural form a pluralized component or instance shows in one locale.WriteSet the shown plural form
Choose which plural form a pluralized component or instance shows in one locale. It writes no copy and deletes nothing: the other forms and their values stay. Each instance holds its own shown form, so changing the component leaves the instances where they are and changing one instance leaves the component and its siblings where they are. A component that has no plural forms in this locale is refused. Choosing the form already shown changes nothing and comes back with isChanged false. Passing a componentId also updates search and list results as soon as this call returns; passing a textId indexes nothing, because the component is unchanged. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
localeIdstringrequired- The language pane this call acts on. `main` is the source language; any other id is a translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
pluralIdstringrequired- One of the plural forms the component has in this locale. Read them from get_component with the same localeId; the non-plural form is not one of them.one of
zeroonetwofewmanyother componentIdstring- The copy component whose shown form this is. Instances keep the form each of them already shows; pass a textId to move one of those. Pass exactly one of componentId, textId.
textIdstring- One text. Only that instance changes; its component and the other instances keep theirs. Pass exactly one of componentId, textId.
frontitudemcp_frontitude_set_statusMove copy components or texts to a new status in one locale.WriteSet status
Move copy components or texts to a new status in one locale. Moving source-language copy to final can start auto-translation and spend the workspace translation quota, and unattached texts moved to final can create components in whichever workspace those texts belong to. A write whose translations would carry the workspace past its translation allowance translates nothing, turns auto-translation off for the whole workspace, and emails the workspace admin. Nothing here turns it back on. Unattached texts in the same call that hold the same copy get one component between them, built from the last of them, so in every other locale the others take its translation in place of their own. A component created here holds no developer key, and the text it was created from loses the key it was reporting: read that key with get_text first if you mean to keep it, and set it on the component with set_unique_key. A placeholder value the workspace variable does not list yet is added to it, workspace-wide. A workspace can have that creation switched off, in which case createdComponents comes back empty however many texts moved, and create_components is the way to make one. Auto-translation, if it triggers, runs after this call returns, so the counts here are a projection rather than a record. Anything already at the status is left alone and comes back with isChanged false, so a repeat spends no quota and logs nothing. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
localeIdstringrequired- The language pane this call acts on. `main` is the source language; any other id is a translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
statusstringrequired- The status to move everything listed to, in the locale given on the call.one of
newdraftreviewfinal componentIdsarray- The copy components to move, at most 50 per call. A component is the reusable piece of copy in the library. Pass exactly one of componentIds, textIds.
textIdsarray- The texts to move, at most 50 per call. A text is one use of copy in one project. A text attached to a component moves that shared component too. Pass exactly one of componentIds, textIds.
frontitudemcp_frontitude_set_unique_keyGive copy components their developer keys, the identifiers exports and the CLI resolve copy by.WriteSet unique keys
Give copy components their developer keys, the identifiers exports and the CLI resolve copy by. A key already held by another component or by a text comes back as a conflict on that item while the rest of the batch is written, so read results rather than assuming every key landed. Passing a text sets the key on the component it belongs to, so both branches write a component. A component already holding the key passed is left alone and comes back with isChanged false. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
keysarrayrequired- The keys to set, at most 50 per call.
frontitudemcp_frontitude_set_variable_placeholderChoose the example value a variable shows in the app, for copy components or for individual texts.WriteSet variable placeholders
Choose the example value a variable shows in the app, for copy components or for individual texts. This is display metadata: the stored copy keeps the variable template, no revision is written, and search results are unchanged. A placeholder the workspace variable does not list yet is added to it, once for the call, whether or not any row needed writing. Anything already showing this placeholder is left alone and comes back with isChanged false. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
localeIdstringrequired- The language pane this call acts on. `main` is the source language; any other id is a translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
placeholderstringrequired- The example value shown in place of the variable. Registered on the variable if it is not one of its values yet.
variableNamestringrequired- The workspace variable to fill in, without braces. Use list_scopes with scopeType variable for the names.
componentIdsarray- The copy components to set the placeholder on, at most 50 per call. A component is the reusable piece of copy in the library. Pass exactly one of componentIds, textIds.
pluralIdstring- The plural form to act on. Omit it to take the form the component already shows in this locale; the empty string is the non-pluralized form. It has to be a form the component already has in this locale, since this call selects a form rather than writing one. Read the forms from get_component with the same localeId.one of
zeroonetwofewmanyother textIdsarray- The texts to set the placeholder on, at most 50 per call. A text is one use of copy in one project. This is per instance, not shared. Pass exactly one of componentIds, textIds.
frontitudemcp_frontitude_update_component_metadataRename copy components, or set their note or character limit, across a batch.WriteUpdate component metadata
Rename copy components, or set their note or character limit, across a batch. None of these fields is the copy itself: write that with update_component_values. A component that already has a note keeps it unless isOverwriteNote is set, and the skip is reported rather than refused. A field already reading what the call asks for is left alone and reported in skipped, and a component with no field left to write comes back with isChanged false. A rename shows in search results as soon as this call returns, because the name is part of the path search reports; a note or a character limit is not searchable at all. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
updatesarrayrequired- The components to edit, at most 50 per call.
isOverwriteNoteboolean- Replace an existing note rather than keeping it. The note column has no history, so a replaced note is gone.default
false
frontitudemcp_frontitude_update_component_valuesWrite the values of copy components in one locale, either the source language or a translation.WriteUpdate component values
Write the values of copy components in one locale, either the source language or a translation. A source-language write resets every translation of those components that stood at review or final to new, and drops the component itself from new or final to draft unless the call passes a status. A translation left at draft, and a component at review, are where they were. effects.translationStatusResets counts the translations it reset. A component used by more than one text takes acknowledgedInstances, because writing it writes every one of them. A first write into a translation locale is stored and selected, so it shows in the app straight away. Writing the value a component already holds writes nothing for it: no revision, no translation reset and no webhook, and the item comes back with isChanged false. Each item also reports which effects fired, so a call that moved the status but not the value is legible. Send expectedValue on an item to have the whole call refused when that component no longer holds the value you read, rather than writing over somebody else. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
localeIdstringrequired- The locale to write. `main` is the source language, not a translation: writing there replaces the original copy and resets every translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
updatesarrayrequired- The components to write, at most 25 per call and at most 10 when the locale is the source language.
acknowledgedInstancesinteger- How many texts this call writes, added up over the components named. Required when any of them is used by more than one text, since writing a component writes every text using it, and refused when it is not the true number. get_component reports the number per component as textsCount, and list_components reports it on each row.
isSetSelectedPluralboolean- Make the plural form given here the one the component displays in this locale.default
false pluralIdstring- The plural form to write. Omit it to keep the form the component already uses in this locale; the empty string is the non-pluralized form. Passing a form on a component that is not pluralized turns plurals on for it and for every instance of it.one of
zeroonetwofewmanyother statusstring- The status to leave the components at. Without it a component at new or final drops to draft, because its copy changed. Setting final on the source language starts auto-translation and spends the workspace translation quota after this call returns. A write whose translations would carry the workspace past its translation allowance translates nothing, turns auto-translation off for the whole workspace, and emails the workspace admin. Nothing here turns it back on. It applies to every update in the call, so it sits beside updates and not inside one.one of
newdraftreviewfinal
frontitudemcp_frontitude_update_text_valuesWrite the copy of texts in one locale.WriteUpdate text values
Write the copy of texts in one locale. A text attached to a copy component writes through to that component, so every translation of it resets and effects.translationStatusResets counts those resets. Where that component is used by more than one text the write is refused, because it would change copy in texts this call never named: write the component with update_component_values. An unattached text changes on its own. Writing a value can also attach a text to a component that already holds the same copy, which is reported in autoAttachedComponentIds. Writing the copy a text already holds writes nothing for it: no revision, no translation reset and no webhook, and the item comes back with isChanged false. Each item also reports which effects fired, so a call that moved the status but not the copy is legible. Send expectedValue on an item to have the whole call refused when that text no longer holds the copy you read, rather than writing over somebody else. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
localeIdstringrequired- The locale to write. `main` is the source language, not a translation: writing there replaces the original copy and resets every translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
updatesarrayrequired- The texts to write, at most 25 per call and at most 10 when the locale is the source language.
isSetSelectedPluralboolean- Make the plural form given here the one the text displays in this locale.default
false pluralIdstring- The plural form to write. Omit it to keep the form the component already uses in this locale; the empty string is the non-pluralized form. Passing a form on a component that is not pluralized turns plurals on for it and for every instance of it.one of
zeroonetwofewmanyother statusstring- The status to leave the texts at. Without it a text at new or final drops to draft, because its copy changed. Setting final on the source language starts auto-translation and spends the workspace translation quota after this call returns. A write whose translations would carry the workspace past its translation allowance translates nothing, turns auto-translation off for the whole workspace, and emails the workspace admin. Nothing here turns it back on. Where the workspace creates a copy component from a text reaching final, an unattached text is refused here and set_status is the tool for it. When the value written attaches a text to a copy component, the status lands on that component and moves every other instance of it. It applies to every update in the call, so it sits beside updates and not inside one.one of
newdraftreviewfinal
frontitudemcp_frontitude_upsert_categoryCreate a library category, rename one, or set the note shown on it.WriteCreate or update a library category
Create a library category, rename one, or set the note shown on it. Creating is safe to repeat: a name already used under the same parent comes back with isCreated false rather than as a conflict. Renaming and note-setting are safe to repeat too: a call that leaves the category as it already is comes back with isChanged false. A rename rewrites the full path of every component filed anywhere under it, so search and list results reflect a rename as soon as this call returns; creating and note-setting change no component. Categories nest three deep and there is no way to move one to a different parent. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
actionstringrequired- What to do: create adds a category, or returns the one that already holds that name under the same parent; rename gives an existing category a new name; set_note replaces the guidance note shown on the category.one of
createrenameset_note categoryIdstring- The category to change, from list_scopes with scopeType category. Pass it when action is rename or set_note; every other action refuses it.
namestring- The category name, one segment with no slash. Names are matched case-insensitively within a parent. Pass it when action is create or rename; every other action refuses it.
notestring- The note, replacing whatever is there. Pass an empty string to clear it. Pass it when action is set_note; every other action refuses it.
parentCategoryIdstring- Nest it under this category. Omit for a top-level one. Pass it when action is create; every other action refuses it.
frontitudemcp_frontitude_attach_textsMake texts instances of a copy component, so they take its value and follow it from then on.DestructiveAttach texts
Make texts instances of a copy component, so they take its value and follow it from then on. Any variable the text fills in is captured from its value against the component template. Texts already belonging to another component are reported with the component blocking them, and the rest of the batch still attaches. A text already an instance of this component is left alone and comes back with isChanged false. Search results are unaffected: this writes the instances, never the component. A text holding a developer key of its own has that key cleared rather than moved to the component: from then on it reports the component's key, and detaching does not bring the old one back. One exception: an id nothing in this workspace answers to refuses the whole call, names the ids it could not find, and writes nothing. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
componentIdstringrequired- The copy component the texts become instances of.
localeIdstringrequired- The language pane this call acts on. `main` is the source language; any other id is a translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales. Here it gives the pane pluralId applies to; the attach itself copies the component's copy into the text in every locale.
textIdsarrayrequired- The texts to attach, at most 50 per call. A text already attached to this component is left alone.
isCreateMissingPlaceholdersboolean- Register any placeholder value captured from the text against its workspace variable. This write is permanent even if the attach is rolled back.default
false isDetachIfAlreadyAttachedboolean- A text that belongs to another component stops showing its own copy in every locale, takes this component's instead, and reports this component's key from then on, with none of the old coming back. This flag accepts that and moves it. Without it such a text is reported in failed and the rest still attach.default
false pluralIdstring- The plural form to act on. Omit it to take the form the component already shows in this locale; the empty string is the non-pluralized form. It has to be a form the component already has in this locale, since this call selects a form rather than writing one. Read the forms from get_component with the same localeId.one of
zeroonetwofewmanyother
frontitudemcp_frontitude_create_componentsCreate reusable copy components in your own workspace, each with the value it says and, where that copy is already in the designs, the texts to turn into instances of it.DestructiveCreate components
Create reusable copy components in your own workspace, each with the value it says and, where that copy is already in the designs, the texts to turn into instances of it. Every item carries a uniqueKey or textIds, so retrying a call that timed out cannot create the component twice. The component is created in the source language; translate it afterwards with update_component_values. An item that passes textIds takes that text's status, so componentizing a final text gives a final component. Every text passed is rewritten to the component's value, so one saying something else loses that copy; leave value out to take it from the first text. An item passing more than one text puts the first text's translations on the component, and the others then show them: their own copy in the other locales is gone, and detaching does not bring it back. Each text passed also loses the developer key it held of its own: a key belongs to the component, and this one does not inherit it. Items that fail a check are reported in failed and the rest still land; set isDryRun to run every check and read what would happen without creating anything. One exception: an id nothing in this workspace answers to refuses the whole call, names the ids it could not find, and writes nothing. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
componentsarrayrequired- The components to create, at most 25 per call. Each one carries a uniqueKey or textIds.
isCreateMissingCategoriesboolean- Create any category given by a categoryPath that does not exist yet.default
false isCreateMissingTagsboolean- Create any tag label that does not exist yet.default
false isDryRunboolean- Run every check and report what would happen without writing anything.default
false
frontitudemcp_frontitude_delete_categoryDelete a library category and every subcategory under it.DestructiveDelete a library category
Delete a library category and every subcategory under it. With isDeleteAssignedComponents false the components survive and become uncategorized, which is reversible by filing them again, and that branch takes at most 200 components; for more, call move_components with the ids you mean. With it true the components are deleted outright, with their copy and their history, and every text using one is detached first and keeps its value as an unattached text; that branch takes at most 25 components, and for more you call delete_components in batches, with the copy each one holds. Deleting them here needs delete_components granted on this connection, since it is the same deletion. Both branches need expectedAffectedCount. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
categoryIdstringrequired- The category to delete, from list_scopes with scopeType category. Its subcategories go with it.
expectedAffectedCountintegerrequired- The number of components the call will take: deleted with isDeleteAssignedComponents true, made uncategorized with it false. Count it first: count_scope with scopeType category counts one category, so add it up over the category and every subcategory list_scopes reports beneath it. The call is refused when the true number is different. The refusal writes nothing and reports that number, so a count that came out low costs one refused call and you send the number it named.
isDeleteAssignedComponentsbooleanrequired- True deletes every component filed in the category and its subcategories, along with their copy and history. False keeps them and leaves them uncategorized.
frontitudemcp_frontitude_delete_componentsDelete copy components and every revision they hold, in every locale.DestructiveDelete components
Delete copy components and every revision they hold, in every locale. Each text using one is detached first and keeps its value as an unattached text, in the source language alone: the translations it was showing were the component's and go with it. It also loses the unique key it was reporting, since that key belongs to the component, and a text of a pluralized component is left holding only the form it was showing. There is no undo and no soft delete: name each component once, by the copy it holds now, having read it first, and the whole call is refused when one of them holds something else. expectedAffectedCount counts the design texts this detaches, not the components you pass. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
componentsarrayrequired- The exact components to delete, at most 25 per call. Nothing recomputes this list for you.
expectedAffectedCountintegerrequired- The number of design texts this call detaches, added up over the components named. Count it first: get_component reports it per component as textsCount and list_components reports it on each row; list_component_instances lists the texts themselves, but only the ones in projects you can reach. The call is refused when the true number is different. The refusal writes nothing and reports that number, so a count that came out low costs one refused call and you send the number it named.
frontitudemcp_frontitude_delete_tagDelete a workspace tag and strip it from every component and text carrying it, including ones hidden from the text list.DestructiveDelete a workspace tag
Delete a workspace tag and strip it from every component and text carrying it, including ones hidden from the text list. Nothing else about those rows changes and no copy is touched, but the tag and its use are gone for good. expectedAffectedCount is what bounds this call, since no cap limits how far a tag reaches. Tags are not searchable copy, so search and list results are unchanged. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
expectedAffectedCountintegerrequired- The number of components and texts the tag will be stripped from. Count it first: list_components with tagIds gives the components, and list_texts with the same tagIds gives the texts one project at a time, hidden ones included. That text list also returns texts that only inherit the tag from their component, so subtract the rows whose parentComponentId is one of those components. A text can carry the tag itself as well as inherit it, so that subtraction can come out low. The call is refused when the true number is different. The refusal writes nothing and reports that number, so a count that came out low costs one refused call and you send the number it named.
tagIdstringrequired- The tag to delete, from list_scopes with scopeType tag.
frontitudemcp_frontitude_delete_variableRemove one example value from a workspace variable with remove_value, or delete the variable itself with delete_variable.DestructiveDelete a workspace variable or one of its values
Remove one example value from a workspace variable with remove_value, or delete the variable itself with delete_variable. remove_value keeps the variable and every other value it offers, and is refused while a component or an instance still shows the value. delete_variable rewrites every component value and every unattached text value that uses the variable, replacing the variable with the example value that entry shows, so the copy becomes literal text and cannot be turned back. A component takes its own example value, and every instance of it then shows that one, because the copy is the component's and can hold only one literal: an instance that had chosen an example of its own loses it. It drops everything it rewrote from new or final to draft, leaving anything at review where it stands, marks their translations as needing review and takes at most 200 affected components and texts. expectedAffectedCount confirms what that delete will rewrite; the action alone decides which of the two runs. Search and list results reflect the delete as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
actionstringrequired- What to do: remove_value takes one example value off the variable and leaves the variable in the workspace; delete_variable deletes the variable and rewrites every value using it into literal text, which cannot be turned back.one of
remove_valuedelete_variable variableNamestringrequired- The variable name, without braces. Matched exactly and case-sensitively.
expectedAffectedCountinteger- The number of components plus unattached texts whose values will be rewritten. Pass it when action is delete_variable; every other action refuses it. Count it first: list_components with variableName gives the components, and list_texts with type regular gives the unattached texts one project at a time, whose values show which of them use it. Both reads show the source language and the plural form each component currently shows, so a use that appears only in a translation or only in another plural form is counted by the write and not by these reads. The call is refused when the true number is different. The refusal writes nothing and reports that number, so a count that came out low costs one refused call and you send the number it named.
valuestring- One example value to remove from the variable. The variable itself stays. Pass it when action is remove_value; every other action refuses it.
frontitudemcp_frontitude_detach_textsDiscard the translations, the developer key and the spare plural forms of texts, and cut them loose from the copy components they are instances of.DestructiveDetach texts
Discard the translations, the developer key and the spare plural forms of texts, and cut them loose from the copy components they are instances of. Those belong to the component and stay with it, so a detached text has copy in the source language alone, reports no key, and set_unique_key refuses it until it is an instance again. Attaching it back to the component it left, whose id comes back in affectedComponentIds, copies that copy and that key into it again in every locale; no attach brings back copy the text held before it was ever an instance. The text leaves list_component_instances and the component textsCount drops, but nothing comes off the project text list: it is still in its project and still in the design. set_text_hidden is what takes a text out of the project text list, and it needs no detach. A text that is not an instance is left alone and comes back with isChanged false. Name each text by the copy it shows now, having read it first: the whole call is refused when one of them shows something else. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
textsarrayrequired- The exact texts to detach, at most 50 per call. A text that is not an instance is left alone.
frontitudemcp_frontitude_move_projectMove a project into a project folder, or out to the top level of the workspace with a null folderId.DestructiveFile a project under a folder
Move a project into a project folder, or out to the top level of the workspace with a null folderId. A folder is an access grant, so filing a project under one hands every collaborator on that folder the project and all of its copy. Taking it out of a folder takes that grant away: anyone whose only route to the project was that folder loses the project and everything in it, while people who collaborate on the project itself, and members of the workspace, keep the access they already had. No copy is written either way, so nothing inside the project changes. A project stays in the workspace it was created in, so a folder in another workspace is refused even when you can reach both. The folder it came from comes back as previousFolderId, so the move can be reversed and the access it took away restored, and a move to the folder it is already in writes nothing and comes back with isChanged false. Both the folder it leaves and the folder it enters are checked. If somebody else files it elsewhere while this call runs it is refused rather than moved, since the folder it would leave was never checked. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
- Idempotent
Inputs
folderIdstringrequired- The folder to file it under, from list_scopes with scopeType folder, or null to put it at the top level of the workspace. Always send one of the two.
projectIdstringrequired- The project to file, from list_scopes with scopeType project.
frontitudemcp_frontitude_remove_pluralsDelete one plural form of a component, or turn plurals off for it entirely, in one locale.DestructiveRemove plural forms
Delete one plural form of a component, or turn plurals off for it entirely, in one locale. Both are permanent. delete_form takes deletedValue, the copy the named form holds, and turn_off takes deletedValues, the copy of every form it removes but the one on show; either is refused when the component holds something else, so copy is only destroyed by a caller that has read it. delete_form also refuses the form the component shows and any form an instance shows, because deleting it would change what those designs read. turn_off writes a new value revision, which resets the component to draft if it stood at new or final, and marks its translations as needing review. It also narrows every instance to the variables the form it keeps uses: a placeholder an instance chose for any other variable is gone in this locale. Search and list results reflect this change as soon as this call returns. This runs in a single workspace, so an id read from another workspace is refused; ping reports the workspace you are in.
Inputs
actionstringrequired- What to do: delete_form removes one plural form and its values, keeping the component pluralized; turn_off removes every plural form, leaving the component with the single value it shows now.one of
delete_formturn_off localeIdstringrequired- The language pane this call acts on. `main` is the source language; any other id is a translation. Use `list_scopes` with `scopeType: 'locale'` for the workspace's locales.
componentIdstring- The copy component to change. Every instance of it in every project follows. Pass exactly one of componentId, textId.
deletedValuestring- The copy the form named in pluralId holds in this locale, copied over exactly. It is the wording this call destroys, so read it first from get_component with include plurals and the same localeId. The empty string says the form holds no copy. Pass it when action is delete_form; every other action refuses it.
deletedValuesarray- The copy of every form turn_off removes but the one the component shows now, whose copy stays as the single value it keeps: one entry per form, in any order, and an empty list when the shown form is the only one. Read them first from get_component with include plurals and the same localeId, which marks the shown form isSelected. The empty string stands for a form holding no copy. Pass it when action is turn_off; every other action refuses it.
pluralIdstring- One of the plural forms the component has in this locale. Read them from get_component with the same localeId; the non-plural form is not one of them. Pass it when action is delete_form; every other action refuses it.one of
zeroonetwofewmanyother textIdstring- One text. Its component is what changes, so every other instance of that component follows too. get_text with include component gives that componentId. Pass exactly one of componentId, textId.
No tools match.