Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者による説明(英語の原文)
Check locale files for broken placeholders, plurals and missing keys. Validators need no API key.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
ANTHROPIC_API_KEY, OPENAI_API_KEY「秘密」と表示された値は、あなたのアカウントの鍵です。絶対に人に教えたり、チャットに貼り付けたりしないでください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"shipi18n": {
"command": "npx",
"args": [
"-y",
"@shipi18n/mcp"
],
"env": {
"ANTHROPIC_API_KEY": "your-value",
"OPENAI_API_KEY": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add shipi18n --env ANTHROPIC_API_KEY=your-value --env OPENAI_API_KEY=your-value -- npx -y @shipi18n/mcp動かす前に、空欄の値を入力してください。
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"shipi18n": {
"command": "npx",
"args": [
"-y",
"@shipi18n/mcp"
],
"env": {
"ANTHROPIC_API_KEY": "your-value",
"OPENAI_API_KEY": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"shipi18n": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@shipi18n/mcp"
],
"env": {
"ANTHROPIC_API_KEY": "your-value",
"OPENAI_API_KEY": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント Shipi18n で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
入力が必要なもの:ANTHROPIC_API_KEY, OPENAI_API_KEY
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(2.3.2)がレジストリに届いたのは27 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
同じカテゴリには:Spec Driven Development, Remote Desktop Commander, FlyDocs
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Spec-driven development workflow: your agent works issues, sessions and the status lifecycle.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
Catch broken translations before you ship them. Shipi18n is an open-source check for locale files: it fails CI when a translation — from a human, a TMS or an AI agent — drops or breaks a placeholder, plural or key, and shows the exact fix.
{name}, {{count}}, %{name}, %s, %1$s, %@), plurals whose separator was lost or that miss a form the language needs (Polish few/many, Arabic two — in ICU, i18next keys, Rails, Android and .xcstrings), invalid ICU MessageFormat, missing and orphaned keys, a key written twice in one JSON object, empty and untranslated strings..xcstrings, Android strings.xml, gettext .po, XLIFF.--semantic review and translate use your own LLM key.npx @shipi18n/cli check ./locales -s en
Exit 0 clean, 1 findings (each with a one-line fix), 2 usage error. Output as text, JSON, SARIF (GitHub PR annotations) or JUnit.
*A real run, not a mockup — docs/check-demo.tape reproduces it.*
| I want to… | Use |
|---|---|
| check locale files locally or in any CI | npx @shipi18n/cli check ./locales -s en |
| annotate GitHub pull requests | Shipi18n/shipi18n-github-action@v3 (setup) |
| run it without Node | Docker ghcr.io/shipi18n/cli, or the pre-commit hook |
| run it without npm | the single file shipi18n.mjs from GitHub releases, with a SHA-256 and a build-provenance attestation |
| use it from a Python, Ruby, Go or Java project | the same CLI via Docker, pre-commit or the single file. There is no Python or Ruby package to import |
| have my AI coding agent check its own translations | npx @shipi18n/cli init --agents, or the MCP server @shipi18n/mcp |
| check meaning, not only structure | check --semantic with your own Anthropic or OpenAI key |
| translate (optional) | shipi18n translate with your own key |
--semantic it checks structure, not whether a translation reads well.Found in the wild. The same command on a real project — Hoppscotch's Afrikaans locale as it was when we ran it (structural rules only; the missing-key noise switched off so the placeholder findings stand out):
$ npx @shipi18n/cli check packages/hoppscotch-common/locales -s en \
--severity 'missing-key=off,untranslated=off,orphan-key=off'
✗ af coverage 100.0% 7 error(s), 5 warning(s) error import.file_size_limit_exceeded_warning_multiple_files placeholder-missing — dropped {sizeLimit} error import.file_size_limit_exceeded_warning_single_file placeholder-missing — dropped {sizeLimit} error state.connected_to placeholder-missing — dropped {name} warning state.connected_to placeholder-added — unexpected {naam} error team.invited_to_team placeholder-missing — dropped {workspace} warning team.invited_to_team placeholder-added — unexpected {team} …
{naam} is {name} translated; vue-i18n will never substitute it. We scan public repos, verify every finding by hand against the source language, and send the fix upstream. Running tally, one row per repo: [shipi18n.com/oss](https://shipi18n.com/oss) — 95 repos scanned · 23 ship a verified broken string · 402 strings verified by hand · fixed upstream in 8 repos.
| Repo | What happened | |
|---|---|---|
| Solidus | 13 dropped %{…} interpolations in pt-BR — PR merged the same day, three core approvals | |
| Plane | Czech toasts lost {templateName}/{templateType} — PR merged in 3 hours | |
| nocodb | our issue → maintainer PR sweeping all 39 locales; later 182 plurals in 13 locales whose `\ | machine translation had turned into `, fixed the same day |
| Excalidraw | our issue → contributor fix + a placeholder-parity test suite | |
| Hoppscotch | the af run above — PR merged, 7 strings | |
| 24pullrequests | 20 dropped interpolations fixed in two PRs, then an interpolation check added to their own test suite | |
| devise_invitable | %{email) typo fixed, then the check added to their CI |
Every false positive the scan exposed in our own checker became a fixture in evals/placeholders/corpus.jsonl first.
If the check catches something in your project, consider starring the repo — stars are how the
next person with a broken
es.jsonfinds this.
Then, when you want the meaning checked, bring your own key. The judge needs a provider SDK alongside the CLI:
npm i -D @shipi18n/cli @anthropic-ai/sdk # or `openai`
export ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY npx @shipi18n/cli check ./locales -s en --semantic
An LLM reads each pair and reports mistranslations, omissions and additions:
⚠ es coverage 100.0% 0 error(s), 1 warning(s)
warning delete semantic-mistranslation — Translation says 'will save' (guardará) instead of 'will delete' (eliminará/borrará)
Every placeholder is intact and every key is present, so structural checks pass this file. Only reading it catches the bug. Advisory by default — it warns, it does not fail your build.
Measured, not asserted. On a 228-pair corpus committed *before* the judge was written
(
60d699b) and with thresholds fixed first:
54/54 planted errors caught (100%) and 12/168 false positives on clean pairs (7.1%), with
6/6 glossary violations found. Reproduced on two independent runs (2026-08-16 and 2026-08-17) using
claude-haiku-4-5, 3 passes, ~59k tokens in 156s. Label accuracy moved between runs (100% →
98.1%) — it is a model, so read these as a range, not a constant.
The harness is
evals/semantic/. Run it against your own model.
Nothing goes through our servers, because there are none. The only network call is from your machine to the provider you chose.
| Package | Description |
|---|---|
@shipi18n/core | The engine: translation checks, the semantic judge, placeholder validation — plus provider-agnostic, structure-preserving translation with incremental mode. |
@shipi18n/cli | shipi18n check ./locales for CI, --semantic for meaning, lock to protect hand-edits, translate when you need it. |
@shipi18n/mcp | MCP server — check, diff and review locale files from Claude Desktop, Cursor, or any MCP client. Validation needs no API key. |
vite-plugin-shipi18n | Vite plugin that translates locale files at build time with your own LLM key, with caching. |
shipi18n-github-action | Check locale files on every PR (no key, SARIF annotations); optional BYO-key retranslate. |
Generating translations is a solved problem. Half a dozen good tools will fill your locale files, and an agent will do it for free. Nothing checks the result. Your CI lints your JavaScript, typechecks your types and runs your tests — and then ships a de.json that nobody has read, produced by a model nobody audited.
The checks that do exist are structural: they diff key sets and stop there. That catches the missing key. It does not catch the translation that has every key and every placeholder and still tells your German users the opposite of what you meant.
Shipi18n is that missing gate, in two layers:
{{name}}, {count}, %s, %d, %1$s, $t(...), %{name}, HTML), collapsed plural forms, empty values, untranslated copy, coverage per language.Plus the parts that make it usable day to day:
.yaml/.yml), Flutter .arb, Apple .xcstrings, Android strings.xml, gettext .po/.pot, and XLIFF 1.2/2.0 — including %@/%lld specifiers.--fail-on, --min-coverage, SARIF for PR annotations, JUnit.--baseline accepts today's backlog and fails only on *new* findings (the Stylelint/RuboCop pattern); --severity tunes or silences any rule (error|warning|info|off).pre-commit hook, or the Docker image ghcr.io/shipi18n/cli for GitLab / Bitbucket / Jenkins / local — no Node toolchain required. See the CLI README.shipi18n wp-sync catches JS translation JSON that has drifted from the .po because nobody re-ran wp i18n make-json — a silent bug no other tool checks.--semantic sends anything to an LLM, a scan withholds any string carrying a secret or PII (keys, cards, emails); --detect-secrets runs it standalone with no LLM.shipi18n lock records the translations a human blessed and warns when anything overwrites them, or when the source moves underneath them.complete(prompt) method is a valid adapter.`@shipi
冒頭だけを表示しています。続きはリポジトリで読めます