关于 Etincel
Étincel 是用于非虚构写作审查与风格辅助的本地工具,提供 CLI、GitHub Action 和 MCP 服务。它通过确定性规则标注机器写作特征而不改写文本,并可根据写作样本训练风格。
主要功能
- 01定位写作模式并标注严重程度
- 02按文体配置审查规则
- 03训练并复用个人写作风格
- 04提供 CLI 与 GitHub Action
- 05支持仓库级团队配置
适用场景
- 01在 CI 中检查文档和 README
- 02审查营销文案中的机器写作特征
- 03依据作者样本起草非虚构文本
- 04在团队仓库共享写作规范
MCP 相关
本地 MCP 服务向客户端提供文本审查和风格相关工具;还可连接托管服务,通过 Streamable HTTP 使用相同工具。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://etincel.ai/api/mcpclaude mcp add --transport http etincel-a6346d https://etincel.ai/api/mcp{"mcpServers":{"etincel-a6346d":{"type":"http","url":"https://etincel.ai/api/mcp"}}}在 Cursor 中打开{"servers":{"etincel-a6346d":{"type":"http","url":"https://etincel.ai/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"etincel-a6346d":{"type":"http","url":"https://etincel.ai/api/mcp"}}}{"mcpServers":{"etincel-a6346d":{"serverUrl":"https://etincel.ai/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
20此工具无需参数。
详细介绍
Étincel:非虚构写作连接器
___ ___ ___ ___ ___ ___
/\ \ /\ \ ___ /\__\ /\ \ /\ \ /\__\
/::\ \ \:\ \ /\ \ /::| | /::\ \ /::\ \ /:/ /
/:/\:\ \ \:\ \ \:\ \ /:|:| | /:/\:\ \ /:/\:\ \ /:/ /
/::\~\:\ \ /::\ \ /::\__\ /:/|:| |__ /:/ \:\ \ /::\~\:\ \ /:/ /
/:/\:\ \:\__\ /:/\:\__\ __/:/\/__/ /:/ |:| /\__\ /:/__/ \:\__\ /:/\:\ \:\__\ /:/__/
\:\~\:\ \/__/ /:/ \/__/ /\/:/ / \/__|:|/:/ / \:\ \ \/__/ \:\~\:\ \/__/ \:\ \
\:\ \:\__\ /:/ / \::/__/ |:/:/ / \:\ \ \:\ \:\__\ \:\ \
\:\ \/__/ \/__/ \:\__\ |::/ / \:\ \ \:\ \/__/ \:\ \
\:\__\ \/__/ /:/ / \:\__\ \:\__\ \:\__\
\/__/ \/__/ \/__/ \/__/ \/__/
找出你文章中的 AI 痕迹。以确定性方式在本地和 CI 中运行。
npx etincel lint README.md
无需安装、无需账户、无需调用模型、无需联网。
$ npx etincel lint drafts/announcement.md --register blog
✗ drafts/announcement.md RED 100/100 (8 findings, 169 words, register: blog)
Heavy AI styling. Multiple strong tells stacking up, worth a structural
rewrite, not a word-swap pass.
Whole-piece rhythm
medium uniform-paragraph-length
6 paragraphs, most running about the same length with little
variation between them. Vary paragraph length more.
medium low-burstiness
13 sentences averaging 13 words, with little variation in length
from one sentence to the next. Mix short sentences with long;
allow fragments.
medium mechanical-register-drift
Fragment rate and structural variety (sentence openers,
punctuation mix) sit off where blog prose typically lands. Allow
more sentence fragments and vary openers/punctuation more.
Vocabulary and phrasing
high comprehensive L3:C30 → thorough, complete
high cutting-edge L3:C109 → newest, latest
high leverage L3:C99 → use
high seamless L3:C150 → smooth, easy
high streamline L3:C70 → simplify, speed up
strengths specificity 11.4/1k · concrete:abstract 0.40 · burstiness 0.32
1 file audited, 1 at or above orange.
Étincel 有两项功能:一个确定性审查工具,可找出让文章读起来像机器所写的模式,并以 CLI、GitHub Action 和 MCP 工具的形式提供;以及一个风格层,可根据你自己的写作风格训练 Claude、Cursor 或任何 MCP 客户端,让它们按这种风格起草,从而在你阅读草稿之前就减少问题。
AI 起草的文章有一种容易辨认的特点:段落结构千篇一律、语气谨慎含糊、能用逗号的地方却用了破折号,结尾也收得过于圆满。Étincel 将针对这些特点的规则编码其中;同样重要的是,它会展示发现了什么以及原因,而不是悄悄改写你的风格。在审查流程中完全不会调用模型,你可以决定要修改什么。你始终是作者。
它有效吗?
我们用测量结果说话,而不是空口断言。按文体计算的汇总 AUC,由 assay 根据带标签语料库测得,并使用固定的 bootstrap 种子;因此,任何导致这些数值下降的 PR 都会在 CI 中失败:
| 文体 | AUC |
|---|---|
| 备忘录 | 0.909 |
| 随笔 | 0.900 |
| 博客 | 0.820 |
| 通用 | 0.748 |
| 文档 | 0.735 |
| 电子邮件 | 0.540 |
电子邮件的结果几乎和抛硬币一样。我们有意不对其进行校准,但仍会追踪,以免意外回归不被发现。general 同样未校准。已校准的文体有 docs、blog、memo 和 essay;如果你在意这个数值,请使用这些文体。有关方法和来源,请参阅 efficacy-baselines.json 和 src/data/SOURCES.md。
对比
与 Vale + vale-ai-tells 对比 Vale 是一款出色的、能识别标记语言的检查工具,而 vale-ai-tells 是一套严谨的 78 条规则包。它们会将词元与模式进行匹配。Étincel 衡量文章的整体特征:句子节奏的变化、段落长度的一致性,以及与作者自己先前草稿的重复情况。这类统计分析正是 vale-ai-tells 自己的 README 所说的、需要超越词元匹配能力的分析。Étincel 还会在起草前向模型提供经过训练的写作风格,这是检查工具做不到的。两者同时使用也很合理;它们的重叠比你想象的少。
与技能文件(stop-slop、avoid-ai-writing、no-slop)对比 这些文件是给模型的指示,而且确实有帮助。但提示词无法验证指示是否生效,无法生成退出代码,也无法阻止合并。可以使用其中一种,并且在 CI 中运行本工具。
与人性化工具(Undetectable.ai、QuillBot、StealthWriter)对比 这些工具会改写你的文本以躲避检测器。Turnitin 现在有专门的 AI 改写检测功能,并于 2025 年扩展了该功能,专门针对人性化工具的输出。Étincel 做的恰恰相反:它绝不会修改你的文本,也不适合用来欺骗任何人。
与检测器(GPTZero、Pangram、Originality.ai、Copyleaks)对比 这些工具会在云端分析整篇文档,以概率形式回答“是否有机器参与?”,并给出作者身份判定。Étincel 则在本地回答“哪些具体模式让文章读起来像机器所写?”,并标出位置和严重程度,且绝不判定内容由谁撰写。
安装
它也列于官方 MCP 注册表,名称为 ai.etincel/etincel-nonfiction。因此,能从该注册表自动发现服务的 MCP 客户端(例如 VS Code 的 @mcp 扩展库)无需使用以下配置即可找到它。
Claude Code
/plugin marketplace add AIStoryHub/etincel
/plugin install etincel-nonfiction
也可以从本地克隆的项目添加:/plugin marketplace add /path/to/etincel。
Claude Desktop / 其他 MCP 宿主
{
"mcpServers": {
"etincel-nonfiction": {
"command": "npx",
"args": ["etincel", "serve"]
}
}
}
如果从本地克隆的项目安装,则运行 npm install && npm run build,然后将 args 指向 ["/path/to/etincel/dist/server.js"],并设置 "command": "node"。
远程(托管、多租户)
也提供托管版本,可通过 etincel.ai 访问。它通过
Streamable HTTP(https://etincel.ai/api/mcp)提供相同的工具,采用按账户进行的身份验证,而非 stdio。将任意 MCP 客户端直接指向它:
{
"mcpServers": {
"etincel-nonfiction": {
"url": "https://etincel.ai/api/mcp"
}
}
}
托管服务不属于此仓库;此仓库包含本地/stdio 引擎、CLI 和技能,托管版本正是基于它们构建的。
使用方法
安装后,只需像平常一样提出需求,例如“给团队写封邮件,说明延误情况”“写一篇关于 X 的博客文章”或“润色这份备忘录”,在 Claude Code 或 Claude Desktop 中使用即可。对于有一定长度的非虚构文章,该技能会自动启用。训练你自己的风格:
根据我写的这三封邮件,训练一种叫“me”的风格:[粘贴示例]
然后可以在每次请求中指定它(“用我的风格写这段内容”),也可以将其设为默认风格:
将“me”设为我的默认风格
风格预设
开箱即用地提供 12 种预设:6 种情感基调(直接而温暖、行政简报、反思型随笔作者、创始人备忘录、直白的分析师、诙谐坦率),以及 6 种用途预设(公关审阅、代码注释、Slack 消息、LinkedIn 帖文、网站文案、博客文章)。每种预设都包含正式度、亲和度和直接度的调节项,以及句式节奏和声音风格说明;这些内容会作为起草上下文提供给模型,而不是用于填空的模板。服务会从 src/data/presets.json 读取这些预设。使用 fork_style 将任意预设分叉为经过训练的风格,打造属于自己的风格。
命令行 lint
audit_text 底层是纯函数,因此也提供 CLI,可在聊天客户端之外对文章进行 lint(README、文档、CI 中的 PR 描述):
npx etincel lint 'docs/**/*.md'
npx etincel lint README.md --register docs --threshold yellow
如果任一匹配文件的级别达到或超过 --threshold(默认为 orange),则以非零状态码退出。.md/.mdx 文件默认自动采用 docs 类型(可避免 Markdown 结构造成的误报,因为真正的标题并不代表文本由聊天机器人撰写);传入 --register 可覆盖此设置。添加 --json 可生成机器可读报告。运行 npx etincel lint --help 查看完整选项列表。
GitHub Action 封装了相同的 CLI(请参阅 action.yml,以及此仓库中可运行的示例 .github/workflows/lint.yml):
- uses: AIStoryHub/etincel@main
with:
patterns: "docs/**/*.md README.md"
threshold: orange
仓库本地配置:词典、说明和共享团队风格
团队规则不必只保存在每个人本地的 ~/.etincel/ 中。在仓库根目录放置 .etincelrc(或 .etincelrc.json / etincel.config.json),CLI 和本地(stdio)服务便会自动读取。配置可在代码审查中查看并纳入版本控制,不会像保存在个人账户中那样隐而不见,也不会在有人离开时随之消失:
{
"bannedWords": ["Acme Cloud Platform"],
"allowedWords": ["leverage"],
"register": "docs",
"threshold": "orange",
"instructions": "Always include a one-line CTA at the end.",
"style": {
"name": "House Voice",
"dials": {
"formality": 6,
"warmth": 4,
"directness": 7,
"sentenceLength": 40,
"sentenceRhythmVariance": 50,
"paragraphVariance": 30,
"contractionUse": 20,
"emDashUse": 0,
"fragmentTolerance": 10,
"questionUse": 5,
"entropy": 60
}
}
}
bannedWords/allowedWords会与账户/风格词典中的内容合并;register/threshold用作整个仓库的默认值,但仍可通过显式的--register/--threshold标志覆盖。instructions是自由文本,会合并到所有风格的get_style_guide的instructions中,并置于你自己的账户级全局说明之前:这是团队级的set_style_instructions等效配置,无需指定styleId,但会提交到仓库,而非存放在某个人的账户中。style根据各项调节参数定义共享的“团队风格”,可在任何地方通过styleId: "team"使用(用于get_style_guide;使用fork_style将其分叉为实际训练的风格后,也可在其他任何地方使用),让团队从第一天起就拥有一套经过调校的起始风格,而不必让每个人从零开始手动训练或调校自己的风格。如果当前仓库中的.etincelrc定义了该风格,list_styles会自动将其包含在内。
托管服务不会使用上述任何配置(它没有可供查找的本地仓库)。
在不提交配置的情况下与团队共享
.etincelrc 是经过版本控制、可供代码审查的上层配置;其下层是 ETINCEL_HOME,这是一个环境变量,供本地(stdio)服务和 CLI 使用,指向一个替代默认 ~/.etincel/ 的目录。将每位队友的 ETINCEL_HOME 都指向同一个共享、同步或挂载的目录(一个位于仓库外、每个人的机器都可读取的路径,例如由你们常用的文件共享设置同步的目录),这样经过训练的语音、默认风格,以及账户级别的指令和词典也能共享,而不只是 .etincelrc 中已提交的那部分:
{
"mcpServers": {
"etincel-nonfiction": {
"command": "node",
"args": ["/path/to/etincel/dist/server.js"],
"env": { "ETINCEL_HOME": "/path/to/shared/etincel-home" }
}
}
}
无需导出或导入任何其他内容:将 ETINCEL_HOME 指向同一个目录就是同步,就像单个人使用 ~/.etincel/ 时一样。
此处内容
- 一个 MCP 服务(
src/server.ts),提供二十种工具:list_styles:预制语气预设、你训练过的所有语气,以及(如果仓库本地的.etincelrc中定义了)团队共享风格get_style_guide:某种风格的起草说明train_style:从你自己的写作样本中学习语气(句子节奏、缩略形式使用率、破折号习惯、段落变化、反复出现的措辞:通过测量得出,而非猜测)create_style_from_dials:通过明确设置正式程度、亲和度、直接程度及机械性参数来创建风格,而非使用样本update_style:重命名已训练的语气,或就地调整其参数fork_style:将预设的参数和指南复制为新的已训练语气,你可以重新训练或手动微调;也可以在其他安装者将其风格发布到托管图库后进行复制(格式为handle/slug,例如jpleblanc/blunt-memo,与其公开页面etincel.ai/v/handle/slug上显示的地址相同);复制公开风格时,也会带上其机械性参数,以及源安装者专门为该风格设置的任何词典/说明(绝不会带上他们私有的、适用于整个账户的设置),并会向etincel.ai发起一次网络请求来获取这些内容;复制预设则不会离开此安装环境delete_style:永久删除已训练的语气set_default_style:记住要使用的风格,无需每次重复说明check_voice_match:将草稿测得的节奏与已训练语气的基线进行比较。这是节奏/写作机制检查,不是作者身份或 AI 检测;输入较短时置信度较低check_self_repetition:将草稿与某种语气近期自己的训练样本进行比较,检查写作习惯,而非 AI 特征:例如相同的开篇,或某个短语在过去几篇文章中反复出现(“你最近 6 篇文章中有 4 篇以这种方式开篇”)。目前仅适用于本地安装audit_text:基于确定性规则扫描 AI 特征,返回等级、带严重程度的具体发现,以及优势信号(具体性、具体与抽象内容的比例、句子节奏变化),避免修改让文章变得平淡。可选参数register(email/blog/memo/essay/social/docs/general/personal,默认值为general),用于根据文本类型调整严格程度:docs会抑制 Markdown 结构导致的误报(标题、加粗术语),并参照长篇文本而非节奏更鲜明的短文案重新校准节奏/词汇检测。personal已搭好框架(可接受,但目前尚未额外抑制任何内容),但尚未完成校准:在经过测量之前,不会有专属的术语抑制规则、节奏权重或标注语料。还可选用sourceFacts(从用户处引出的细节,绝不由系统生成):检查实际写入草稿的细节数量;若实际使用的细节少于两个,或至少没有一个出现在并非用于证明资格的句子中,则标记elicited-material-unusedsecond_read:通过一次模型调用阅读草稿,并报告细心的人类编辑会注意到的问题;不评分、不分级,绝不改写。仅托管版本可用:此安装始终会失败并给出明确说明,因为模型调用需要账户、固定模型和计费界面,而此安装不具备这些条件。audit_text仍可完整使用,无需账户add_banned_word/remove_banned_word:维护你自己的禁用词列表;audit_text会将其与内置语料一并检查add_custom_word/remove_custom_word:维护“绝不标记”列表,适用于组织自身的缩写或内部术语等企业词典场景list_dictionary:查看某个范围内的禁用词/自定义词;对于某种风格,还可查看与全局列表合并后实际生效的内容set_style_instructions/clear_style_instructions/get_style_instructions:为某个范围保存、移除或读取自由文本起草规则(必备要素、禁写主题、格式限制);这些规则会合并到get_style_guide中,方式与词典合并到audit_text中相同
- 一个 Claude Code / Claude Desktop 技能(
skills/etincel-nonfiction/),在你起草或修改任何有一定篇幅的非虚构文本时使用这些工具。 训练好的语音、词典和默认风格都保存在本地的~/.etincel/:不会向任何地方发送数据。audit_text是纯确定性代码(字符串分析 + 精选的 AI 写作特征语料),不会调用模型。唯一的例外是通过fork_style派生公开风格:它会从etincel.ai的公开图库获取(绝不发送)该风格的指南;派生预设,或此列表中的任何其他内容,都完全不会访问网络。
自定义词典
除了内置的 AI 特征语料,你还可以维护自己的禁用词和“始终允许”词列表:只需告诉 Claude(或任何 MCP 客户端),例如“将 [word] 添加到我的禁用词列表”或“将 [word] 添加到我的自定义词列表,这是我们自己的词。”每个列表都属于一个范围:global(适用于所有地方,也是未指定风格时的默认范围)或特定的风格 id。针对该风格进行审查时,该风格的列表会合并到 global 列表之上。list_dictionary 会显示某个范围中保存的内容,以及某种风格合并后的有效列表。编辑全局列表就能让某个词在所有风格中保持同步:每次运行 audit_text 或 list_dictionary 时,系统都会实时自动合并。
开发
npm install
npm test # run the engine/tools test suite (node:test via tsx)
npm run dev # run the MCP server over stdio via tsx, for local testing
npm run build # compile to dist/
mcpscore 徽章审查的是托管的远程服务(etincel.ai/api/mcp),而不是本仓库中的本地/stdio 引擎;两者提供相同的工具,但作为独立部署运行。
状态与限制
仍处于早期阶段,确实如此。
src/data/中的审查语料是精选子集,并不全面。关于来源及尚未移植的内容,请参阅src/data/SOURCES.md。完整语料位于 aistoryhub.co/corpus。email(AUC 0.540)和general(0.748)尚未校准。social完全没有带标签的语料,因此未纳入追踪。check_voice_match检查的是节奏和写作机制,并非作者身份检测;对于较短的输入,其置信度较低。check_self_repetition目前仅支持本地安装。- AI 特征不断变化:OpenAI 于 2025 年 11 月修补了 ChatGPT 的长破折号使用习惯。因此,我们衡量效果,而不作保证:当某个特征不再具有辨识力时,AUC 会发生变化,回归检查也会捕捉到这一点。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。