Skip to main content
Glama
sumiVer2
by sumiVer2

hatena-blog-mcp

MCP-Server zum Erstellen und Aktualisieren von はてなブログ-Artikeln. Er kapselt die はてなブログ AtomPub API leicht und ermöglicht KI-Agenten, Artikel zu entwerfen, zu überarbeiten und zu veröffentlichen.

Einrichtung

Als Paketmanager wird pnpm verwendet (festgelegt über das packageManager-Feld).

pnpm install   # 依存のインストールと同時に prepare で dist がビルドされる

Konfigurationswerte abrufen

Unter [Einstellungen] > [Erweiterte Einstellungen] > [AtomPub] werden der „Root-Endpunkt“ und der „API-Schlüssel“ angezeigt. Der Root-Endpunkt hat die folgende Form:

https://blog.hatena.ne.jp/{ブログ所有者のはてなID}/{ブログID}/atom

Umgebungsvariable

Erforderlich

Wert

HATENA_ID

はてなID des für die Authentifizierung verwendeten Kontos (Inhaber des API-Schlüssels)

HATENA_BLOG_ID

Der {ブログID}-Teil des Root-Endpunkts (z. B. tech.example.hatenablog.com)

HATENA_API_KEY

API-Schlüssel

HATENA_BLOG_OWNER_ID

Der {ブログ所有者のはてなID}-Teil des Root-Endpunkts. Bei Auslassung wird HATENA_ID verwendet

  • Bei einem eigenen Blog sind Inhaber und Bearbeiter identisch, daher ist HATENA_BLOG_OWNER_ID nicht erforderlich.

  • Bei einem gemeinsamen Blog (z. B. Firmen-Technikblog) unterscheiden sich Inhaber und Bearbeiter. In diesem Fall gib für HATENA_BLOG_OWNER_ID die ID des Blog-Inhabers und für HATENA_ID dein eigenes Konto an.

  • Auch wenn du im kostenpflichtigen Plan eine eigene Domain verwendest, gib für HATENA_BLOG_ID die Domain vor der Einrichtung der eigenen Domain an.

Siehe .env.example.

Registrierung beim MCP-Client

Für Claude Code:

# 自分が所有するブログ
claude mcp add hatena-blog -s user \
  -e HATENA_ID=your-hatena-id \
  -e HATENA_BLOG_ID=your-blog.hatenablog.com \
  -e HATENA_API_KEY=your-api-key \
  -- node /absolute/path/to/hatena-blog-mcp/dist/index.js

# 共有ブログ(所有者と操作者が異なる場合は HATENA_BLOG_OWNER_ID を足す)
claude mcp add hatena-blog -s user \
  -e HATENA_ID=your-hatena-id \
  -e HATENA_BLOG_OWNER_ID=blog-owner-id \
  -e HATENA_BLOG_ID=blog-owner-id.hatenablog.com \
  -e HATENA_API_KEY=your-api-key \
  -- node /absolute/path/to/hatena-blog-mcp/dist/index.js

Mit -s user ist es in allen Projekten verfügbar. -s project nicht verwenden (der API-Schlüssel würde sonst in .mcp.json geschrieben).

Wenn du direkt in die Konfigurationsdatei schreibst:

{
  "mcpServers": {
    "hatena-blog": {
      "command": "node",
      "args": ["/absolute/path/to/tech-blog/dist/index.js"],
      "env": {
        "HATENA_ID": "your-hatena-id",
        "HATENA_BLOG_OWNER_ID": "blog-owner-id",
        "HATENA_BLOG_ID": "blog-owner-id.hatenablog.com",
        "HATENA_API_KEY": "your-api-key"
      }
    }
  }
}

Sobald die Registrierung abgeschlossen ist, kannst du get_blog_info aufrufen, um die Verbindung zu prüfen.

Related MCP server: Blogger MCP Server

Tools

Gesamtes Blog

Tool

Beschreibung

get_blog_info

Ruft Blogtitel und verfügbare Collections ab (auch zur Verbindungsprüfung nutzbar)

list_categories

Liste der im Blog verwendeten Kategorien

Artikel

Tool

Beschreibung

list_entries

Listet Artikel, neueste zuerst (einschließlich Entwürfe). Mit next_page werden weitere abgerufen

search_entries

Blättert durch Seiten und sucht per Teilstring-Übereinstimmung in Titel, Text und Kategorien

get_entry

Ruft einen einzelnen Artikel ab (Text bleibt in der registrierten Schreibweise)

create_entry

Erstellt einen neuen Artikel (standardmäßig als Entwurf)

update_entry

Aktualisiert einen Artikel per Differenz-Update

Feste Seiten

list_pages / search_pages / get_page / create_page / update_page sind in derselben Form wie bei den Artikeln vorhanden. Feste Seiten sind nur im kostenpflichtigen Plan von はてなブログ verfügbar (im kostenlosen Plan wird 404 zurückgegeben). Da feste Seiten keine Kategorien haben, gibt es keinen categories-Parameter.

Design-Entscheidungen

Löschen ist nicht implementiert

Das Löschen von Artikeln und festen Seiten (DELETE) ist zwar in der API vorhanden, wird aber bewusst nicht als Tool angeboten. Da die Auswirkungen einer Fehlbedienung groß und nicht rückgängig zu machen sind. Das Löschen erfolgt über den Browser.

update_entry führt ein Differenz-Update durch

Da PUT in AtomPub den gesamten Inhalt durch die gesendeten Daten ersetzt, müssen selbst beim bloßen Korrigieren des Titels Text, Kategorien und Veröffentlichungszeitpunkt erneut gesendet werden. Dieser Server führt in update_entry ein GET aus, ersetzt dann ausschließlich die angegebenen Felder und sendet per PUT.

  • Nicht angegebene Felder behalten ihren aktuellen Wert.

  • Wird updated weggelassen, bleibt der Veröffentlichungszeitpunkt des Artikels (das angezeigte Datum) unverändert.

  • Wird categories übergeben, werden die Kategorien ersetzt (nicht ergänzt). Wenn bestehende Kategorien erhalten bleiben sollen, müssen sie mit übergeben werden.

Neue Artikel sind standardmäßig Entwürfe

Bei create_entry ist draft standardmäßig true. Um zu vermeiden, dass ein Artikel durch eine Agentenaktion sofort veröffentlicht wird, erfolgt die Veröffentlichung nur, wenn explizit draft: false angegeben wird.

Schreibweise des Texts

Für content_type kann text/x-markdown / text/x-hatena-syntax / text/html / text/plain angegeben werden (Standard: text/x-markdown). Allerdings richtet sich die tatsächliche Interpretation nach der Einstellung „Bearbeitungsmodus“ des Blogs, daher muss die Angabe zur Blog-Einstellung passen. Bei der Aktualisierung bestehender Artikel wird die zuvor verwendete Schreibweise übernommen.

Terminierte Veröffentlichung

Bei create_entry werden draft: true, scheduled: true und ein in der Zukunft liegender updated-Zeitpunkt angegeben.

Paginierung von Listen

Die API von はてなブログ liefert nur wenige Einträge pro Seite; die Anzahl wird von der API festgelegt (die offizielle Dokumentation nennt 7 Artikel, aber es wurde bestätigt, dass tatsächlich 10 zurückgegeben werden). list_entries gibt eine Seite zurück. Übergibst du next_page beim nächsten Aufruf an page, erhältst du die weiteren Einträge. Wenn du umfassend suchen möchtest, verwende search_entries, das intern durch die Seiten blättert. Mit max_pages steuerst du den Suchumfang.

Authentifizierung und die はてなID in der URL

Es wird die WSSE-Authentifizierung (X-WSSE-Header) verwendet. Für jede Anfrage werden Nonce und Created erzeugt und Base64(SHA1(Nonce + Created + APIキー)) als PasswordDigest gesendet.

Beachte: Die はてなID in der Endpunkt-URL (Blog-Inhaber) und das authentifizierende Konto sind verschieden. Da der API-Schlüssel pro Konto und nicht pro Blog ausgestellt wird, ergibt sich bei einem gemeinsamen Blog folgende Kombination:

  • URL: https://blog.hatena.ne.jp/{所有者のID}/{ブログID}/atom

  • Authentifizierung: はてなID des eigenen Kontos + API-Schlüssel

Werden die beiden verwechselt, führt das zu 401 (der Schlüssel gehört nicht dem Inhaber) oder 403 (das Konto besitzt keine Berechtigung für das Blog). Dieser Server trennt die beiden über HATENA_BLOG_OWNER_ID und HATENA_ID. Wird HATENA_BLOG_OWNER_ID weggelassen, werden sie als dieselbe ID behandelt. Daher funktioniert dieselbe Konfiguration sowohl für eigene als auch für gemeinsame Blogs.

Außerhalb des Anwendungsbereichs

  • Bild-Upload: außerhalb des AtomPub-Umfangs (dafür gibt es die separate はてなフォトライフ API)

  • Layout-Änderungen an festen Seiten: von der API nicht unterstützt; über den Browser einstellen

  • OAuth-Authentifizierung: Nur die WSSE-Authentifizierung mit API-Schlüssel wird unterstützt

Entwicklung

pnpm run typecheck   # 型チェック
pnpm test            # ユニットテスト(API はモック)
pnpm run build       # dist へビルド
pnpm run dev         # ビルドせずに起動
pnpm run inspect     # MCP Inspector で手動確認

Da pnpm 10 die Build-Skripte von Abhängigkeiten standardmäßig blockiert, wird in den pnpm.onlyBuiltDependencies in der package.json nur esbuild erlaubt, das von tsx verwendet wird.

Aufbau

src/
  index.ts          エントリポイント(stdio トランスポート)
  server.ts         McpServer の組み立て
  config.ts         環境変数の読み込み
  hatena/
    client.ts       AtomPub の HTTP クライアント
    wsse.ts         WSSE 認証ヘッダの生成
    atom.ts         Atom XML のパース・生成
    types.ts        ドメイン型
  tools/
    blog.ts         ブログ全体に対するツール
    collection.ts   記事・固定ページ共通のツール定義
    shared.ts       ツールの共通ヘルパー

Da Artikel und feste Seiten in AtomPub fast dieselbe Struktur haben, wird registerCollectionTools aus tools/collection.ts mit zwei verschiedenen Konfigurationen aufgerufen: eine für Artikel und eine für feste Seiten.

Lizenz

MIT License. Details siehe LICENSE.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables AI assistants to interact with the Google Blogger API v3 to manage blog posts and metadata. It supports the full post lifecycle including creating, updating, publishing, and deleting content through natural language.
    10
    17
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Enables AI clients to manage Hexo blogs by providing tools for article CRUD operations, local previewing, and GitHub Pages deployment. It also supports site configuration access and automated Git backups to streamline the entire blogging workflow.
    12
    1
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI models to interact with Google Blogger blogs, manage posts, labels, and retrieve blog information via API key or OAuth2.
    19
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sumiVer2/hatena-blog-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server