content-hub
Enables creating and updating Bilibili column article drafts via the creation API, with final publication requiring manual partition selection in the editor.
Allows publishing articles to CSDN, updating published articles in-place, and fetching the account's article list.
Allows publishing articles to Juejin, updating published articles in-place, and fetching the account's article list.
Supports publishing and updating articles on Zhihu via browser UI injection, with automatic capture of post IDs after publishing.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
Harbor
English · 简体中文
Self-hosted publishing hub for people who write in Chinese and publish everywhere. Write once, ship to fifteen platforms, and keep every published copy in sync — with AI drafting, a compliance gate, and a human in the loop when a platform fights back.

What it does
Fifteen platforms, one publish action | Zhihu, Juejin, CSDN, Bilibili, Cnblogs, Toutiao, OSChina, SegmentFault, 51CTO, MetaWeblog blogs, WeChat Official Accounts, GitHub Pages, Dev.to, Telegraph, Xiaohongshu. Each adapter declares what it can actually do — publish, draft, update, tags, cover, Q&A — and the UI greys out the rest. |
Update in place | Edit once; every already-published copy is updated rather than duplicated. |
AI drafting with a compliance gate | Seven provider routes with failover, plus a four-stage gate before anything ships: safety scan → AIGC disclosure → dual-model review → human confirmation. |
Pauses instead of guessing | CAPTCHA, risk control, expired session: the task stops, tells you, and resumes where it left off. |
Session persistence | Log in once per platform. Cookies live in a local profile plus an atomic snapshot, so a wiped profile does not force a re-scan. |
MCP server, 32 tools | Drive the whole pipeline from Claude Code, Cursor or any MCP client. stdio, streamable-http or legacy SSE; any non-loopback transport requires a bearer token. |
Everything local, and portable out | SQLite with FTS5 full-text search, local media store with content-addressed dedupe, no vendor account, no telemetry. Export any article — or the whole library — as Markdown with YAML front-matter for Hexo, Hugo or Obsidian. |
A live view that survives reconnects | Task and article changes stream over SSE with monotonic event ids; after a dropped connection the client replays what it missed via |
Measured, not asserted |
|
Related MCP server: LightCMS
Screens
Publish center | Task center |
|
|
Settings | Mobile |
|
|

Fifteen adapters, each declaring what it can actually do. Greyed-out actions are not supported by that platform, not missing features.

Tag governance finds near-duplicate tags (Python / python / Pyhton) and merges them in one click.
Quick start
Requires Python 3.10+, uv, Node 20+ and pnpm.
git clone https://github.com/badhope/harbor.git
cd harbor
# Terminal 1 — backend
cd backed
uv sync
uv run uvicorn app.factory:create_app --factory --host 127.0.0.1 --port 8000 --reload
# Terminal 2 — frontend
cd web
pnpm install
pnpm dev # http://127.0.0.1:5173Open http://127.0.0.1:5173. The Vite dev server proxies /api to port 8000.
Command line
uv run --project backed python -m backed.cli status # library + account overview
uv run --project backed python -m backed.cli list # newest articles
uv run --project backed python -m backed.cli create --title "..." --content "..."
uv run --project backed python -m backed.cli publish --id 12 --platforms juejin,csdn
uv run --project backed python -m backed.cli export --all --out ./markdownDesktop shell (experimental)
cd web
pnpm install
pnpm run tauri devFor a release build, stage the sidecar under the name Tauri expects first:
uv run --project backed python scripts/stage_sidecar.py # copies dist/ -> binaries/<triple>
cd web && pnpm tauri buildTauri launches the Python backend as a sidecar and reads its port from a handshake
file. Verified on Windows (2026-11-07): tauri build compiles, the app starts,
the sidecar binds a loopback port, and the data directory is created under
%APPDATA%. macOS and Linux are untested — see Known limits.
Connect a platform
Two connection styles, decided per platform:
Browser login — for platforms without a usable API. Open Settings → Platform accounts, click Log in on the platform, and complete the scan or password step in the window that opens. The session is stored in a local profile and reused.
uv run --project backed python -m backed.cli --headed login --platform zhihuProtocol credentials — for platforms with a stable API. Fill in
platforms.<name> in config.json; no browser needed. See
PLATFORM_CONNECTION.md for the field list per platform.
uv run --project backed python -m backed.cli publish --id <article-id> --platforms zhihu,juejinConfiguration
Edit backed/config.json, or use environment variables:
Variable | Purpose | Default |
| REST authentication token | Auto-generated on loopback; required in production/Docker |
| Signing / JWT key | Required in production; no public default |
| Client networks exempt from the API token | Loopback only |
| Reverse proxies whose | Empty |
| Allowed cross-origin origins | Same-origin |
| Accepted | Loopback |
| Persistent root for DB, media, profiles, config | Repo-local |
| Reuse a system browser ( | Bundled Chromium |
| Public base URL for hosted media | Empty (media stored, not rewritten) |
| Demo mode: no browser, no external API calls | Off |
Deployment
Docker Compose runs the backend behind nginx, with the token injected server-side:
export SECRET_KEY=$(openssl rand -hex 32)
export HARBOR_API_TOKEN=$(openssl rand -hex 32)
docker compose -f deploy/docker-compose.yml --profile web up -d --buildThe backend is not exposed to the host; nginx terminates and injects the token. Data
lives in the hub_data volume.
Testing
bash scripts/check_all.sh # all gates; Linux/macOS
pwsh -File scripts/check_all.ps1 # all gates; Windows
cd backed && uv run pytest -q # backend only
pnpm --dir web test # frontend onlycheck_all runs eight gates: compileall, ruff, version consistency, secret scan,
pytest, eslint, vitest, vite build.
Architecture
Vue 3 SPA ──REST/SSE──► FastAPI ──► Publishing hub
(Tauri shell) (uvicorn) ├── 15 platform adapters
├── task engine + scheduler
├── SQLite (WAL + FTS5)
└── MCP bridge (stdio/SSE)Details in docs/architecture/ARCHITECTURE.md.
Known limits
Read this before trusting any claim above.
Browser fetch and screenshot are enabled but network-restricted. The target host is pinned to its validated public IP inside Chromium and every sub-resource is checked. Private, loopback and link-local targets are rejected.
Real publishing is not regression-tested against live platform DOM. Adapters pass a static contract probe; only Juejin has a captured DOM sample. Verify with a draft before relying on any platform.
Tauri is verified on Windows only.
tauri build --no-bundlecompiles, the app launches, and the sidecar serves/api/v1/hub/healthon a loopback port (2026-11-07). macOS/Linux and installer packaging (NSIS/MSI) are untested.Docker is still unverified. The daemon is unavailable on this machine; the compose file and Dockerfiles are lint-checked but have never produced a running container here.
No auto-update, no signed release manifest, no cross-platform installer.
Documentation
Branch model, DoD, gates, five-remote sync | |
SemVer policy and release checklist | |
Shipped, next, backlog, out of scope | |
Per-platform credentials and CLI | |
Module boundaries and data flow | |
Dated evidence from real platforms, installers and deployments | |
Historical defect audits and fixes | |
How to send a change | |
Reporting vulnerabilities |
License
MIT — see LICENSE.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
This server cannot be deployed
Maintenance
Related MCP Connectors
Write, edit, translate and publish blog and help-center articles across all your sites.
Manage your blog ideas, article schedule, writing runs and draft approvals from your AI app.
Social media management, multi-platform publishing, AI generation, and cross-channel analytics.
Creation-first AI content engine: one brief in, finished content everywhere, in your brand voice.
Related MCP Servers
- AlicenseAqualityDmaintenanceAI content generation, repurposing, and multi-platform publishing for 9+ social media platforms. Generate blog posts, discover trending topics, brainstorm titles, and publish to Twitter, LinkedIn, Bluesky, and more.870 npm7MIT
- AlicenseBqualityBmaintenanceLightweight content management system for websites, built for the AI era12934MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to create and manage owned-audience websites with posts, products, subscribers, domains, and analytics.143 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI clients to manage WordPress and WooCommerce sites with over 194 tools for content, users, security, performance, and e-commerce operations.ISC



