CLI tool and MCP server for CRUD operations on xcstrings (String Catalog) files.
Large xcstrings files can contain thousands of localization keys across multiple languages, resulting in massive JSON files. When AI assistants (like Claude Code) read these files directly, they consume a significant amount of tokens—potentially exceeding context limits or rapidly depleting token budgets.
This tool provides a token-efficient approach by offering targeted CRUD operations:
- Query only what you need: Fetch specific keys or languages instead of loading the entire file
- Incremental updates: Add or update individual translations without reading the full content
- Quick stats: Get coverage and progress summaries without parsing all entries
By using the MCP server or CLI, AI assistants can work with xcstrings files of any size while keeping token usage minimal.
mise use -g ubi:Ryu0118/xcstrings-crudUsing nest (mtj0928/nest)
nest install Ryu0118/xcstrings-crudgit clone https://github.com/Ryu0118/xcstrings-crud.git
cd xcstrings-crud
swift build -c releaseBinary will be at .build/release/xcstrings-crud.
The MCP server is available as a subcommand:
xcstrings-crud mcpAdd to your Claude Code MCP settings:
{
"mcpServers": {
"xcstrings-crud": {
"command": "xcstrings-crud",
"args": ["mcp"]
}
}
}| Tool | Description |
|---|---|
xcstrings_create_file |
Create a new xcstrings file |
xcstrings_list_keys |
List all keys |
xcstrings_list_languages |
List supported languages |
xcstrings_list_untranslated |
List untranslated keys |
xcstrings_list_stale |
List keys with stale extraction state |
xcstrings_batch_list_stale |
List stale keys across multiple files |
xcstrings_get_source_language |
Get source language |
xcstrings_get_key |
Get translations for a key |
xcstrings_check_key |
Check if key exists |
xcstrings_check_coverage |
Check key language coverage |
xcstrings_stats_coverage |
Get overall coverage statistics |
xcstrings_stats_progress |
Get translation progress by language |
xcstrings_batch_stats_coverage |
Get coverage for multiple files at once |
xcstrings_batch_check_keys |
Check if multiple keys exist |
xcstrings_batch_add_translations |
Add translations for multiple keys at once |
xcstrings_batch_update_translations |
Update translations for multiple keys at once |
xcstrings_add_translation |
Add translation for single language |
xcstrings_add_translations |
Add translations for multiple languages |
xcstrings_update_translation |
Update translation for single language |
xcstrings_update_translations |
Update translations for multiple languages |
xcstrings_rename_key |
Rename key |
xcstrings_delete_key |
Delete entire key |
xcstrings_delete_translation |
Delete translation for single language |
xcstrings_delete_translations |
Delete translations for multiple languages |
# Create a new xcstrings file
xcstrings-crud create path/to/Localizable.xcstrings
# Create with specific source language
xcstrings-crud create path/to/Localizable.xcstrings --source-language ja
# Overwrite existing file
xcstrings-crud create path/to/Localizable.xcstrings --overwrite# List all keys
xcstrings-crud list keys --file path/to/Localizable.xcstrings
# List languages
xcstrings-crud list languages --file path/to/Localizable.xcstrings
# List untranslated keys for a language
xcstrings-crud list untranslated --file path/to/Localizable.xcstrings --lang ja
# List stale keys (potentially unused)
xcstrings-crud list stale --file path/to/Localizable.xcstrings
# List stale keys across multiple files
xcstrings-crud batch stale -f file1.xcstrings file2.xcstrings file3.xcstrings
# Get source language
xcstrings-crud get source-language --file path/to/Localizable.xcstrings
# Get translations for a key
xcstrings-crud get key "Hello" --file path/to/Localizable.xcstrings
xcstrings-crud get key "Hello" --file path/to/Localizable.xcstrings --lang ja
# Check if key exists
xcstrings-crud check key "Hello" --file path/to/Localizable.xcstrings
# Check key coverage
xcstrings-crud check coverage "Hello" --file path/to/Localizable.xcstrings
# Get overall statistics
xcstrings-crud stats coverage --file path/to/Localizable.xcstrings
# Get progress for a language
xcstrings-crud stats progress --file path/to/Localizable.xcstrings --lang ja
# Get batch coverage for multiple files
xcstrings-crud stats batch-coverage -f file1.xcstrings file2.xcstrings file3.xcstrings# Add translation (single language)
xcstrings-crud add key "Hello" --file path/to/Localizable.xcstrings --lang ja --value "こんにちは"
# Add translation (multiple languages)
xcstrings-crud add key "Hello" --file path/to/Localizable.xcstrings -t ja:こんにちは en:Hello
# Update translation (single language)
xcstrings-crud update key "Hello" --file path/to/Localizable.xcstrings --lang ja --value "こんにちは!"
# Update translations (multiple languages)
xcstrings-crud update key "Hello" --file path/to/Localizable.xcstrings -t ja:こんにちは en:Hello de:Hallo
# Rename key
xcstrings-crud rename key "Hello" --file path/to/Localizable.xcstrings --to "Greeting"# Delete entire key
xcstrings-crud delete key "Hello" --file path/to/Localizable.xcstrings
# Delete translation for specific language only
xcstrings-crud delete key "Hello" --file path/to/Localizable.xcstrings -l ja
# Delete translations for multiple languages
xcstrings-crud delete key "Hello" --file path/to/Localizable.xcstrings -l ja en fr# List stale keys across multiple files
xcstrings-crud batch stale -f file1.xcstrings file2.xcstrings file3.xcstrings
# Check if multiple keys exist
xcstrings-crud batch check --file path/to/Localizable.xcstrings -k Hello Goodbye Welcome
# Check with specific language
xcstrings-crud batch check --file path/to/Localizable.xcstrings -k Hello Goodbye -l ja
# Add translations for multiple keys at once
xcstrings-crud batch add --file path/to/Localizable.xcstrings \
-e "Hello=ja:こんにちは,en:Hello" \
-e "Goodbye=ja:さようなら,en:Goodbye"
# Add with overwrite (replace existing translations)
xcstrings-crud batch add --file path/to/Localizable.xcstrings --overwrite \
-e "Hello=ja:こんにちは,en:Hello"
# Update translations for multiple keys at once
xcstrings-crud batch update --file path/to/Localizable.xcstrings \
-e "Hello=ja:こんにちは!,en:Hello!" \
-e "Goodbye=ja:さようなら!"--file <path>: xcstrings file path (required)--pretty: Pretty-printed JSON output
- macOS 13+
- Swift 6.0+
MIT