keyboard-layout-mcp
keyboard-layout-mcp
MCP-сервер распознавания и перевода раскладок клавиатуры. Понимает любую из раскладок en (QWERTY), ru (ЙЦУКЕН), de (QWERTZ), fr (AZERTY), исправляет текст, набранный «не в той» раскладке, и вдобавок умеет предиктивный ввод T9 — цифры → слова, как на старом смартфоне.
Возможности
convert — перевод текста между раскладками:
convert("руддщ", "ru", "en")→hello.fix — автоисправление «съехавшей» раскладки:
fix("ghbdtn")→привет.detect — определение раскладки текста с ранжированным списком кандидатов.
t9 — предиктивный ввод:
t9("43556")→hello,t9("564236")→привет.t9_a2z — буквы на цифровой клавише (2-9, 0 = пробел).
Установка
Требуется Python 3.14+ и пакет mcp (pip install "mcp>=2.2").
git clone https://github.com/FEDOR-help/keyboard-layout-mcp.git
cd keyboard-layout-mcp
pip install -r requirements.txt
python server/main.pyПодключение к opencode (opencode.jsonc)
"mcp": {
"keyboard-layout-mcp": {
"type": "local",
"command": ["python", "server/main.py"],
"environment": { "PYTHONUTF8": "1", "PYTHONIOENCODING": "utf-8" }
}
}После перезапуска инструменты доступны как keyboard-layout-mcp_*.
Инструменты
Инструмент | Назначение |
| Информация о сервере и раскладках. |
| Список раскладок: en, ru, de, fr. |
| Перевод |
| Определение раскладки текста. |
| Автоисправление «съехавшей» раскладки. |
| Подбор слов по цифрам ( |
| Буквы на цифровой клавише. |
Все инструменты — read-only, с аннотациями MCP (readOnlyHint,
idempotentHint, openWorldHint).
Модель данных
server/main.py— раскладки (LAYOUTS), частоты букв (FREQ), оценка «естественности» текста (частоты + доля гласных + бонус за длину).server/t9_data.py— цифровые раскладки T9 (T9_EN,T9_RU) и частотные словари (WORDS_EN,WORDS_RU). При импорте строится индексT9_INDEX[lang][код] -> [слова].
Словарь легко расширяется: добавьте слово в конец WORDS_EN / WORDS_RU.
Проверка
import asyncio, sys
sys.path.insert(0, ".")
from server import main
async def run():
res = await main.mcp.call_tool("t9", {"sequence": "43556", "lang": "auto"})
print("".join(c.text or "" for c in res.content if hasattr(c, "text")))
asyncio.run(run())Лицензия
MIT — см. LICENSE.