Skip to main content
Glama
sumiVer2
by sumiVer2

hatena-blog-mcp

Servidor MCP para crear y actualizar artículos de Hatena Blog. Envuelve de forma ligera la API AtomPub de Hatena Blog y permite que los agentes de IA gestionen el borrador, la revisión y la publicación de artículos.

Configuración

El gestor de paquetes es pnpm (fijado en el campo packageManager).

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

Obtención de los valores de configuración

En [Configuración] > [Configuración avanzada] > [AtomPub] de Hatena Blog se muestran el «punto final raíz» y la «clave de API». El punto final raíz tiene el siguiente formato.

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

Variable de entorno

Obligatoria

Valor

HATENA_ID

ID de Hatena de la cuenta utilizada para la autenticación (titular de la clave de API)

HATENA_BLOG_ID

Parte {ID del blog} del punto final raíz (ej.: tech.example.hatenablog.com)

HATENA_API_KEY

Clave de API

HATENA_BLOG_OWNER_ID

Parte {ID de Hatena del propietario del blog} del punto final raíz. Si se omite, se usa HATENA_ID

  • Si el blog es propio, el propietario y el operador son la misma persona, por lo que HATENA_BLOG_OWNER_ID no es necesario.

  • En blogs compartidos (como el blog técnico de una empresa), el propietario y el operador son distintos. En ese caso, especifica el ID del propietario del blog en HATENA_BLOG_OWNER_ID y tu propia cuenta en HATENA_ID.

  • Si se usa un dominio propio con un plan de pago, en HATENA_BLOG_ID se debe especificar el dominio anterior a la configuración del dominio propio.

Consulta .env.example.

Registro en el cliente MCP

En el caso de 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

Con -s user estará disponible en todos los proyectos. No uses -s project (la clave de API se escribirá en .mcp.json).

Si se escribe directamente en el archivo de configuración:

{
  "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"
      }
    }
  }
}

Una vez registrado, llamar a get_blog_info sirve para comprobar la conexión.

Related MCP server: Blogger MCP Server

Herramientas

Blog completo

Herramienta

Descripción

get_blog_info

Obtiene el título del blog y las colecciones disponibles (también sirve para comprobar la conexión)

list_categories

Lista de categorías utilizadas en el blog

Artículos

Herramienta

Descripción

list_entries

Lista los artículos del más reciente al más antiguo (incluye borradores). Con next_page se obtiene la continuación

search_entries

Recorre las páginas y busca coincidencias parciales en título, cuerpo y categorías

get_entry

Obtiene un artículo (el cuerpo se devuelve en la notación registrada)

create_entry

Crea un artículo nuevo (por defecto, como borrador)

update_entry

Actualiza un artículo de forma diferencial

Páginas fijas

list_pages / search_pages / get_page / create_page / update_page están disponibles con la misma forma que los artículos. Las páginas fijas solo están disponibles en los planes de pago de Hatena Blog (en el plan gratuito se devuelve 404). Las páginas fijas no tienen categorías, por lo que no existe el parámetro categories.

Decisiones de diseño

No se implementa la eliminación

La eliminación (DELETE) de artículos y páginas fijas existe en la API, pero deliberadamente no se expone como herramienta. El impacto de un error de operación es grande y no se puede deshacer. La eliminación se realiza desde el navegador.

update_entry es una actualización diferencial

Como el PUT de AtomPub «reemplaza todo con el contenido enviado», incluso si solo se quiere corregir el título, es necesario volver a enviar el cuerpo, las categorías y la fecha de publicación. Este servidor, dentro de update_entry, hace GET y luego reemplaza solo los elementos especificados antes de hacer PUT.

  • Los elementos omitidos conservan su valor actual.

  • Si se omite updated, la fecha de publicación del artículo (la fecha mostrada) no cambia.

  • Si se pasan categories, se produce un reemplazo (no una adición). Si se quieren conservar las categorías existentes, hay que incluirlas también.

La creación nueva es un borrador por defecto

El draft de create_entry es true por defecto. Para evitar que un artículo se publique de repente por una operación del agente, la publicación solo se realiza cuando se especifica explícitamente draft: false.

Notación del cuerpo

En content_type se puede especificar text/x-markdown / text/x-hatena-syntax / text/html / text/plain (por defecto, text/x-markdown). Sin embargo, cómo se interpreta realmente depende del ajuste de «modo de edición» del blog, por lo que hay que escribir de acuerdo con la configuración del blog. Al actualizar un artículo existente, se conserva la notación anterior a la edición.

Publicación programada

En create_entry, especifica draft: true + scheduled: true + un updated con fecha y hora futuras.

Paginación de las listas

La API de Hatena Blog devuelve pocos elementos por página, y el número lo decide la API (la documentación oficial indica 7 artículos, pero se ha confirmado que en realidad devuelve 10). list_entries devuelve una página y, pasando next_page al parámetro page de la siguiente llamada, se obtiene la continuación. Para buscar en conjunto, usa search_entries, que recorre las páginas internamente. max_pages controla la cantidad de recorrido.

Autenticación e ID de Hatena en la URL

Se usa autenticación WSSE (cabecera X-WSSE). En cada petición se generan Nonce y Created, y se envía Base64(SHA1(Nonce + Created + Clave de API)) como PasswordDigest.

Ten en cuenta que el ID de Hatena de la URL del punto final (propietario del blog) y la cuenta que se autentica son cosas distintas. Como la clave de API se emite por cuenta y no por blog, en un blog compartido la combinación es:

  • URL: https://blog.hatena.ne.jp/{ID del propietario}/{ID del blog}/atom

  • Autenticación: ID de Hatena de tu propia cuenta + clave de API

Si se confunden ambos, se obtiene 401 (la clave no es del propietario) o 403 (esa cuenta no tiene permisos sobre el blog). Este servidor separa ambos con HATENA_BLOG_OWNER_ID y HATENA_ID, y si se omiten, se tratan como el mismo ID, por lo que funciona con el mismo método de configuración tanto para blogs propios como compartidos.

Fuera del alcance

  • Subida de imágenes: fuera del alcance de AtomPub (existe la API de Hatena Fotolife por separado)

  • Cambio de diseño de las páginas fijas: no compatible con la API. Se configura desde el navegador

  • Autenticación OAuth: solo se admite la autenticación WSSE mediante clave de API

Desarrollo

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

Como pnpm 10 bloquea por defecto los scripts de compilación de las dependencias, solo se permite esbuild, que usa tsx, mediante pnpm.onlyBuiltDependencies en package.json.

Estructura

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       ツールの共通ヘルパー

Como los artículos y las páginas fijas tienen casi la misma estructura en AtomPub, registerCollectionTools de tools/collection.ts se invoca con dos configuraciones distintas: una para artículos y otra para páginas fijas.

Licencia

MIT License. Consulta LICENSE para más detalles.

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