The Universal MCP Server exposes tools for automated posting and draft saving to note.com. It reads Markdown files containing titles, body text, and tags, then publishes them to your note.com account using Playwright automation.
note-state.json authentication state file (obtained via separate login script)NOTE_POST_MCP_STATE_PATH in your environment (optional, defaults to ~/.note-state.json)note-state.json file containing your note.com authentication state.NOTE_POST_MCP_STATE_PATH or pass it as a parameter.git clone https://github.com/Go-555/note-post-mcp.git
cd note-post-mcp
npm install
npm run build
npm install -g note-post-mcp
Use this one-liner (replace with your real values):
claude mcp add Note Post MCP -s user -e NOTE_POST_MCP_STATE_PATH="/path/to/note-state.json" -- npx @gonuts555/note-post-mcp@latest
To remove:
claude mcp remove Note Post MCP
Create .cursor/mcp.json in your client (do not commit it here):
{
"mcpServers": {
"note-post-mcp": {
"command": "npx",
"args": ["@gonuts555/note-post-mcp@latest"],
"env": {
"NOTE_POST_MCP_STATE_PATH": "/path/to/note-state.json"
},
"autoStart": true
}
}
}
VS Code
Install via URI or CLI:
code --add-mcp '{"name":"note-post-mcp","command":"npx","args":["@gonuts555/note-post-mcp@latest"],"env":{"NOTE_POST_MCP_STATE_PATH":"/path/to/note-state.json"}}'
Claude Desktop
Add to your Claude Desktop configuration file (claude_desktop_config.json):
{
"mcpServers": {
"note-post-mcp": {
"command": "npx",
"args": ["@gonuts555/note-post-mcp@latest"],
"env": {
"NOTE_POST_MCP_STATE_PATH": "/path/to/note-state.json"
}
}
}
}
LM Studio
npx["@gonuts555/note-post-mcp@latest"]NOTE_POST_MCP_STATE_PATH=/path/to/note-state.jsonGoose
npx@gonuts555/note-post-mcp@latestopencode
Example ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"note-post-mcp": {
"type": "local",
"command": ["npx", "@gonuts555/note-post-mcp@latest"],
"enabled": true,
"env": {
"NOTE_POST_MCP_STATE_PATH": "/path/to/note-state.json"
}
}
}
}
Qodo Gen
Add a new MCP and paste the standard JSON config from above.
Windsurf
Add the following to your Windsurf MCP configuration:
{
"note-post-mcp": {
"command": "npx",
"args": ["@gonuts555/note-post-mcp@latest"],
"env": {
"NOTE_POST_MCP_STATE_PATH": "/path/to/note-state.json"
}
}
}
Add the following to your Codex TOML configuration.
Example (Serena):
[mcp_servers.serena]
command = "uvx"
args = ["--from", "git+https://github.com/oraios/serena", "serena", "start-mcp-server", "--context", "codex"]
This server (minimal):
[mcp_servers.note-post-mcp]
command = "npx"
args = ["@gonuts555/note-post-mcp@latest"]
# Optional environment variables:
# NOTE_POST_MCP_STATE_PATH = "/path/to/note-state.json"
# NOTE_POST_MCP_TIMEOUT = "180000"
# MCP_NAME = "note-post-mcp"
NOTE_POST_MCP_STATE_PATH: Path to the note.com authentication state file (default: ~/.note-state.json)NOTE_POST_MCP_TIMEOUT: Timeout in milliseconds for browser operations (default: 180000)MCP_NAME: Server name override (default: note-post-mcp)Publishes an article to note.com from a Markdown file.
markdown_path (string, required): Path to the Markdown file containing title, body, and tagsthumbnail_path (string, optional): Path to the thumbnail image filestate_path (string, optional): Path to the note.com authentication state filescreenshot_dir (string, optional): Directory to save screenshotstimeout (number, optional): Timeout in milliseconds
Outputs: JSON object with:
success (boolean): Whether the operation succeededurl (string): URL of the published articlescreenshot (string): Path to the screenshotmessage (string): Success messageSaves a draft article to note.com from a Markdown file.
markdown_path (string, required): Path to the Markdown file containing title, body, and tagsthumbnail_path (string, optional): Path to the thumbnail image filestate_path (string, optional): Path to the note.com authentication state filescreenshot_dir (string, optional): Directory to save screenshotstimeout (number, optional): Timeout in milliseconds
Outputs: JSON object with:
success (boolean): Whether the operation succeededurl (string): URL of the draft editor pagescreenshot (string): Path to the screenshotmessage (string): Success messageYour Markdown file should follow this format:
---
title: Your Article Title
tags:
- tag1
- tag2
---
Your article body content goes here.
You can include URLs and they will be automatically expanded by note.com.
Alternatively, you can use array notation for tags:
---
title: Your Article Title
tags: [tag1, tag2]
---
Your article body content goes here.
Or use a simple # heading for the title if no front matter is present:
# Your Article Title
Your article body content goes here.
{
"name": "publish_note",
"arguments": {
"markdown_path": "/path/to/article.md",
"thumbnail_path": "/path/to/thumbnail.png",
"state_path": "/path/to/note-state.json"
}
}
For saving a draft:
{
"name": "save_draft",
"arguments": {
"markdown_path": "/path/to/draft.md"
}
}
note-state.json file is valid and up-to-date. You may need to regenerate it if your session has expired.node -v to verify your Node.js version.npm install and npm run build to ensure all dependencies are installed and TypeScript is compiled.npx note-post-mcp (it will wait for MCP messages on stdin).npm pack --dry-run to see what files will be included in the published package.NOTE_POST_MCP_TIMEOUT or pass a larger timeout parameter.npx playwright install chromium to install the required browser.note-post-mcp) for identifiers and keys.Note Post MCP) only for UI labels.note-post-mcpnote-post-mcpnote-post-mcpnote-post-mcpnote-post-mcpNote Post MCPnote-post-mcp..mcp.json or client registries only use note-post-mcp for keys..cursor/mcp.json."mcpServers": { "note-post-mcp": { "command": "npx", "args": ["@gonuts555/note-post-mcp@latest"] } }"NotePost" or "note_post" (will conflict with note-post-mcp)MIT
$ claude mcp add note-post-mcp \
-- python -m otcore.mcp_server <graph>