airstrings-mcp
Officialairstrings
CLI and MCP server for AirStrings: over-the-air string updates for iOS, Android, web and React Native apps, and Go backends.
Manage strings and locales from the terminal or let an AI agent do it over MCP. airstrings publish has AirStrings sign the bundle (Ed25519) and push it to the CDN; the SDKs verify the signature before showing anything.
npm install -g @airstrings/cli # or: brew install symbionix-sl/airstrings/airstrings
airstrings mcp install # register the MCP server with Claude CodeListed in the MCP Registry as io.github.symbionix-sl/airstrings-cli.
Install
npm (any platform)
npm install -g @airstrings/cli
airstrings <command>Requires Node 18+. Installs airstrings and airstrings-mcp.
Homebrew (macOS / Linux)
brew install symbionix-sl/airstrings/airstringsFrom source
go install github.com/symbionix-sl/airstrings-cli/cmd/airstrings@latestBuild locally
git clone git@github.com:symbionix-sl/airstrings-cli.git
cd airstrings-cli
go build -o airstrings ./cmd/airstringsRelated MCP server: i1n
Setup
Initialize a workspace in your project directory:
cd my-project
airstrings initWith no key, init opens the browser to log in (an owner of your organization approves), stores an org key in ~/.config/airstrings/credentials.json, creates a project named after the folder and writes .airstrings/config.json. Use --name <name> to name it, or --project <id> to bind an existing project. Without a terminal it waits up to 90 s for the approval; if it times out (or with --no-browser/CI) it exits 9 with the URL — re-run the same command after approving.
Already have a project key (as_proj_…, from the dashboard's API keys page)? airstrings init <project-key> binds the folder to that project. One project key covers every environment.
Staging is the active environment after init. Production is protected by default: it rejects direct writes and publishing, and changes reach it only by promotion — a human in the dashboard, or airstrings promote --to production with a full-power org key. airstrings sdk-config --env production gives an agent everything the SDK needs for production.
Keys
Key | Prefix | Covers | Get it |
Org key |
| every project of the org |
|
Project key |
| every environment of one project | dashboard → API keys |
Legacy environment key | 64 hex | one environment | created before 0.18 |
Precedence: AIRSTRINGS_ORG_API_KEY > AIRSTRINGS_API_KEY > workspace key > stored login. In CI prefer a project key in AIRSTRINGS_API_KEY. For CI across several projects use AIRSTRINGS_ORG_API_KEY with a gated (non-full-power) org key created in the dashboard.
airstrings login # log in again (revokes the previous org key)
airstrings logout # revoke and forget the stored org key
airstrings project ls # projects of the org (org key)
airstrings --project <id> status # run against another project (org key)
airstrings apikey ls # the project's keys (✓ = stored in this workspace)
airstrings apikey rotate # rotate the workspace key
airstrings apikey revoke # revoke the workspace's stored keys (e.g. after a leak)Environments
airstrings env # every environment: protected/open, key in workspace or not
airstrings env use staging # switch to staging
airstrings env add <api-key> # add a legacy environment key (deprecated)
airstrings env rm staging # remove environment credentials
airstrings -e -u staging # shorthand for env use
airstrings status # project, env, key scope, protection + next stepSDK configuration
airstrings sdk-config # production (default) IDs, public key, SDK snippets
airstrings sdk-config --env staging # another environment
airstrings sdk-config --env production --jsonPrints the organization, project and environment IDs, the environment's Ed25519 public key(s), and a ready-to-paste initializer for the Web, React Native, iOS, Android and Go SDKs. Every value is public, not a secret — safe to show, commit and embed in app code — so any API key of the project works — a staging key prints production's config.
Usage
airstrings <command> [options]Project & Environments
airstrings project # Show project info
airstrings env # List environments with protection and key state
airstrings env use staging # Switch active environment
airstrings env create staging # Create a new environment
airstrings locales # List locales with string countsStrings
strings set and strings rm are local-first: they edit the workspace CSVs and never call the API unless --push is given.
airstrings strings list # List all strings (remote)
airstrings strings list --locale en --limit 50 # Filter by locale
airstrings strings ls --local # List local workspace strings (offline, no credentials)
airstrings strings ls --local --section onboarding # List one section, offline
airstrings strings get welcome.title # Get a single string (remote)
airstrings strings set welcome.title en="Hello" es="Hola" --format text # Write to local CSVs
airstrings strings set app.name en="My App" --format text --push # Also upsert to the API
airstrings strings rm old.unused.key # Remove from local CSVs
airstrings strings rm old.unused.key --push # Also delete from the API
airstrings strings rm welcome.title --locale es --push # Remove one locale, locally and remotelySections
airstrings sections list
airstrings sections create onboarding --description "Onboarding flow strings"
airstrings sections delete sec_xxxxxBundles & Publishing
airstrings bundles # List published bundles
airstrings publish # Publish all locales
airstrings publish en es # Publish specific locales
airstrings promote preview # Diff staging → production; prints the dashboard link where a human applies itPublishing to a protected environment exits with code 7 and tells you the next step: publish to staging, then ask a human to promote at the printed link.
Offline-safe builds
Ship published bundles inside your app so SDKs can serve strings with no network — cold offline starts, SSG/SSR builds, CI:
airstrings bundles pullThis downloads the published, signed bundles for the active environment into airstrings/bundles/ at the workspace root (plus a manifest.json provenance record), verifying every Ed25519 signature before writing. Commit the folder:
git add airstrings/bundles
git commit -m "chore: update bundled fallback strings"SDKs detect the folder automatically and seed from it on startup, re-verifying every bundle before use. Run the pull in CI or as a pre-release step to keep the committed snapshot fresh.
airstrings bundles pull dist/seed # custom output dir (persisted to workspace config)
airstrings bundles pull --locale en-US # restrict to one localeNot the same as airstrings pull: pull fetches draft workspace strings as editable CSVs for the editing workflow, while bundles pull fetches published, signed bundles — immutable delivery artifacts for shipping. The two never share an output location.
Import
airstrings import csv strings.csv # Import strings from CSV
airstrings import status imp_xxxxx # Check import progressWorkspace
The workspace workflow lets you manage strings locally and sync with the API. This is the recommended workflow for AI-assisted string management.
# Initialize workspace with the staging write key from onboarding
airstrings init <staging-write-key>
# Add strings locally (no API calls)
airstrings strings set onboarding.welcome en="Welcome!" it="Benvenuto!" --format text --section onboarding
airstrings strings set onboarding.welcome de="Willkommen!" es="¡Bienvenido!" fr="Bienvenue!" --format text --section onboarding
airstrings strings set app.tagline en="The best app" it="La migliore app" --format text
# List local strings (offline, no credentials)
airstrings strings ls --local
airstrings strings ls --local --section onboarding
# Edit and remove
airstrings strings set onboarding.welcome en="Welcome to the app!" --format text --section onboarding
airstrings strings rm old.key --section onboarding
# Sync a single key immediately while editing
airstrings strings set app.tagline en="The best app" --format text --push
# Push everything to AirStrings
airstrings push
airstrings push --section onboarding # push single section
# Pull remote strings to local
airstrings pullThe airstrings init command creates a .airstrings/ folder in your project root:
.airstrings/
config.json # workspace config (credentials, project, active env)
strings.csv # unsectioned strings
onboarding/onboarding.csv # section strings
settings/settings.csvEach section gets its own subdirectory with a CSV file. Unsectioned strings live in the root strings.csv. All files are plain CSV and can be committed to version control.
MCP Server
AirStrings provides an MCP server so AI assistants like Claude can manage strings directly through structured tool calls.
airstrings mcp install # for Claude Code
airstrings mcp install --claude-desktop # for Claude Desktop
airstrings mcp status # check installationThat's it. Restart Claude and the tools are available.
Example: AI-assisted localization
You: "Translate my app's onboarding screen into Italian, German, Spanish, and French"
Claude uses airstrings_strings_set:
key: "onboarding.welcome"
values: {"it": "Benvenuto!", "de": "Willkommen!", "es": "¡Bienvenido!", "fr": "Bienvenue!"}
section: "onboarding"
Claude uses airstrings_strings_set:
key: "onboarding.subtitle"
values: {"it": "Inizia il tuo viaggio", "de": "Beginne deine Reise", "es": "Comienza tu viaje", "fr": "Commencez votre voyage"}
section: "onboarding"
Claude uses airstrings_push:
section: "onboarding"
-> Pushed 2 strings (0 errors)
Sections: onboardingInstead of generating CSV files, the AI calls structured MCP tools -- one call per string. This saves tokens and eliminates CSV formatting errors.
Available MCP tools
Tool | Description |
| Initialize workspace |
| Add/update string in local CSV (optional |
| Remove string from local CSV (optional |
| List local strings |
| Push local strings to API |
| Pull remote strings to local |
| Publish bundles to CDN |
JSON Output
Add --json to any command for machine-readable output:
airstrings strings list --json
airstrings project --json | jq '.name'With --json, errors are written to stderr as {"error":{"message":"…","next_step":"…","exit_code":7}}.
Exit codes
code | meaning |
0 | ok |
1 | generic error |
2 | usage / bad input |
3 | auth: bad or expired key, read key used for a write, or no key in this workspace for an open environment |
4 | not found |
5 | network (retry) |
6 | rate limited (retry) |
7 | environment protected — publish to staging, a human promotes |
8 | plan limit reached — upgrade |
9 | login pending — open the printed URL, approve, re-run |
Configuration
Config is stored per-project in .airstrings/config.json (like .git/config). No global config — each workspace is self-contained with its own credentials and active environment.
airstrings init [<api-key>] [--url <base-url>] # create workspace (logs in without a key)
airstrings env rm <name> # remove environment credentials
airstrings env use <name> # switch environment
airstrings status # show active contextThe workspace is found by walking up the directory tree, so commands work from any subdirectory.
Requirements
Go 1.26.1+
An AirStrings account with an API key
License
MIT — see LICENSE.
Available Tools
17 toolsairstrings_env_listA
Every environment of the project, same as airstrings env: name, ID, default, protection (protected/open), whether this workspace holds a key for it, and which one is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does so well by enumerating exactly what is returned, including the protected/open distinction and the active-environment flag. It does not state that it is read-only or whether auth is required, but for a zero-parameter listing the side-effect risk is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that packs the essential scope and return fields with no filler. The run-on enumeration of attributes is dense but every element is informative and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description compensates by listing the returned fields in detail, which is precisely what an agent needs. For a zero-parameter read-only listing it is essentially complete, missing only explicit authentication requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters, so per the rubric the baseline is 4. The description correctly adds no parameter semantics because none exist, and nothing is misrepresented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names the specific resource (every environment of the project) and the exact attributes returned (name, ID, default, protection, key presence, active). The CLI equivalence 'same as `airstrings env`' anchors the intent clearly. It does not explicitly differentiate itself from siblings like airstrings_status or airstrings_variant_status, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites, and no mention of alternatives among the many airstrings_* siblings. Usage is only implied by the listing nature of the tool, so an agent must infer the trigger conditions on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_initA
Bind a directory to an AirStrings project. Without api_key it uses AIRSTRINGS_ORG_API_KEY, AIRSTRINGS_API_KEY or the stored login; if none, it returns status "pending": the user approves verification_uri_complete, then call again. An org key creates a project named after the folder unless project is set.
| Name | Required | Description | Default |
|---|---|---|---|
| dir | No | Directory to initialize. Uses current working directory if omitted. | |
| org | No | Organization ID to bind to. Uses the stored login for that org, or logs in. Optional. | |
| name | No | Name for a project created with an org key. Defaults to the folder or repository name. | |
| api_key | No | Project key (as_proj_…), org key (as_org_…) or legacy environment key. Optional. | |
| project | No | Existing project ID or name to bind instead of creating one (org key). | |
| base_url | No | API base URL. Defaults to https://api.airstrings.com if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does a solid job: it discloses the credential fallback order (env vars, then stored login), the 'pending' status with an out-of-band approval step, the need to re-call, and the side effect that an org key creates a project named after the folder. It stops short of stating permission requirements or what a successful response returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core purpose front-loaded and no filler. Every clause carries information, though the middle sentence is somewhat packed and could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, zero-required tool with no output schema and no annotations, the description covers the credential flow, the interactive approval detour, and project-creation semantics well. The main omission is an indication of what a successful (non-pending) call returns, which the absent output schema would otherwise have supplied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds semantics the schema lacks: how api_key interacts with the env-var fallback, and how project suppresses the default naming (folder/repo name) when an org key is used. These are behavioral relationships between parameters, not just restatements.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb and resource ('Bind a directory to an AirStrings project'), which is far better than a restatement of the name. It does not, however, distinguish itself from the sibling airstrings_login even though both appear to touch the same stored-login/verification flow, leaving potential ambiguity for the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Operational guidance is present (auth precedence chain, the pending/verification_uri_complete approval loop, re-calling afterwards), which tells the agent how to complete the flow. But there is no explicit when-to-use-this-vs-alternatives statement, and given airstrings_login sits in the sibling list with overlapping auth behavior, that gap matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_loginA
Log in and store an org key. Returns status "pending": an organization owner approves verification_uri_complete, then call again.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | Organization ID the approval must be for. Optional. | |
| base_url | No | API base URL. Defaults to https://api.airstrings.com if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses the key non-obvious behavior: the call returns a pending status requiring owner approval before re-invocation. It does not say where the org key is stored, whether the first call has side effects before approval, or what happens on denial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler; the core action is front-loaded. The second clause is dense and slightly awkward in its compression, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description must convey behavioral context, and it covers the critical two-step approval flow well. Missing details about key storage location and failure modes are minor for a login tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (org, base_url) are already documented in the schema. The description adds no meaning about the org ID or base URL beyond what the schema states; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and outcome: 'Log in and store an org key.' An agent can understand the core action. However, it does not differentiate itself from the sibling airstrings_init, which plausibly also establishes credentials, so identification rests on the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a usage sequence by saying to call again after an owner approves verification_uri_complete, which is genuine procedural guidance. It gives no explicit when-to-use versus when-not-to-use, and never routes the agent between this and airstrings_init.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_promote_previewA
Read-only diff of what promoting strings from one environment to another would change (added, updated, and extra keys per locale). Applies nothing — a human reviews the diff and applies the promotion at apply_url in the dashboard.
| Name | Required | Description | Default |
|---|---|---|---|
| source_env | No | Source environment NAME. Defaults to the active environment if omitted. | |
| target_env | No | Target environment NAME. Defaults to the default environment if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it declares read-only semantics, states no changes are applied, and names the apply_url handoff point. It also sketches the return content (added/updated/extra keys per locale), though it does not cover failure modes or env-equality edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the read-only nature and the no-side-effect guarantee are front-loaded before the handoff detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a preview tool with no annotations or output schema, the description is nearly self-sufficient: it explains that nothing is applied, what the diff contains, and where the human applies it. Only the exact return shape and error behavior remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters document themselves, including default behavior when omitted. The description only implies the source/target environment roles, so the baseline of 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('read-only diff') and resource ('promoting strings from one environment to another'), and enumerates the diff contents (added, updated, extra keys per locale). It also distinguishes itself from the apply path by stating it applies nothing, which separates it from sibling airstrings_variant_promote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the usage context clearly: preview first, then a human applies at apply_url in the dashboard. It does not explicitly name a sibling tool as the alternative apply route, so a 4 rather than a 5, but the when-to-use is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_publishB
Publish bundles to the CDN. Bundles are signed and delivered to SDKs.
| Name | Required | Description | Default |
|---|---|---|---|
| locales | No | Comma-separated locales to publish. If omitted, publishes all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses one useful side effect (bundles are signed and delivered to SDKs), but says nothing about whether publishing is destructive or reversible, whether it affects production/CDN caching, or what auth/permissions it needs. For a mutation tool this is a substantial gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action ('Publish bundles to the CDN') before the secondary detail. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation/publish tool with no annotations and no output schema, the description is only minimally adequate. It covers the main effect but omits safety/reversibility, prerequisites, and any sense of scope (target environment, CDN, effect on deployed SDKs), leaving an agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'locales' parameter is fully documented in the schema, including the default-all behavior. The description adds no additional syntax or format meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Publish bundles to the CDN', and adds a clarifying clause that bundles are signed and delivered to SDKs. This tells an agent what the tool does, but it offers no differentiation from close siblings like airstrings_push or airstrings_promote_preview, which likely also move/ship content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no alternatives. It never says when to choose publish over push or promote_preview, nor what state must exist before publishing. The only conditional ('if omitted, publishes all') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_pullB
Pull strings from the AirStrings API into the local workspace. Overwrites local CSVs with remote state.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Pull only this section. If omitted, pulls all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the critical trait that local CSVs are overwritten by remote state. However, it omits auth requirements (a separate airstrings_login tool exists), whether local-only strings are lost, and whether the operation is reversible or confirmable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the destructive overwrite warning front-loaded ahead of any procedural detail. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a sync operation with no output schema and no annotations, the description covers what happens to local CSVs but leaves gaps around authentication, partial-section behavior, and how the agent should confirm success or handle the overwrite.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional 'section' parameter is already documented as a scope filter with 'If omitted, pulls all.' The description adds no additional semantics about section naming or format, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pull strings from the AirStrings API') plus the destination ('into the local workspace'), which cleanly separates it from the push/publish siblings by direction of data flow. It does not name a sibling explicitly, so it falls just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to use this versus airstrings_push, airstrings_status, or airstrings_strings_ls, nor whether login (airstrings_login) is a prerequisite. Usage must be inferred entirely from the direction of the sync.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_pushB
Push local workspace strings to the AirStrings API. Upserts each key with its locale values. Creates sections remotely if they don't exist.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Push only this section. If omitted, pushes all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it does disclose real behavior: upsert semantics per key/locale and automatic remote section creation. It omits other mutation-relevant traits such as overwrite/conflict behavior for remote-only keys, authentication requirements (airstrings_login is a sibling), and error or partial-failure handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the action, the write semantics, and the side effect. The core action is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no annotations and no output schema, the description covers the essential write behavior but not the surrounding contract an agent needs — auth prerequisites, failure modes, or what happens to keys that exist remotely but not locally. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional 'section' parameter is fully documented in the schema, so the baseline of 3 applies. The description adds nothing about the parameter beyond what the schema states, though it does confirm the mutation is all-sections by default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Push local workspace strings to the AirStrings API') and clarifies the write direction, which implicitly distinguishes it from the opposite-direction sibling airstrings_pull. It never names a sibling or scope boundary explicitly, so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no routing to alternatives such as airstrings_publish, airstrings_pull, or the variant tools. The only usage signal is the schema-level note that the section parameter can narrow the push, which the schema already carries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_sdk_configA
Public, non-secret SDK setup values for one environment — safe to show the user, commit and embed in app code; no API key or secret is returned. Returns organization, project and environment IDs, Ed25519 public key(s) (verification keys, not credentials), protection (protected/open) and ready-to-paste initializers for web, react_native, ios, android and go. Works with any API key of the project — a staging key returns production's config, so no production key is needed for SDK setup.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Environment NAME or ID. Defaults to the default (production) environment. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does substantial work: it declares no API key or secret is returned, that the public keys are verification keys rather than credentials, and that output is safe to expose/commit. It stops short of explicitly stating the operation is read-only or how invalid env values behave, keeping it just below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the tool's nature and non-safety immediately, then the return payload. Dense but each clause earns its place; the second sentence is long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return values — and it does, listing every field and the per-platform initializers. Combined with the safety framing, it is complete enough for an agent to call this correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single `env` parameter and the description adds little beyond it, only reinforcing the one-environment scope and the production default already documented in the schema. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (public, non-secret SDK setup values for one environment) and enumerates exactly what comes back: org/project/env IDs, Ed25519 public keys, protection state, and ready-to-paste initializers per platform. No sibling tool overlaps this scope, so an agent can select it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for use — safe to show the user, commit and embed — and a useful precondition (any project API key works; a staging key returns production's config, so no production key is needed). It does not name an alternative or a when-not-to-use case, but no sibling competes for this job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_statusA
Workspace status, same as airstrings status: project, active environment, key scope (read/write), protection of every environment (protected/open), the keys stored in this workspace (masked; airstrings apikey revoke removes them) and the one next step for this state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it makes clear this is a read/report operation, discloses that keys are returned masked, and notes that `airstrings apikey revoke` is the removal path. It does not state auth/permission requirements, which for a status command is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with the core purpose ('Workspace status') and then enumerates the payload in a predictable order. It is dense and slightly run-on with parenthetical clauses, but every clause earns its place by describing returned content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe the return shape, and it does: project, active environment, key scope, per-environment protection, masked keys, and the suggested next step. This is nearly complete for a zero-parameter read tool, though it omits any notion of error or empty-workspace states.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the input schema is an empty object, so there is nothing to disambiguate; the baseline for zero parameters is 4. The description correctly adds no spurious parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource with a clear verb-like intent ('Workspace status') and enumerates exactly what it reports, so an agent can tell this is a read-only workspace inspection tool. It does not, however, explicitly distinguish itself from the similarly named sibling airstrings_variant_status, which an agent might reasonably confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Same as `airstrings status`' gives implied usage via the CLI analogy, and the mention of 'the one next step for this state' hints at diagnostic usage. But there is no explicit when-to-use vs alternatives guidance, particularly against variant_status or env_list, so the routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_strings_lsA
List all strings in the local workspace. Returns strings from local CSV files, not from the API.
| Name | Required | Description | Default |
|---|---|---|---|
| section | No | Filter to a specific section. If omitted, lists all sections. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. It usefully discloses the data source (local CSV files rather than the API), which is the key behavioral trait, but says nothing about side effects, ordering, or return volume for a tool that scans files.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste, and the scope/source constraint is front-loaded where an agent will read it first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no annotations and no output schema, the description explains where the data comes from but not what a result looks like or how failures (missing workspace, no CSV files) surface. Adequate but with clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the 'section' filter is already documented as optional with its default behavior. The description adds no syntax, matching rules, or error behavior beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (strings) plus the scope (local workspace), and disambiguates the data source (local CSV files, not the API). An agent can tell this is the read/list counterpart to push/pull/set/rm, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 'local, not API' phrasing hints this is for inspecting local state rather than fetching remote data. It never states when to prefer this over airstrings_pull or what happens when the workspace is empty/uninitialized.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_strings_rmA
Remove a string from the local workspace CSV. Local by default; set push=true to also mirror the removal to the API immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key to remove | |
| push | No | Also mirror the removal to the API immediately. | |
| locale | No | Remove only this locale. If omitted, removes all locales for the key. | |
| section | No | Section to remove from. If omitted, removes from flat strings.csv |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it usefully discloses the dual local/remote behavior and that push acts immediately. However, it never states that removal is destructive or irreversible, whether it requires authentication, or what happens if the key does not exist — significant gaps for a delete operation with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the default behavior and the opt-in flag front-loaded. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter destructive mutation with no annotations and no output schema, the description covers the core behavior but omits error handling, idempotency, and auth requirements. Adequate as a minimum viable definition, not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, making 3 the baseline. The description reinforces push semantics and the local default but adds no syntax or format detail for key, locale, or section beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (remove) and resource (a string in the local workspace CSV), and the local-vs-API clause distinguishes it from a plain sync tool like airstrings_push. It does not name any sibling explicitly, so it falls just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear default ('local by default') and an explicit condition for the alternative behavior ('set push=true to also mirror the removal to the API immediately'). No exclusion guidance such as when to prefer airstrings_push or strings_set instead, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_strings_setA
Add or update a string in the local workspace CSV. Writes to .airstrings//.csv or .airstrings/strings.csv. Local by default; set push=true to also sync the key to the API immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key (e.g., 'onboarding.welcome') | |
| push | No | Also push this key to the API immediately after the local write. | |
| format | Yes | String format: 'text' or 'icu'. Required. | |
| values | Yes | JSON object of locale=value pairs, e.g. {"en": "Hello", "it": "Ciao"} | |
| section | No | Section name. If omitted, string goes to flat strings.csv |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it does disclose write targets, the local-first default, and the push escape hatch. However, it never says whether 'update' replaces or merges existing locale values, what permissions/auth are needed, or what happens on write failure, leaving meaningful mutation semantics unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, zero filler, and the primary action and its destination are front-loaded before the optional push behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with no annotations and no output schema, the description covers the essential write behavior but omits merge-vs-replace semantics, auth prerequisites, and error behavior an agent would need to invoke it confidently. It is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including the section fallback and push behavior. The description restates the push flag and file destinations without adding new format or syntax detail beyond what the schema provides, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource pair (add or update a string in the local workspace CSV) and even names the destination files, so an agent immediately knows this is the write path for individual strings. It doesn't explicitly contrast itself with siblings like airstrings_strings_rm or airstrings_push, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear conditional for a real decision point: local write by default, with push=true adding an immediate API sync. It does not name alternatives (e.g., airstrings_push for bulk syncing) or state when not to use it, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_variant_promoteA
Promote one variant of a string's experiment to become the published value. If the active environment is protected production, the server will refuse — promote in a writable environment instead. Does not promise success.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key whose experiment to promote. | |
| variant | Yes | The variant name to promote to the winning value. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses the environment guardrail (refusal in protected production) and hedges that it 'does not promise success', which hints at possible no-op or asynchronous behavior. But it omits permissions/auth requirements, reversibility, and what happens to the non-winning variants.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the failure condition, then the caveat. No filler and no repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A mutation tool with no annotations and no output schema needs the description to carry more than it does. It covers the key operational hazard (protected production refusal) but is silent on auth needs, reversibility, and the fate of competing variants.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both key and variant are already documented in the schema. The description adds the notion that the variant becomes the 'winning value', which gives mild conceptual context but no new syntax or format detail. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: promote one variant of a string's experiment to become the published value. That is clear enough to distinguish from siblings like airstrings_variant_set or airstrings_variant_start, though it never names the closely related airstrings_promote_preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete condition for failure and a corrective action: if the active environment is protected production the server will refuse, so promote in a writable environment instead. It lacks explicit routing to the sibling alternatives (promote_preview, publish), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_variant_setB
Create or replace the A/B experiment for a string key in the active environment. Replaces the whole experiment: allocation maps each variant name to an integer weight, variants maps each variant name to an object of locale=value pairs.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key the experiment belongs to (e.g., 'onboarding.welcome'). | |
| variants | No | Object mapping each non-control variant name to an object of locale=value pairs, e.g. {"treatment": {"en": "Hi"}}. Never include 'control' — it is the base string. | |
| allocation | No | Object mapping variant name to integer weight, e.g. {"control": 50, "treatment": 50}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the important destructive trait: 'Replaces the whole experiment,' so an agent knows this is an overwrite, not a merge. It does not mention required permissions, whether the experiment must be stopped first, error behavior for unknown keys, or what is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences, with the create-or-replace action front-loaded and the destructive scope stated immediately after. No filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-object mutation tool with no annotations and no output schema, the description covers the data shapes and the replace semantics but omits lifecycle prerequisites, permission needs, and failure behavior. It is adequate to attempt a call but leaves meaningful operational questions unanswered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both nested parameters are already documented in the schema with examples, so the baseline is 3. The description restates the same mappings (variant name to integer weight; variant name to locale=value pairs) without adding format details, defaults, or validation rules beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb phrase ('Create or replace') and resource ('the A/B experiment for a string key'), plus the scope ('in the active environment'), which separates it from lifecycle siblings like variant_start, variant_stop, and variant_promote. However, it never names or contrasts with those siblings, so the differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what the tool does but gives no when-to-use or when-not-to-use guidance, and no routing to alternatives such as airstrings_variant_start, airstrings_variant_stop, or airstrings_variant_promote. An agent must infer from sibling names alone whether it should set up, start, or promote an experiment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_variant_startA
Start the A/B experiment for a string key so its variants are served. If the active environment is protected production, the server will refuse — start the experiment in a writable environment instead. Does not promise success.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key whose experiment to start. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a non-obvious failure mode (refusal in protected production) and outcome uncertainty ('does not promise success'). It still omits idempotency behavior, required permissions, and what a successful invocation yields, so it is not fully complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each doing work: purpose first, then the environment failure/goto, then the outcome caveat. No filler, though 'Does not promise success' is slightly cryptic phrasing for what it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with no annotations and no output schema, the description covers purpose, a key failure condition, and success non-guarantee. Missing return/confirmation behavior keeps it from being fully self-sufficient, but nothing critical for invocation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema description coverage is 100%, so the schema already documents 'key'. The description adds the intent (the key identifies the experiment being started) but no format, constraint, or validation detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start the A/B experiment for a string key') plus the effect ('so its variants are served'), which makes the action distinguishable from stop/set/promote/status siblings. It stops short of explicitly naming a sibling it is not, so it lands at 4 rather than 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear negative condition ('if the active environment is protected production, the server will refuse') and an alternative course of action ('start the experiment in a writable environment instead'). That is real when/when-not guidance, though it routes by environment rather than by sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_variant_statusA
Get the current A/B experiment for a string key in the active environment (status, allocation, variants).
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key whose experiment to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return content (status, allocation, variants) and that it reads the 'active environment', which is useful context, but it says nothing about permissions/auth needs or what happens when no experiment exists for the key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence, front-loaded with the verb, with the return fields called out in a parenthetical rather than a separate sentence. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description partly compensates by naming the returned fields (status, allocation, variants) and the environment scope. For a single-parameter read tool this is close to sufficient, though the empty/no-experiment case and return shape remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single 'key' parameter already documented as 'the string key whose experiment to read'. The description adds little beyond confirming the key targets a string and that resolution happens in the active environment, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), a specific resource ('current A/B experiment for a string key'), and a scope ('active environment'). It is clearly variant-experiment-specific, implicitly distinguishing it from the general airstrings_status and the mutation siblings (variant_set/start/stop), though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the read verb and the phrase 'current ... in the active environment', but there is no explicit when-to-use, when-not-to-use, or routing against airstrings_status or airstrings_strings_ls. An agent must infer that this is the read counterpart to the variant mutation tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airstrings_variant_stopA
Stop the A/B experiment for a string key. Serving reverts to the base string.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The string key whose experiment to stop. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the post-stop serving behavior ('Serving reverts to the base string'), which is the most important outcome. It does not say whether experiment data/metrics are destroyed, whether the stop is reversible or restartable, or what error occurs if no experiment is running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler. The action is front-loaded and the consequence follows immediately, which is exactly the right ordering for an agent scanning tool choices.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutation with no annotations and no output schema, the description covers what the tool does and its observable effect. The remaining gap is error/permission behavior and the fate of experiment data, which is minor given the tool's simplicity but would be worth one more clause.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage, so the schema already documents 'key' as 'The string key whose experiment to stop.' The description's phrase 'for a string key' adds no meaning beyond that, making the baseline of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Stop the A/B experiment for a string key.' This is the clear inverse of sibling tools like airstrings_variant_start and airstrings_variant_promote, though no sibling is named explicitly. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb: use this to end an experiment rather than start or promote one. However, there is no explicit when-to-use statement, no mention of prerequisites (e.g., an experiment must be running), and no named alternatives among the many variant_* siblings. The routing is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
17 tool updates
v0.1.0- First observed
airstrings_env_list - First observed
airstrings_init - First observed
airstrings_login - First observed
airstrings_promote_preview - First observed
airstrings_publish - First observed
airstrings_pull - First observed
airstrings_push - First observed
airstrings_sdk_config - First observed
airstrings_status - First observed
airstrings_strings_ls - First observed
airstrings_strings_rm - First observed
airstrings_strings_set - First observed
airstrings_variant_promote - First observed
airstrings_variant_set - First observed
airstrings_variant_start - First observed
airstrings_variant_status - First observed
airstrings_variant_stop
TDQS
Scored across 17 tools
Most tools target a clearly distinct resource+action (variants, strings, sync, publish, status). Some potential confusion exists between the three promotion-ish concepts (airstrings_promote_preview for environment diffs, airstrings_variant_promote for A/B winners, airstrings_publish for CDN), and status/env_list/sdk_config all return read-only config, but the descriptions make each boundary reasonably clear.
All names share a consistent airstrings_ prefix and mostly follow domain_action patterns (strings_set, variant_status, env_list, sdk_config). Minor deviations appear in bare verb tools (push, pull, publish, init, login) and single-noun status, but the set remains readable and predictable.
17 tools is slightly heavy but justified by the broad i18n domain spanning auth, string CRUD, sync, environments, A/B variants, publishing and SDK setup. Each tool covers a distinct operation, so there is little redundancy for the scope.
The surface covers the full lifecycle: auth (init/login), string CRUD (set/rm/ls), sync (push/pull), A/B variants (set/status/start/stop/promote), environment inspection and publishing. Minor gaps exist — no direct API-side string read/deletion beyond pull, and no environment creation/management — but core workflows are covered.
Maintenance
Related MCP Connectors
Manage app translations: find missing or duplicate phrases, add languages and export dictionaries.
Localize apps from your AI assistant: translate locale files, set glossaries, connect GitHub repos.
Ship and update Capacitor apps: live updates, channels, rollouts, devices, native builds, stats.
Ship over-the-air updates for Capacitor apps: publish releases after your approval, control staged rollouts, read rollout health, and revert.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides tools for working with iOS Localizable.xcstrings files, enabling automated translation workflows and localization management for iOS/macOS projects using Xcode String Catalogs.75MIT
- AlicenseNot gradedqualityBmaintenanceLocalization as code — push, pull, translate, and extract strings from code with AI. 7 MCP tools for type-safe i18n across 182 languages.72 npm2MIT
- AlicenseAqualityBmaintenanceAI localization from your editor — translate an app's string files into 46 languages with placeholder-safe, reproducible output. Eleven formats (JSON, .arb, .po, .strings, Android XML and more), and every translation is read back and checked before it lands.7MIT
- AlicenseAqualityAmaintenanceTranslation QA for i18n locale files. Deterministic validators — missing keys, placeholder drift, collapsed plurals, glossary breaches — that need no API key, plus a review tool that hands translation pairs and judging criteria back to the calling agent, so meaning-level review runs on the model your client already has. Translation with your own LLM key is optional. JSON, Flutter .arb, Apple .8Apache 2.0