type
Post
status
Published
date
Apr 28, 2026
slug
codex-skill-notion-publisher-usage-and-implementation
summary
这篇文章记录了 notion-publisher skill 的使用方式、适配过程和实现原理:如何让 Codex 根据文章内容自动推断元数据,并调用 Notion MCP 创建文章页面。
tags
工具
开发
agent
LLM
category
技术分享
icon
🧩
password
🧩
这篇文章记录一个刚刚完成的小工具:notion-publisher skill。它的目标很简单:把“写文章、补元数据、创建 Notion 页面”这套重复流程,沉淀成 Codex 可以直接执行的工作流。

为什么要写这个 skill

平时把文章发布到 Notion 数据库,真正麻烦的往往不是写正文,而是这些边角工作:
  • 找到正确的 Notion 数据库
  • 读取数据库 schema,确认有哪些字段
  • 根据文章内容填写 slugsummarycategorytagsstatus 等属性
  • 选择封面
  • 调用 Notion 工具创建页面
  • 必要时再写入正文或更新页面
这些步骤每次都差不多,但又不能完全硬编码。比如不同数据库字段名、枚举值、模板配置可能不同,所以适合做成一个 skill:让 Codex 在需要发布文章时,按固定流程检查环境、读取 schema、推断字段,再调用 Notion MCP 完成创建。

如何使用 notion-publisher

使用方式很直接。在 Codex 里输入类似下面的话即可触发:
也可以用自然语言描述目标:
或者:
触发后,它会按流程处理:
  1. 检查本地配置文件是否存在。
  1. 检查当前会话是否有 Notion MCP 工具。
  1. 询问或搜索目标 Notion 数据库。
  1. 调用 notion_fetch 读取数据库 schema。
  1. 根据标题和正文推断文章元数据。
  1. 调用 notion_create_pages 创建页面。
  1. 输出创建结果和页面链接。

当前版本的适配点

这次主要修的是从 Claude 插件版迁移到 Codex 环境后的工具适配。
原来的 skill 使用的是 Claude 插件工具名,例如:
但当前 Codex 会话里可用的是 Notion MCP 工具:
所以适配时做了几件事:
  • 把配置路径从 ~/.claude/notion-publisher-config.json 改成 ~/.codex/notion-publisher-config.json
  • 去掉 /plugin install/reload-plugins 这类 Claude 插件命令
  • 去掉旧的 authentication 工具调用说明
  • 把搜索、读取、创建、更新页面全部改成当前 Codex 可用的 Notion MCP 工具
  • 去掉“必须通过 Agent 子代理调用”的旧限制,当前工具可以直接接收结构化参数

实现原理

这个 skill 的核心不是复杂代码,而是一份结构化的执行说明。Codex 加载 skill 时,会先读取 SKILL.md 顶部的元数据:
其中 description 很关键,它决定模型什么时候应该触发这个 skill。比如用户提到发布文章、创建 Notion 文章页、生成 slug、summary、tags 等场景时,就应该使用它。
真正执行时,skill 会把“发布文章”拆成三个层次。

1. 环境层

先确认 Notion MCP 是否可用。当前需要这些工具:
  • mcp__notion__notion_search
  • mcp__notion__notion_fetch
  • mcp__notion__notion_create_pages
  • mcp__notion__notion_update_page
如果这些工具不可用,skill 不应该继续猜测,而是提示用户先配置 Notion MCP。

2. Schema 层

Notion 数据库的字段不能靠记忆写死,所以要先调用 notion_fetch 读取 schema。
比如这次使用的数据库包含:
  • title:文章标题
  • type:Post、Page、Notice 等
  • category:技术分享、知行合一、心情随笔、LLM
  • tags:工具、开发、agent、LLM 等
  • summary:摘要
  • slug:文章路径
  • status:Published、Invisible、Draft
  • date:发布日期
有了 schema,Codex 才能用数据库真实存在的字段和值来创建页面,避免把不存在的标签、分类或字段名写进去。

3. 内容层

拿到标题和正文后,skill 会自动推断:
  • slug:把标题转成英文 kebab-case
  • summary:提炼一到两句摘要
  • category:根据文章主题匹配数据库枚举
  • tags:从已有 tags 里选最相关的几个
  • status:默认草稿,或者按用户明确要求设为发布
  • cover:按文章气质选择 Notion 内置封面
这一步的重点是“只从数据库已有选项里选择”,而不是自由发挥出一个新标签。

这次发布的完整流程

这次实际流程是:
  1. 发现原来的 notion-publisher.md 没有被 Codex 加载,因为 Codex 需要 skill-name/SKILL.md 结构。
  1. 新建 ~/.codex/skills/notion-publisher/SKILL.md
  1. 添加 namedescription frontmatter。
  1. 审查 skill 里引用的工具名。
  1. 把 Claude 插件版工具名替换为 Codex 当前可用的 Notion MCP 工具名。
  1. 搜索 Notion 工作区,找到 OldWang TechTalk 数据库。
  1. 读取数据库 schema。
  1. 根据本文主题生成标题、摘要、slug、分类、标签、封面和正文。
  1. 调用 Notion MCP 创建文章页面。

一个好 skill 应该长什么样

这次也顺手验证了一个经验:skill 最重要的不是写得长,而是边界清楚。
一个可用的 skill 至少应该说明:
  • 什么时候触发
  • 需要哪些工具
  • 输入从哪里来
  • 每一步调用什么工具
  • 工具失败时怎么处理
  • 输出应该是什么
  • 哪些字段不能猜,必须从真实 schema 里读
如果 skill 里混着旧环境的命令、旧工具名、旧路径,它就算能被加载,也会在执行时跑偏。

总结

notion-publisher 的价值在于把一套重复但容易出错的发布流程固定下来。它不只是“帮我写一篇文章”,而是把 Notion 数据库 schema、文章元数据推断、页面创建和正文写入串成一个可靠流程。
这类 skill 很适合沉淀个人工作流:凡是你经常重复、步骤明确、需要调用工具、但又保留一点判断空间的任务,都可以做成 skill。
LLM-白泽🐲KISS 原则在软件工程中的实践
Loading...