@paladini/tabnews-publisher-mcp
v0.1.1
Published
Publish to TabNews via Playwright — persistent browser session, CLI & MCP server.
Maintainers
Readme
@paladini/tabnews-publisher-mcp
Publish Markdown articles to TabNews from the terminal or from your AI agent.
Browser automation with a persistent session — no TabNews API key required. Includes a Model Context Protocol (MCP) server for Cursor, Claude Code, and other MCP clients.
Why this exists
TabNews is a developer-focused publishing platform with native Markdown support. There is no official publishing API for automated cross-posting from agent pipelines.
This package fills the form at tabnews.com.br/publicar programmatically: title, Markdown body, optional source URL, and screenshot verification — so humans and AI agents can publish reliably without leaving the workflow.
Features
| Feature | Description |
|--------|-------------|
| Markdown publish | Native TabNews Markdown in the body field |
| Source attribution | Optional canonical URL appended to the post |
| Draft-first | Preview without --publish |
| Dry-run | Fill form + screenshot, no submit |
| MCP server | 2 tools for agent workflows |
| Persistent session | Login once; reuse cookies |
Quick start
npm install -g @paladini/tabnews-publisher-mcp
tabnews-publisher login
tabnews-publisher publish \
--title "My TabNews Post" \
--body-file ./post.md \
--source-url "https://dev.to/you/original" \
--jsonExpected output:
{
"ok": true,
"status": "draft",
"tabnews_url": "https://www.tabnews.com.br/publicar",
"source_url": "https://dev.to/you/original",
"message": "Draft prepared on TabNews.",
"screenshot": "C:\\Users\\…\\tabnews-publisher\\artifacts\\tabnews-preview-….png"
}Add --publish when you are ready to go live.
Installation
npm (recommended)
npm install -g @paladini/tabnews-publisher-mcpBinaries: tabnews-publisher (CLI) · tabnews-publisher-mcp (MCP server)
From source (monorepo)
git clone https://github.com/paladini/publish-agents.git
cd publish-agents
npm install && npm run build -w @paladini/tabnews-publisher-mcp
npm link -w @paladini/tabnews-publisher-mcp
tabnews-publisher loginGitHub Packages
npm install -g @paladini/tabnews-publisher-mcp --registry=https://npm.pkg.github.comAuthentication
No TabNews API key. One interactive login saves browser cookies.
| Platform | Default session path |
|----------|---------------------|
| Windows | %LOCALAPPDATA%\tabnews-publisher\storageState.json |
| macOS / Linux | ~/.local/share/tabnews-publisher/storageState.json |
Environment overrides: TABNEWS_STATE_PATH · TABNEWS_PUBLISHER_HOME
tabnews-publisher login
tabnews-publisher session-check --jsonDuring login, sign in at tabnews.com.br/login in the opened browser, then press Enter in the terminal.
CLI reference
tabnews-publisher login
tabnews-publisher session-check [--json]
tabnews-publisher publish \
--title TITLE \
--body-file PATH \
[--source-url URL] \
[--publish] \
[--dry-run] \
[--json]| Flag | Description |
|------|-------------|
| --title | Post title (required) |
| --body-file | Path to Markdown file (required) |
| --source-url | Original URL — appended as attribution footer |
| --publish | Submit and go live (default: draft/preview only) |
| --dry-run | Fill form + screenshot; do not submit |
| --json | Machine-readable output |
Examples
Prepare draft (safe):
tabnews-publisher publish \
--title "Automating TabNews with Playwright" \
--body-file ./article.md \
--source-url "https://dev.to/you/original"Publish live:
tabnews-publisher publish \
--title "Automating TabNews with Playwright" \
--body-file ./article.md \
--publish --jsonDry-run (verify session + selectors):
tabnews-publisher publish \
--title "Test" \
--body-file ./article.md \
--dry-runSource attribution
When --source-url is set, the body automatically includes:
---
*Publicado originalmente em: [https://…](https://…)*MCP server
Transport: stdio (newline-delimited JSON-RPC).
Client configuration
Cursor:
{
"mcpServers": {
"tabnews-publisher": {
"command": "tabnews-publisher-mcp"
}
}
}Claude Code:
claude mcp add tabnews-publisher -- tabnews-publisher-mcpTools
| Tool | Description |
|------|-------------|
| tabnews_session_check | Verify saved session |
| tabnews_publish | Publish Markdown. Args: title, body, source_url, status (draft|published), dry_run |
Example agent call:
{
"title": "My TabNews Post",
"body": "# Hello\n\nMarkdown content here.",
"source_url": "https://dev.to/author/post",
"status": "draft"
}How it works
Load storageState.json
→ navigate to tabnews.com.br/publicar
→ assertLoggedIn()
→ fill title input
→ fill body textarea (Markdown)
→ append source attribution (optional)
→ screenshot → artifacts/
→ click Publish (if --publish)
→ return tabnews_url + screenshot pathUses Playwright Chromium. TabNews does not require Patchright anti-detection patches.
Programmatic API
import { publishTabNews } from '@paladini/tabnews-publisher-mcp';
const result = await publishTabNews({
title: 'My Post',
body: '# Hello\n\nContent in Markdown.',
sourceUrl: 'https://dev.to/author/post',
publish: false,
dryRun: false,
});Troubleshooting
| Symptom | Fix |
|---------|-----|
| Exit code 3 / not authenticated | tabnews-publisher login |
| Form fields not found | TabNews UI changed — open an issue with screenshot |
| Publish button not clicked | Omit --publish for draft; add it only when ready |
Screenshots: %LOCALAPPDATA%\tabnews-publisher\artifacts\
Limitations
- TabNews UI changes can break selectors
- No DEV.to import — pass Markdown via
--body-fileor MCPbodyarg - Requires Node.js ≥ 20
- Respect TabNews community guidelines and rate limits
Related
| Resource | Link | |----------|------| | Monorepo | paladini/publish-agents | | Medium cross-post | @paladini/medium-publisher-mcp | | LinkedIn cross-post | @paladini/linkedin-publisher-mcp | | MCP setup | mcp/tabnews/README.md |
