【插件开发框架】MNRails-AI时代Marginnote插件开发脚手架

MN Rails是一个用于快速创建MarginNote4标准插件工程的脚手架。

它提供统一的项目初始化流程,帮助开发者更快开始MarginNote插件开发。生成的项目面向标准插件工程,并支持后续开发与打包流程。

MN Rails新增Web模板啦!

现在使用MN Rails可创建基于React(Pages Router+JSX)+Vite的含Web界面的开发模板,内置高可读的通信机制和灵活的热更新方式,让你的MN插件开发体验再上一层楼。

Web模板专为Marginnote环境做了打包优化,兼顾打包效率与兼容性。

之所以不用TSX而用JSX是为了迎合大家的Vibe Coding习惯,如果您依然使用古法编程,易读的项目结构也能让你自行实现低成本切到TSX。

特性

  • 快速创建MarginNote4标准插件工程模板
  • 一行命令npx mn-rails快速初始化项目
  • 创建过程中可填写addonidauthortitle等项目信息
  • 内置AGENTS.md,便于配合AI工具及MCP进行高效开发
  • 内置版本号dump脚本与可选的Github CI,便于快速迭代新版本
  • 内置打包脚本

快速开始

在目标目录运行:

npx mn-rails
按照提示输入项目信息后
❮ npx mn-rails
Project name (marginnote-addon): FooBar
addonid: foo.bar.banana
author: Monkey
title: FooBar Plugin
class name (MNFooBarPluginAddon): 
package manager (npm/pnpm) [pnpm]: 
generate CI? (y/n) [y]: 
Created: /Users/shenshichao/FooBar
脚手架会生成对应的项目目录
❮ tree FooBar/
FooBar/
├── AGENTS.md
├── package.json
├── scripts
│   ├── build-release.js
│   └── bump-version.js
└── src
    ├── icon.png
    ├── main.js
    ├── mnaddon.json
    └── MNFooBarPluginAddon.js

3 directories, 8 files

注意事项:

  • 目标目录必须为空目录,否则创建会中止
  • 若检测到git可用,会自动完成仓库初始化并创建初始commit

进入项目目录后即可安装依赖并启动开发:

cd <your-project>
pnpm i
# or
npm i

MCP

使用AI开发建议配合MCP

MCP启动命令:npx mn-docs-mcp
首次启动会下载embedding模型并构建向量数据,建议先在终端执行过一次后再由AI工具进行调用。

快速配置:

{
  "mcpServers": {
    "mn-docs": {
      "command": "npx",
      "args": [
        "mn-docs-mcp"
      ]
    }
  }
}

Codex快速配置:

[mcp_servers.mn-docs]
args = ["mn-docs-mcp"]
command = "npx"
enabled = true

构建与发布

插件打包

pnpm dev # 直接打包
pnpm build # 压缩后打包

版本更新

语法类似npm version,一次性实现版本号更新、打tag、创建版本commit的操作

pnpm version:patch
pnpm version:minor
pnpm version:major

发布Release

如果启用了ci,推送tag后会自动生成release

git push
git push --tag

贡献

欢迎提交issue和pr到GitHub仓库

3 Likes

先star一下!:star:

1 Like

框架已更新Web模板,且cli更加易用,欢迎大家来使用

有调取整一个卡片的api吗?比如我想弄个悬浮窗,然后把选中的卡片一整个给显示在悬浮窗中(包括卡片的标题、摘录的内容、两个卡片合并一起成为的一个卡片、评论、评论中的手写笔记等等,除了绑定在卡片上的手写)

MbBookNote本身就是卡片啦

1 Like

我让ai用了一下,怎么都是文字了呢,还有卡片链接了:face_holding_back_tears:(我纯计算机小白)

请问卡片中的手写评论怎么抓出来呀…让ai试了好多方法都没给抓出来