npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@paladini/tabnews-publisher-mcp

v0.1.1

Published

Publish to TabNews via Playwright — persistent browser session, CLI & MCP server.

Readme

@paladini/tabnews-publisher-mcp

npm version License: MIT Node.js

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" \
  --json

Expected 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-mcp

Binaries: 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 login

GitHub Packages

npm install -g @paladini/tabnews-publisher-mcp --registry=https://npm.pkg.github.com

Authentication

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 --json

During 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 --json

Dry-run (verify session + selectors):

tabnews-publisher publish \
  --title "Test" \
  --body-file ./article.md \
  --dry-run

Source 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-mcp

Tools

| 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 path

Uses 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-file or MCP body arg
  • 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 |


License

MIT · Fernando Paladini