Discourse-zu-Markdown-Plugin

discourse-to-markdown ist ein neues Plugin, das Forum-Inhalte als Markdown zurückgibt, wenn der Client Accept: text/markdown sendet oder .md an jede Inhalts-URL anhängt.

Wir nutzen es auf unserem eigenen Forum unter https://discourse.roots.io:

curl -H "Accept: text/markdown" https://discourse.roots.io/latest
curl https://discourse.roots.io/t/serve-your-wordpress-posts-as-markdown/30321.md

HTML ist teuer für die Verarbeitung durch ein LLM, und die Bereitstellung von Markdown, das nur den Inhalt enthält, reduziert den Token-Verbrauch oft um das 3- bis 5-fache. Das bedeutet günstigere API-Aufrufe, schnellere Antworten und mehr Spielraum im Kontextfenster, damit das Modell besser reasoning betreiben kann. Weitere Informationen, einschließlich eines längeren Pitchs und eines Ready-Checks für jede Seite, finden Sie unter https://acceptmarkdown.com.

Wie Clients Markdown anfordern

Drei Einstiegspunkte:

  1. Header Accept: text/markdown (ideal für LLMs)
  2. .md-URL-Suffix
  3. Entdeckung (jede HTML-Antwort wirbt über Link: <...>; rel="alternate"; type="text/markdown" und ein <link rel="alternate">-Tag im <head> um ihr Markdown-Geschwister; RSS-Feeds enthalten einen <atom:link>, der auf die Markdown-Variante verweist)

Unterstützte Routen

Route HTML Markdown
Thema /t/:slug/:id /t/:slug/:id.md
Einzelner Beitrag /t/:slug/:id/:post_number /t/:slug/:id/:post_number.md
Kategorie /c/:slug/:id /c/:slug/:id.md
Tag /tag/:tag /tag/:tag.md
Neueste /latest /latest.md
Top /top /top.md
Heiß /hot /hot.md
Benutzeraktivität /u/:username/activity /u/:username/activity.md

Installation

Fügen Sie das Plugin zu Ihrer app.yml hinzu:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/roots/discourse-to-markdown.git

Stellen Sie den Container neu her:

cd /var/discourse
./launcher rebuild app

Aktivieren Sie es dann unter Admin → Einstellungen → Plugins → Markdown-Ausgabe.

Hinweise zur Konvertierung

Das Plugin konvertiert Discourses cooked-HTML – die gerenderte Darstellung, die Leser sehen, mit expandierten Oneboxes, verlinkten Erwähnungen und zugeordneten Zitaten – nicht raw. Dies bewahrt, was Leser tatsächlich sehen, und hält die Ausgabe portabel für jeden GFM-kompatiblen Renderer. Discourse-spezifische Konstrukte (Zitate, Oneboxes, Details, Erwähnungen, Hashtags, Emojis, Lightboxen, Umfragen) werden vor der Konvertierung sinnvoll umgeschrieben.

Konvertiertes Markdown wird in Redis pro Beitrag zwischengespeichert, wobei post.id + post.updated_at als Schlüssel dienen; Änderungen werden automatisch ungültig gemacht.

Einstellungen

Einstellung Standard Zweck
discourse_to_markdown_enabled false Hauptschalter für das Plugin
discourse_to_markdown_md_urls_enabled true Akzeptiert .md-URL-Suffixe als Geschwister zur HTML-Route
discourse_to_markdown_strict_accept false Gibt 406 Not Acceptable zurück, wenn der Accept-Header des Clients sowohl text/html als auch text/markdown ausschließt
discourse_to_markdown_emit_vary true Sendet Vary: Accept bei Markdown- und 406-Antworten, damit Caches keine Darstellungen kreuzweise ausliefern
discourse_to_markdown_include_post_metadata true Fügt URL, Kategorie, Tags, Autor und Zeitstempel in die Markdown-Darstellung ein

Ressourcen

10 „Gefällt mir“

Das ist großartig, danke für die Veröffentlichung!

Das ist ebenfalls ein ziemlich cooler Ansatz. Es liefert ein reichhaltigeres Markdown als die Rohausgabe, da es von Discourses cooking-Infrastruktur profitiert.

2 „Gefällt mir“

OMG, genau das habe ich gesucht, super Timing! Wir nutzen die API oder MCP häufig, und es hat uns immer genervt, dass die Rohinhalte keine aufgelösten Bild-URLs enthalten.

Danke für die Arbeit!

Edit: Könnte das irgendwie auch mit Discourse MCP verwendet werden?

1 „Gefällt mir“

Freut mich, dass es nützlich ist!

Discourse MCP könnte Inhaltsverhandlung als optionalen Pfad hinzufügen. Es müsste nicht zwingend dieses Plugin voraussetzen; es könnte Accept: text/markdown von der kanonischen Themen-/Beitrags-URL anfordern und im Fall, dass die Seite Markdown nicht unterstützt, auf das aktuelle JSON-API-Verhalten zurückfallen.

Dieses Plugin ist nur eine Möglichkeit, wie eine Discourse-Seite diese Anforderung heute erfüllen kann. Ohne dieses Plugin oder eine entsprechende Unterstützung im Discourse-Kern würde allein der Accept-Header die JSON-API-Ausgabe nicht ändern.

Die ideale MCP-Integration könnte also sein: Versuche zuerst text/markdown an der Inhalts-URL, und falle dann auf /t/:id.json?include_raw=true zurück.

1 „Gefällt mir“

Es ist lustig, dass du das sagst, denn Claude hat es genau so gelöst…