Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者による説明(英語の原文)
Thai-first context compression; shrinks long Thai and English text, originals retrievable.
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
使っているAIアプリを選んで、設定をコピーしてください。
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"sarup": {
"command": "uvx",
"args": [
"sarup"
]
}
}
}ターミナルでこれを実行します
claude mcp add sarup -- uvx sarupプロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"sarup": {
"command": "uvx",
"args": [
"sarup"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"sarup": {
"type": "stdio",
"command": "uvx",
"args": [
"sarup"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月7日にチェック
レジストリ名は、リポジトリを所有するGitHubアカウント PHUICMT で確認済みです
このリポジトリはまだGitHubから読み取っていません
このリポジトリはまだGitHubから読み取っていません
これはパソコンで動くため、インターネット上のエンドポイントはありません
パソコンで動き、代わりにローカルの設定を使います
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
当てはまる基本チェック1項目のうち1項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
GitHubリポジトリの最終更新は–、最新バージョン(0.2.0)がレジストリに届いたのは10 日前です。
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにPython (uv)も必要です。
同じカテゴリには:Spec Driven Development, Remote Desktop Commander, FactLot
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:★ 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.
Cited CRE facts and deterministic calculators for agents: rent, CAM, debt sizing, IRR, parcel IDs.
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
Thai-first context compression for Claude Code. An MCP server that actually shrinks Thai (50–78% fewer tokens) and caches every original so nothing is ever lost. Measured for what matters too: whether Claude still answers correctly.
*สรุป* means "to summarize." Headroom routes Thai through
noop(0% savings) because its
whitespace tokenizer can't find Thai word boundaries. Sarup uses PyThaiNLP segmentation, so it
compresses Thai as well as English — and caches every original so nothing is ever lost.
newmm word segmentation, not whitespace.verified: true proves a byte-for-byte round-trip.[…] marks every place sentences were dropped, so Claude retrieves instead of mistaking a nearby fact for the answer.| Tier | What | Guarantee |
|---|---|---|
| Compressed view | the shrunk text the model works on | lossy · small · cheap |
| Retrieval store | the original, keyed by a stable hash | lossless · recoverable |
Aggressive lossy compression is safe *because* the original is always one sarup_retrieve(hash) away. This is how "maximum savings" and "100% accuracy" coexist — they live in different tiers.
Two entry points feed one engine: a cheap compressed view the model reads, and a lossless retrieval store that can restore the original byte-for-byte.
flowchart TD
M["🧑 Manual sarup_compress()"]:::entry --> R A["⚙️ Automatic PostToolUse hook (Read · Bash · Grep)"]:::entry --> R
R{"Sarup compress extractive · semantic · abstractive · pipeline"}:::engine R -- "compressed view 50–78% fewer tokens" --> V["📄 Model context"]:::lossy R -. "cache original" .-> S[("🗄️ Retrieval store hash → original")]:::lossless
V -. "need full detail?" .-> RET["🔑 sarup_retrieve(hash)"]:::lossless RET --> S S == "byte-for-byte ✓" ==> V
classDef entry fill:#e0e7ff,stroke:#6366f1,color:#111 classDef engine fill:#fde68a,stroke:#d97706,color:#111 classDef lossy fill:#fef3c7,stroke:#f59e0b,color:#111 classDef lossless fill:#bbf7d0,stroke:#16a34a,color:#111
sarup_compress / sarup_retrieve itself.SARUP_DB_PATH, and substitutes the compressed view + a retrieval hash. Source code is skipped; small outputs pass through untouched.| Tool | Purpose |
|---|---|
sarup_compress(content, target_ratio?, lossless?, query?, mode?) | Compress; returns compressed text, hash, token metrics,verified, token_method. |
sarup_retrieve(hash) | Recover the original content byte-for-byte. |
sarup_stats() | Cumulative session savings. |
`sarup_compress` arguments
| Arg | Type | Default | Meaning |
|---|---|---|---|
content | string | — | Text to compress (required). |
target_ratio | number | 0.5 | Fraction of prose to keep (0.1–0.9). |
lossless | boolean | false | Only apply lossless transforms (whitespace / JSON compact). |
query | string | "" | What you need from the text; sentences matching it are kept. Pass it whenever you know: it took the QA eval from 69% to 100% at the same size. |
mode | string | extractive | See modes below. |
| Mode | How | Needs Ollama | Savings¹ | Speed¹ | Output |
|---|---|---|---|---|---|
extractive *(default)* | TF-IDF scoring + fact boost + n-gram dedup | no | 52.7% | ~1 ms | verbatim subset |
semantic | Embedding centrality + cosine dedup | yes | 63.8% | ~2 s | verbatim subset |
abstractive | Local-LLM rewrite | yes | 44.4% | ~8 s | paraphrased |
pipeline | Cascade: semantic → abstractive | yes | 78.2% | ~6 s | paraphrased |
auto | semantic if Ollama is up, else extractive | optional | 63.8% | ~2 s | subset |
¹ Measured on a 10-sentence Thai paragraph (522 tokens), rewrite model gemma4:12b. Every mode stays 100% recoverable via the store; Ollama modes degrade gracefully to extractive when the backend is down. (gemma4:e4b: pipeline 82.2%; June 2026, gemma3:12b: 88.1%.)
Extractive and semantic output is a verbatim subset of the input sentences, with […] on its own line wherever sentences were dropped. Sentences carrying specifics (numbers, Thai digits, identifiers like X-Api-Key) score higher than general statements, since those are what questions ask about.
$ .\.venv\Scripts\python.exe bench\benchmark.py
sample before after savings verify Thai prose 522 247 52.7% OK Thai prose (aggressive) 522 189 63.8% OK English prose 105 60 42.9% OK JSON (lossless) 67 44 34.3% OK Logs 563 300 46.7% OK TOTAL 1779 840 52.8% ALL OK → 100% recoverable
Mode comparison (Thai prose, 522 tok): extractive 52.7% (1ms) · semantic 63.8% (2.1s) · auto 63.8% (2.1s) abstractive 44.4% (8.3s) · pipeline 78.2% (5.8s) ← gemma4:12b
Token counts via tiktoken cl100k_base. That is OpenAI's tokenizer and undercounts Claude, most of all on Thai; bench\benchmark.py --claude adds a column from Claude's own tokenizer (Anthropic count_tokens, needs an API key).
Fewer tokens only help if the facts survive. bench\eval_qa.py compresses 8 Thai documents (incident report, meeting notes, API docs, HR policy, product spec, support chat, README, sales report; half line-per-sentence, half dense paragraphs) and asks Claude Opus 5.5 32 questions from the compressed view alone, graded deterministically:
$ .\.venv\Scripts\python.exe bench\eval_qa.py # uses your local `claude` login
mode claude tok saved correct abstain wrong ────────────────────────────────────────────────────────────── original 4601 0.0% 100% 0% 0 extractive:0.5 3204 30.4% 69% 31% 0 extractive:0.3 1969 57.2% 44% 56% 0 semantic:0.5 3214 30.1% 62% 38% 0 extractive:0.5+q 3207 30.3% 100% 0% 0 abstractive:0.5 2697 41.6% 91% 9% 0 ← gemma4:12b pipeline:0.5 1854 59.8% 59% 41% 0 ← gemma4:12b
(gemma4:e4b scored the same: abstractive 91%, pipeline 59%, wrong 0.)
sarup_retrieve. It did not guess from what was left.0.5. Know what you're looking for? Pass it as query (+q row).sarup_compress, not the hook.sarup_retrieve away.[sarup: …] footer, which weighs heavily on these short (~570-token) documents and fades on the large outputs the hook actually compresses.Before the fixes this eval drove (Oct 2026): dense Thai paragraphs were not compressed at all (the sentence splitter's model wasn't installed), extractive:0.5 answered 59% with one confident wrong answer, and semantic:0.5 47%.
A real sarup_compress call on a Thai paragraph (mode="auto", Ollama up → semantic):
// → sarup_compress(content="…518-token Thai paragraph…", mode="auto")
{ "compressed": "จุดเด่นที่สำคัญที่สุดคือมันไม่มีทางทำให้ Claude พัง…", "hash": "caa568140bec0ff734937cf5", "original_tokens": 518, "compressed_tokens": 154, "tokens_saved": 364, "savings_percent": 70.3, "transforms": ["semantic
冒頭だけを表示しています。続きはリポジトリで読めます