博客发布助手

一个将Notion文章整理后自动发布到GitHub Pages的服务,支持多种文章类型模板。

  • by SuInWoo
  • HTML
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 SuInWoo/Mcp-Blog-Assistant

使用说明

MCP博客助手

MCP服务器,将在节点上整理的文章进行第一次整理(AI/规则)后,应用特定类型的模板自动发布到**Github Pages(github.io)**。

后类型

  • 玩具项目 (玩具)
  • 算法 (什么)
  • CS学习 (cs)
  • 日常 (每日)

节点数据库的 Type 在Select属性中 toy, algo, cs, daily 如果指定其中一个,则应用该模板。

YAML/设置环境变量

application.yaml在中定义了以下项目:敏感值为 环境变量建议将其放入。

概念

键 环境变量 说明
notion.secret NOTION_SECRET 节点联动保密(必需)
notion.database-id.blog NOTION_DATABASE_ID_BLOG 博客的节点DB ID(可选)

节点关联令牌: 概念开发者在中创建Integration后复制秘密。必须将该集成连接到页面/DB。

GitHub页面(GitHub.io)

键 环境变量 说明
github-pages.repo GITHUB_PAGES_REPO 存储库 owner/repo (例如: myname/myname.github.io)
github-pages.branch GITHUB_PAGES_BRANCH 要推送的分支(默认 main)
github-pages.token GITHUB_PAGES_TOKEN GitHub Personal Access Token(repo权限)
github-pages.posts-path GITHUB_PAGES_POSTS_PATH Jekyll文章路径(默认) _posts)

存储库 杰基尔 标准。标记将提交到各类型的子文件夹: _posts/Daily/, _posts/CS/, _posts/Algorithm/, _posts/Project/ (各 YYYY-MM-DD-슬러그.md).GitHub存储库必须具有相应的文件夹结构。

Blog通用

键 环境变量 说明
blog.dry-run BLOG_DRY_RUN true面不实际发布,只生成内容

在本地打开服务器并进行测试

1.需要的东西

  • 注意:Integration秘密+博客的一个页面(需要页面ID)
  • 只看Preview的时候:只需要上面(不发布)
  • 实际GitHub发布: GITHUB_PAGES_REPO, GITHUB_PAGES_TOKEN 添加

2.设置

application.yaml如果已经有Enocean的秘密,可以保留。要用环境变量覆盖:

export NOTION_SECRET=ntn_xxxx   # 노션 Integration 시크릿
# GitHub 실제 발행할 때만
export GITHUB_PAGES_REPO=your-username/your-username.github.io
export GITHUB_PAGES_TOKEN=ghp_xxxx

3.运行服务器

./gradlew bootRun

默认端口 8080。控制台中 Started McpBlogAssistantApplication 出来的话就准备好了

4.方便使用的方法

  • Web表单:服务器启动后,在浏览器中 http://localhost:8080/publish.html 连接。输入页面ID后,只需单击“预览”/“发布GitHub”按钮即可。(无需单独前台开发即可使用)
  • 在节点中:复制要发布的页面URL,只复制地址窗口中的页面ID部分并粘贴到上面的表单中。节点本身没有“通过按钮调用API”功能,因此可以通过链接 http://localhost:8080/publish.html?pageId=복사한ID 像这样挂着,点击打开使用,使用起来很方便。
  • 在Cursor中:如果在服务器漂浮的情况下通过聊天说:“请用页面ID 30a5977fe8e480259b8bc9475aceccca发布GitHub。” curl可以通过调用publish API。

5.用作Cursor MCP(连接到工具)

只要在聊天中说“请发布xxx页面ID”,AI就会 MCP工具要通过调用发布,请使用此存储库中包含的 MCP适配器注册到Cursor即可。

条件

  • Spring Boot API服务器首先运行必须为(./gradlew bootRun).MCP适配器只通过HTTP调用该API,而不代表服务器。

设置过程

  1. 构建MCP适配器(第一次):
    cd mcp-server && npm install && npm run build && cd ..
    
  2. 在项目中 .cursor/mcp.json已存在。在使用此项目打开Cursor的情况下 Cursor设置>Features>MCP在 blog-assistant 验证服务器是否已打开。(如果使用项目MCP设置,则可能会自动加载。)
  3. 更改API base URL的步骤 .cursor/mcp.json的 env.BLOG_API_URL修改。默认值为 http://localhost:8080是。

使用示例

  • “请预览诺森页面ID 30a5977fe8e480259b8bc9475aceccca”→AI notion_blog_preview 调用工具。
  • “请用页面ID 30a5977fe8e480259b8bc9475aceccca发行GitHub”→AI notion_blog_publish 调用工具。

MCP适配器 mcp-server/ 目录中的Node.js项目,仅在Cursor启动到stdio后调用工具时 http://localhost:8080/mcp/notion-to-blog/... 调用。

6.使用API进行测试(curl)

节点页面ID从节点URL复制:

  • 示例: https://www.notion.so/My-Page-abc123def456... → abc123def456... (有连字符或无连字符都可以)

Preview(无需发布,只查看结果)

curl -s -X POST http://localhost:8080/mcp/notion-to-blog/preview \
  -H "Content-Type: application/json" \
  -d '{"pageId": "여기에_노션_페이지_ID"}' | jq .

title, content(HTML), postType 出来就正常。

Publish-dry run(无实际推送,仅查看内容)

curl -s -X POST http://localhost:8080/mcp/notion-to-blog/publish \
  -H "Content-Type: application/json" \
  -d '{"pageId": "여기에_노션_페이지_ID", "dryRun": true, "publishTarget": "github"}' | jq .

Publish-发布真正的GitHub Pages

GITHUB_PAGES_REPO, GITHUB_PAGES_TOKEN 设置后:

curl -s -X POST http://localhost:8080/mcp/notion-to-blog/publish \
  -H "Content-Type: application/json" \
  -d '{"pageId": "여기에_노션_페이지_ID", "dryRun": false, "publishTarget": "github"}' | jq .

响应 url(例如: https://username.github.io/repo/2025-02-18-slug/)出版后发行的。

jq 没有 | jq . 可以减去执行。在Windows上,可以通过PowerShell或Postman调用相同的URL和body。

提交消息

推送到GitHub时,提交消息 Post: {글 제목} 以格式输入。在NoteDB中,即使标题属性名称不是“Title”,类型为 title找到in属性并添加标题。

MCP REST API摘要

  • 预览 (不发布,仅生成HTML)
    POST /mcp/notion-to-blog/preview
    Content-Type: application/json
    { "pageId": "노션_페이지_ID" }
    
  • 发布 (整理后发布GitHub Pages或Tistory, dryRun: true跳过小平面卷期)
    POST /mcp/notion-to-blog/publish
    Content-Type: application/json
    { "pageId": "노션_페이지_ID", "dryRun": false, "publishTarget": "github" }
    
    • publishTarget: "github" (仅当前支持)

节点页面ID是URL的一部分(无论是否删除连字符)。

测试

./gradlew test

假设节点DB模式

  • 标题 (title类型):文章标题
  • 类型 (选择): toy | algo | cs | daily

正文获取该页面的块并将其转换为Markdown格式。