hatena-blog-mcp
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}/atomUmgebungsvariable | Erforderlich | Wert |
| ○ | はてなID des für die Authentifizierung verwendeten Kontos (Inhaber des API-Schlüssels) |
| ○ | Der |
| ○ | API-Schlüssel |
| Der |
Bei einem eigenen Blog sind Inhaber und Bearbeiter identisch, daher ist
HATENA_BLOG_OWNER_IDnicht erforderlich.Bei einem gemeinsamen Blog (z. B. Firmen-Technikblog) unterscheiden sich Inhaber und Bearbeiter. In diesem Fall gib für
HATENA_BLOG_OWNER_IDdie ID des Blog-Inhabers und fürHATENA_IDdein eigenes Konto an.Auch wenn du im kostenpflichtigen Plan eine eigene Domain verwendest, gib für
HATENA_BLOG_IDdie 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.jsMit -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 |
| Ruft Blogtitel und verfügbare Collections ab (auch zur Verbindungsprüfung nutzbar) |
| Liste der im Blog verwendeten Kategorien |
Artikel
Tool | Beschreibung |
| Listet Artikel, neueste zuerst (einschließlich Entwürfe). Mit |
| Blättert durch Seiten und sucht per Teilstring-Übereinstimmung in Titel, Text und Kategorien |
| Ruft einen einzelnen Artikel ab (Text bleibt in der registrierten Schreibweise) |
| Erstellt einen neuen Artikel (standardmäßig als Entwurf) |
| 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
updatedweggelassen, 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}/atomAuthentifizierung: はてな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.
This server cannot be installed
Maintenance
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
Create, manage, publish, and analyze Inblog content through AI agents.
Travel tools for AI agents: plan and edit real trips, search stays and tours, import travel videos.
Create, edit, organize, publish, and configure JustBlogged blogs from MCP clients.
SEO & marketing toolkit for AI agents: GA4, Search Console, AdSense, GTM, PageSpeed, Trends.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables searching and retrieving articles from Hatena Blog through Claude Desktop/Web. Supports keyword search, fetching recent posts, and retrieving post details by URL.1-
- AlicenseAqualityDmaintenanceEnables 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.1017MIT
- FlicenseAqualityDmaintenanceEnables 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.121-
- AlicenseNot gradedqualityCmaintenanceEnables AI models to interact with Google Blogger blogs, manage posts, labels, and retrieve blog information via API key or OAuth2.19MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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