Skip to main content
Glama
FEDOR-help

keyboard-layout-mcp

by FEDOR-help

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_*.

Инструменты

Инструмент

Назначение

server_info

Информация о сервере и раскладках.

list_layouts

Список раскладок: en, ru, de, fr.

convert_layout

Перевод text из from_layout в to_layout.

detect

Определение раскладки текста.

fix

Автоисправление «съехавшей» раскладки.

t9

Подбор слов по цифрам (lang = en | ru | auto).

t9_a2z

Буквы на цифровой клавише.

Все инструменты — 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.