AI + Glyphs MCP v1.0.8 — looking for testers + new macOS installer app (signed & notarized)

Hi everyone,

I just published Glyphs MCP v1.0.8 and I’d love a few testers from the community to try it and report back (especially across different macOS + Glyphs 3 + Python setups).

What is Glyphs MCP?
It’s a Model Context Protocol (MCP) server for Glyphs that exposes font- and glyph-level operations as tools for AI/LLM agents (kerning, spacing review, glyph inspection/edits, etc.).

New in this release: a macOS Installer app (recommended)
To make setup easier, there’s now a signed + notarized macOS installer app (drag‑and‑drop DMG) that guides you through:

  • installing/updating Glyphs MCP.glyphsPlugin into ~/Library/Application Support/Glyphs 3/Plugins/
  • installing Python deps (Glyphs Python or a custom Python)
  • optionally configuring MCP clients (Codex, Claude Desktop, Claude Code, Antigravity)

Download:

  • Installer (DMG): https://github.com/thierryc/Glyphs-mcp/releases/download/v1.0.8/GlyphsMCPInstaller-1.0.8.dmg
  • Latest release page: https://github.com/thierryc/Glyphs-mcp/releases/latest

A big ask: please help test the installer
Testing an installer thoroughly is genuinely hard as a solo developer—I can’t realistically cover every macOS/Glyphs/Python combination, upgrade path, permissions edge case, or corporate/locked-down machine scenario on my own. Even small feedback (“worked great on my setup” or “I hit this one dialog/error”) is valuable: it helps me fix issues faster and also helps other users by documenting what works (and what doesn’t) on real-world setups.

What I’m looking to test

  • macOS 13/14/15 (and Apple Silicon vs Intel if possible)
  • Glyphs 3.x
  • Python via Glyphs Python plugin vs python.org installs (3.11–3.13)
  • First install vs upgrade from an older version
  • Any Gatekeeper / permissions / “couldn’t load plugin” issues

If you try it, please reply with:

  • macOS version, Glyphs version, CPU (Intel/Apple Silicon)
  • Python source/version
  • Whether you used the installer app or manual install
  • Any logs/errors (screenshot is fine)

Thanks in advance—feedback will directly shape the next release.

2 Likes

Can you publish a Chinese version?

Or, give a localized glossary.

and, a user manual.

Yes — a Chinese version is possible. I believe it should already support Chinese, but I haven’t tested it yet. I’ll run a proper test soon.
Would you be available for a short chat (in English) or by email so we can coordinate the localized glossary and a small user manual?

@wstytdzj

1 Like

Bootstrap Prompt and Claude AI update.

Hi everyone — I’m improving the default “bootstrap prompt” used by my MCP setup (the short instructions the LLM reads first, e.g. AGENTS.md). The goal is to make tool usage more reliable and reduce “LLM guessing”.

If you use this kind of workflow with Glyphs (or would like to), I’d love your input:

What I’m looking for

  • Use cases: 1–3 concrete things you’d want an AI + tools to do in Glyphs(ex: generate missing kerning pairs, spacing checks, stems/metrics adjustments, batch fixes, reporting, etc.)
  • Prompt suggestions: what should be explicitly stated so the LLM doesn’t do stupid stuff?
  • Failure modes you’ve seen: where do assistants usually misunderstand the task?

If you can, include

  • goal + steps
  • which data/files it should read
  • what the output should look like (report, diff, list of actions, etc.)

Thanks — I’ll use the best ideas to improve the default prompt and share the updated version back.

Now it is simpler to use it also in the default Claude app.

Thank you.

ygbimdpgyx@icloud.com

1 Like

If you can provide me with all the text used in the user interface of this software, I can try to translate it into Chinese for you.

1 Like

Thanks! :folded_hands: @wstytdzj

I’m currently adding a proper translation/localization layer in the UI. As soon as it’s ready, I’ll extract all the UI strings and email them to you so you can translate them into Chinese.

For the documentation, I’ll try to produce a first Chinese version with an LLM, and if you can review/correct it afterward, that would be amazing.

Thanks again in advance — really appreciate your help!

— Thierry

1 Like

@wstytdzj

Just a quick question about the install: which option did you use — the Python script or the macOS plugin installer?

Did everything go smoothly on your side (no issues / no crash)?

Also, thanks — I’ll add these installation messages to the translation layer as well.

macOS plug-in. I’m still working on how to use it. No problem with installation.macOS plug-in. I’m still working on how to use it. No problem with installation.

If you’re using Claude, it’s pretty easy (Claude Code and Codex work well too).

First, launch it from Glyphs via Edit → … (start the MCP server). Then you can ask the assistant whatever you want.

A good first prompt to verify everything is connected:

Using the Glyphs MCP server, list the open fonts.

After that, you can keep going with almost any request — the LLM has the MCP server available as a tool in its context.

If there’s interest, I can host a short Zoom / Google Meet workshop.

I have created a branch and an issue for translation. @wstytdzj

I have added the French, as I can do it on my side and control it.

There is the text of the plugin UI:


STRINGS = {
    # Menu
    "menu.start": {
        "en": "Start Glyphs MCP Server",
        "de": "Glyphs MCP-Server starten",
        "fr": "Démarrer le serveur MCP",
        "es": "Iniciar el servidor MCP",
        "pt": "Iniciar o servidor Glyphs MCP",
        "zh-Hans": "启动 Glyphs MCP 服务器",
    },
    "menu.running": {
        "en": "Glyphs MCP Server is running",
        "de": "Glyphs MCP-Server läuft",
        "fr": "Le serveur MCP est en cours d'exécution",
        "es": "El servidor MCP está en ejecución",
        "pt": "O servidor MCP está em execução",
        "zh-Hans": "Glyphs MCP 服务器正在运行",
    },
    "menu.status": {
        "en": "Glyphs MCP Server Status…",
        "de": "Glyphs MCP-Server-Status…",
        "fr": "Statut du serveur MCP…",
        "es": "Estado del servidor MCP…",
        "pt": "Status do servidor MCP…",
        "zh-Hans": "Glyphs MCP 服务器状态…",
    },
    "menu.autostart": {
        "en": "Auto-start server on launch",
        "de": "Server beim Start automatisch starten",
        "fr": "Démarrer le serveur au lancement",
        "es": "Iniciar el servidor al abrir",
        "pt": "Iniciar o servidor ao abrir",
        "zh-Hans": "启动时自动启动服务器",
    },
    # Common
    "app.title": {
        "en": "Glyphs MCP Server",
        "fr": "Serveur Glyphs MCP",
        "zh-Hans": "Glyphs MCP 服务器",
    },
    "common.ok": {"en": "OK", "fr": "OK", "zh-Hans": "好"},
    "common.cancel": {"en": "Cancel", "fr": "Annuler", "zh-Hans": "取消"},
    "common.copy": {"en": "Copy", "fr": "Copier", "zh-Hans": "复制"},
    # Port busy prompt
    "portbusy.message": {
        "en": (
            'I can\'t start the MCP server on "{port}".\n\n'
            "Wait (preferred) until the previous instance has finished shutting down, "
            "or start on a custom port below."
        ),
        "fr": (
            'Impossible de démarrer le serveur MCP sur « {port} ».\n\n'
            "Attendez (recommandé) que l’instance précédente se ferme complètement, "
            "ou choisissez un port personnalisé ci-dessous."
        ),
        "zh-Hans": (
            "无法在“{port}”上启动 MCP 服务器。\n\n"
            "请等待(推荐)之前的实例完全关闭,或在下方选择自定义端口。"
        ),
    },
    "portbusy.wait": {
        "en": "Wait (preferred)",
        "fr": "Attendre (recommandé)",
        "zh-Hans": "等待(推荐)",
    },
    "portbusy.custom": {
        "en": "Start on Custom Port",
        "fr": "Démarrer sur un port personnalisé",
        "zh-Hans": "使用自定义端口启动",
    },
    "portbusy.placeholder": {
        "en": "Custom port (1–65535)",
        "fr": "Port personnalisé (1–65535)",
        "zh-Hans": "自定义端口(1–65535)",
    },
    "portbusy.invalid": {
        "en": "Enter a valid port number (1–65535).",
        "fr": "Saisissez un numéro de port valide (1–65535).",
        "zh-Hans": "请输入有效的端口号(1–65535)。",
    },
    "portbusy.range": {
        "en": "Port must be between 1 and 65535.",
        "fr": "Le port doit être compris entre 1 et 65535.",
        "zh-Hans": "端口必须在 1 到 65535 之间。",
    },
    "portbusy.inuse": {
        "en": "Port {port} is already in use. Choose another port.",
        "fr": "Le port {port} est déjà utilisé. Choisissez un autre port.",
        "zh-Hans": "端口 {port} 已被占用。请选择另一个端口。",
    },
    # Waiting panel
    "wait.info": {
        "en": "Waiting for port {port} to become available…\nThis usually takes a few seconds.",
        "fr": "En attente que le port {port} devienne disponible…\nCela prend généralement quelques secondes.",
        "zh-Hans": "正在等待端口 {port} 变为可用…\n这通常只需要几秒钟。",
    },
    # Status panel labels/buttons
    "status.label": {"en": "Status:", "fr": "État :", "zh-Hans": "状态:"},
    "version.label": {"en": "Version:", "fr": "Version :", "zh-Hans": "版本:"},
    "endpoint.label": {"en": "Endpoint:", "fr": "Endpoint :", "zh-Hans": "端点:"},
    "docs.label": {"en": "Docs:", "fr": "Docs :", "zh-Hans": "文档:"},
    "profile.label": {"en": "Profile:", "fr": "Profil :", "zh-Hans": "配置:"},
    "debug.checkbox": {
        "en": "Log all events (debug, includes SSE)",
        "fr": "Journaliser tous les événements (debug, inclut SSE)",
        "zh-Hans": "记录所有事件(调试,包含 SSE)",
    },
    "docs.open": {"en": "Open Docs", "fr": "Ouvrir la doc", "zh-Hans": "打开文档"},
    "endpoint.copy": {"en": "Copy Endpoint", "fr": "Copier l’endpoint", "zh-Hans": "复制端点"},
    # Status values
    "status.running": {"en": "Running", "fr": "En cours", "zh-Hans": "运行中"},
    "status.stopped": {"en": "Stopped", "fr": "Arrêté", "zh-Hans": "已停止"},
    "status.waiting": {
        "en": "Waiting for port {port}…",
        "fr": "En attente du port {port}…",
        "zh-Hans": "正在等待端口 {port}…",
    },
    "status.autostart_waiting": {
        "en": "Auto-start waiting for port {port}…",
        "fr": "Démarrage auto : attente du port {port}…",
        "zh-Hans": "自动启动:正在等待端口 {port}…",
    },
    # Errors
    "error.open_status_window": {
        "en": "Unable to open MCP status window: {error}",
        "fr": "Impossible d’ouvrir la fenêtre d’état MCP : {error}",
        "zh-Hans": "无法打开 MCP 状态窗口:{error}",
    },
    "error.open_docs": {
        "en": "Unable to open docs URL:\n{url}\n\n{error}",
        "fr": "Impossible d’ouvrir l’URL de la doc :\n{url}\n\n{error}",
        "zh-Hans": "无法打开文档链接:\n{url}\n\n{error}",
    },
    "error.start_server": {
        "en": "Failed to start server: {error}",
        "fr": "Échec du démarrage du serveur : {error}",
        "zh-Hans": "启动服务器失败:{error}",
    },
}



These texts:

1 Like

Hi, @wstytdzj

Can you tell me if the Chinese text makes sense and sounds natural? I’d like to know whether it is clear and easy for Chinese speakers to understand.

Thanks!

I’m not sure. I need your more detailed explanation. You’d better give me all the text content in the interface and the explanation.

If there is a user manual, the translation would be more accurate.

There is the documentation for the MCP server itself:

Work in progress.

I need to spend a few days studying.

1 Like