docs-publisher
Provides tools to list, read, publish, edit, and delete tutorial pages by committing Markdown to a GitHub-hosted docs repository; also uploads images from public HTTPS URLs into the repo and can trigger site redeployment.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@docs-publisher Write a tutorial on webhooks and publish it as guides/webhooks."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
docs-publisher-mcp
Let Claude write your documentation. This is an MCP connector that gives Claude tools to publish, edit and delete tutorials on a Git-based docs site (Docusaurus, MkDocs, VitePress and others), and to add pictures to them. Everything goes straight to your GitHub repo, and the site redeploys by itself, so a tutorial is live a minute or two after Claude writes it.
See it working: docsXAi is a docs site built with it (source). Its setup guide has a one-minute demo video.
You chat with Claude → this connector → GitHub repo → live docs siteWhat Claude can do
Tool | What it does |
| List the pages on the site |
| Read a page |
| Create a page, or replace one |
| Change one exact piece of text in a page |
| Remove a page |
| Save a picture from a public |
| Rebuild the site by hand (normally not needed) |
Ask in plain words, for example: "Write a tutorial on webhooks and publish it as guides/webhooks."
upload_image accepts only JPEG, PNG, GIF and WebP files up to 5 MB. It checks the file itself rather than its name, and refuses http:// links and private network addresses, so it can't be used to reach things on your own network.
Related MCP server: ship-it-mcp
Quick start
You need a GitHub token: create a fine-grained personal access token for your docs repo only, with Contents: Read and write.
Option A: on your own computer (just you)
Needs Node.js 18 or later. No server and no public address.
git clone https://github.com/ArfZkwn-coder/docs-publisher-mcp
cd docs-publisher-mcp
npm install
claude mcp add docs-publisher -e GITHUB_TOKEN=<your-token> -e DOCS_REPO=<owner>/<repo> -- node "$(pwd)/src/index.js"For Claude Desktop, add this under mcpServers in claude_desktop_config.json (use the full path to src/index.js):
"docs-publisher": {
"command": "node",
"args": ["/full/path/to/docs-publisher-mcp/src/index.js"],
"env": { "GITHUB_TOKEN": "<your-token>", "DOCS_REPO": "<owner>/<repo>" }
}Option B: on a server, for a team using claude.ai
Anyone you give a personal URL can use it from claude.ai (web, desktop or phone) without installing anything.
Get the code on the server and create your settings file:
git clone https://github.com/ArfZkwn-coder/docs-publisher-mcp cd docs-publisher-mcp cp .env.example .envEdit
.env: setGITHUB_TOKEN,DOCS_REPO, a long randomMCP_SECRET(openssl rand -hex 24makes one), andPUBLIC_URL(step 3).Start it with Docker:
docker compose up -d --buildOn ZimaOS, which has no
docker compose, runsh run.shinstead. The first start clones your docs site and installs it, which takes a few minutes.docker logs -f docs-publishershows progress; it's ready atlistening on port 8787.Give it a public https address, because claude.ai connects from the internet. Don't open a port on your router; use a tunnel:
Tailscale Funnel:
tailscale funnel --bg 8787gives youhttps://<machine>.<tailnet>.ts.net.Cloudflare Tunnel: point a hostname at
http://localhost:8787.
Check
https://<your-address>/health: it should say{"ok":true}. Put that address inPUBLIC_URL, then restart withdocker compose up -d.Add it in claude.ai: Customize → Connectors → Add custom connector, name
docs-publisher, URLhttps://<your-address>/mcp/<MCP_SECRET>.
Hosting it elsewhere works too: any Linux server, VPS, NAS or Raspberry Pi that runs Docker will do. It needs a small persistent folder (./data, mounted at /data) for the keys and the site clone.
Give other people access
Give each person their own key, so you can remove one without affecting anyone else, and every commit says who asked for it, for example docs: publish "FAQ" (by alice).
docker exec docs-publisher node src/keys-cli.js add alice # prints alice's connector URL
docker exec docs-publisher node src/keys-cli.js list # names only
docker exec docs-publisher node src/keys-cli.js remove alice # her URL stops working at onceSend each URL privately. Each person adds it in their own claude.ai as in step 4 above. Keys live in data/keys.json and take effect immediately, with no restart.
A connector URL is a password. Anyone who has it can publish, edit and delete pages on your live site, so only give it to people you trust.
Optional: let people request access on Telegram
The n8n/ folder has ready-made n8n workflows that do the key handling for you:
docs-access-bot.json: a Telegram bot. Someone sends/access, you reply/approve <chat_id> <name>, and the bot sends them their URL. You can also send/revoke <name>,/listand/myid. SetOWNER_CHAT_IDin the Route node to your own chat ID so that only you can approve.docs-access.json: two n8n forms to give and revoke access without Telegram.
They talk to a small admin API that turns on when you set ADMIN_TOKEN (24+ random characters). It listens on port 8788 and needs the header Authorization: Bearer <ADMIN_TOKEN>:
Request | What it does |
| List names |
| Create or replace a key and return the URL |
| Remove a key |
Keep port 8788 private: docker-compose.yml and run.sh publish it only on the Docker bridge address (172.17.0.1, Linux). Never expose it through a tunnel. The Telegram bot needs Telegram to reach n8n's /webhook path over https; expose only that path, never the n8n editor.
Settings
Set these in .env.
Variable | Needed | Default | Meaning |
| yes | – | Token with write access to the docs repo |
| yes | – |
|
| no |
| Branch the site is built from |
| no |
| Folder with the tutorials |
| server | – | Your own key (24+ random characters). Needed unless you use only personal keys |
| server | – | Public address, used to print personal URLs |
| server |
| File that holds personal keys |
| no |
| Port the server listens on |
| no | – | Local clone of the site repo. Turns on deploying from the connector (Docker sets it for you) |
| no |
| Redeploy after every change. |
| no |
| Command that builds and publishes the site, run in |
| no | – | Turns on the admin API |
Deploying: with SITE_DIR set, the connector pulls the repo and runs DEPLOY_COMMAND after every change; changes that arrive during a deploy are folded into one more. The default suits Docusaurus (docusaurus deploy pushes to gh-pages) and needs Git credentials that can push. If a CI workflow already deploys on every push, skip all this: leave SITE_DIR unset.
Good to know
After changing
.env, recreate the container withdocker compose up -d(orsh run.sh).docker restartkeeps the old settings.GitHub shows your token's owner as the author of every commit. The
(by <name>)in the message shows who asked. To undo a change, revert that commit and redeploy.Don't require pull requests on
mainwith branch protection: the connector commits to it directly.To update the server, pull the new code and run
docker compose up -d --build(orsh run.sh) again.
Tests
npm testAn end-to-end check using a fake GitHub and shell. It needs no token or network.
License
Available Tools
7 toolsdelete_tutorialB
Delete a tutorial from the documentation repo. Confirm with the user before calling.
Inputs: path (required), commit_message.
deploy_siteA
Rebuild the documentation website and publish it, so tutorials on the docs branch go live. Call it after publishing, editing or deleting tutorials. Takes a minute or two.
Inputs: no named parameters.
edit_tutorialA
Make a targeted edit to an existing tutorial by replacing an exact piece of text. The old text must appear exactly once.
Inputs: path (required), new_text (required), old_text (required), commit_message.
list_tutorialsA
List all tutorial Markdown files in the documentation repo.
Inputs: no named parameters.
publish_tutorialA
Create a new tutorial or fully replace an existing one. Front matter (title, description, sidebar_position) is added automatically if the content has none.
Inputs: title (required), content (required), path, description, +2 more.
read_tutorialB
Read the current Markdown source of a tutorial.
Inputs: path (required).
upload_imageA
Download an image from a public https URL and save it in the docs site, so a tutorial can show it without linking to another website. Returns the Markdown to put in the tutorial. Only use images you may reuse (for example under a free license), and credit the author in the tutorial when the license asks for it.
Inputs: url (required), name (required), alt, commit_message.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 7 tools
The tools mostly have clearly distinct purposes: list/read/publish/edit/delete tutorials, upload images, and deploy the site. The only mild ambiguity is between publish_tutorial (create or fully replace content) and deploy_site (make the site live), since both use publishing language, but the descriptions clarify the distinction.
All tool names follow a consistent snake_case verb_noun pattern: list_tutorials, read_tutorial, publish_tutorial, edit_tutorial, delete_tutorial, upload_image, deploy_site. The convention is predictable and easy to scan.
Seven tools is well-scoped for a documentation publishing server. Each tool corresponds to a meaningful operation in the tutorial lifecycle, with no obvious filler.
The surface covers the core tutorial lifecycle: list, read, create/replace, targeted edit, delete, image upload, and deployment. Minor gaps exist around image management (e.g., deleting or listing uploaded images) and deployment status/rollback, but normal documentation workflows are covered.
Maintenance
Related MCP Connectors
Read, edit, publish, and preview your pepita websites from Claude.
Access the GitHub API, enabling file operations, repository management, search functionality, and…
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceEnables Git and GitHub pull request operations through Claude AI, including repository management, branch operations, commits, and PR creation/commenting. Streamlines development workflows by providing Git commands and GitHub API integration through natural language interactions.-
- FlicenseNot gradedqualityDmaintenanceEnables to interact with GitHub repositories directly from Claude, supporting actions like viewing repos, checking status, committing and pushing changes, and managing pull requests.-
- AlicenseAqualityDmaintenanceEnables Claude to access and manage GitHub repositories dynamically at runtime, including private repos, with tools for browsing files, searching code, and viewing commits, pull requests, and issues.111ISC
- AlicenseNot gradedqualityDmaintenanceConnects Claude to GitHub repositories for querying repos, reviewing PRs, managing issues, searching code, and automating workflows.MIT