Skip to main content
Glama
README.md
# dochost MCP server

[![dochost-mcp MCP server](https://glama.ai/mcp/servers/zyli5313/dochost-mcp/badges/score.svg)](https://glama.ai/mcp/servers/zyli5313/dochost-mcp)

Publish **Markdown or HTML to a clean, shareable link** โ€” straight from your AI
assistant. The dochost MCP server gives Claude, ChatGPT, Cursor and any other MCP
client six tools โ€” `publish`, `update_page`, `list_my_pages`, `get_page`,
`get_account`, `delete_page` โ€” so your assistant can hand back a public
[dochost](https://dochost.io) link and then keep maintaining it. No copy-paste,
no separate dashboard.

- ๐ŸŒ Website: **https://dochost.io**
- ๐Ÿ”Œ MCP server: **https://dochost.io/mcp**
- ๐Ÿ›ฐ๏ธ Endpoint: `https://dochost.io/api/mcp` (Streamable HTTP, OAuth)
- ๐Ÿ”‘ Auth: OAuth sign-in โ€” **no API keys**

## Why

Your LLM produced a report, a README, an HTML artifact. Sending it shouldn't mean
a screenshot or a raw `.md` blob. dochost turns that output into a normal web page
at its own URL, in one tool call. Markdown **and** HTML are rendered live.

## Quick start

**Claude Code** (one line):

```bash
claude mcp add --transport http dochost https://dochost.io/api/mcp
```

Then run `/mcp` inside Claude Code and approve in the browser. Add `--scope user`
to use it in every project.

**Claude Desktop / Cursor / VS Code / Windsurf** โ€” add a remote HTTP server:

```json
{
  "mcpServers": {
    "dochost": {
      "type": "http",
      "url": "https://dochost.io/api/mcp"
    }
  }
}
```

You authorize once via OAuth in the browser; the assistant then publishes **as
you**, and output follows your dochost plan's entitlements.

## Stdio / Docker bridge

For clients or directory evaluators that need a local stdio process, this
repository includes a bridge to the same hosted MCP endpoint:

```sh
npm ci --ignore-scripts
node server/index.js
```

Or run it in Docker:

```sh
docker build -t dochost-mcp .
docker run --rm -i dochost-mcp
```

Node.js 22 or newer is required. The bridge forwards the live tools and schemas;
it is not a self-hosted copy of the dochost application. Initialization and
tool discovery are public. Interactive clients can use OAuth; headless tool
execution needs an existing `DOCHOST_API_KEY` runtime secret (Docker:
`docker run --rm -i -e DOCHOST_API_KEY dochost-mcp`).

Maintainers: see [Glama claim, build and release instructions](docs/glama-release.md).

## Which auth method?

| Client | Recommended auth | Why |
|---|---|---|
| **OpenClaw**, **Hermes** | **API key** | Headless agents (e.g. a Telegram orchestrator). A static Bearer key works with the plain-HTTP skill and any MCP runner, with no browser step per session. |
| Claude, Cursor, ChatGPT, VS Code, Windsurf, and all other MCP clients | **OAuth** | One browser approval, nothing long-lived stored in config; the assistant publishes **as you**. |

Keep the API key like any secret: store it as an environment variable / host
secret (never commit it), and revoke or rotate it from **Settings โ†’ API keys** if
it leaks.

## Agents (OpenClaw, Hermes) โ€” API key

OpenClaw and Hermes are headless, so they authenticate with an **API key**. Create
one at [dochost.io](https://dochost.io) โ†’ **Settings โ†’ API keys**, export it as
`DOCHOST_API_KEY`, and either:

- **Install the skill** โ€” a self-contained `publish` skill that works on any agent
  that can make an HTTP request: [`skills/dochost-publish/`](./skills/dochost-publish/SKILL.md).
- **Wire the MCP** โ€” point the agent at `https://dochost.io/api/mcp` with the key as
  a Bearer header: [`examples/mcporter.config.json`](./examples/mcporter.config.json).

Per-host install guides:

- **OpenClaw** โ†’ [`clients/openclaw.md`](./clients/openclaw.md)
- **Hermes** โ†’ [`clients/hermes.md`](./clients/hermes.md)

One-shot from a shell: [`examples/publish.sh`](./examples/publish.sh).

## Tools

Six tools. `publish` creates; the rest let the assistant keep working with what it
already published, instead of stranding a link every time you revise something.

### `publish`
Publish Markdown or HTML as a hosted page and get a shareable URL.

| Parameter | Type | Notes |
|---|---|---|
| `body` | string (required) | The Markdown or HTML content to publish. |
| `format` | `"markdown"` \| `"html"` | Auto-detected when omitted. |
| `public` | boolean | List on Explore. Defaults to `false` (unlisted). |
| `customSlug` | string ยท Pro | Choose the link path instead of a random slug. |
| `password` | string ยท Pro | Gate the page behind a password. |
| `noBranding` | boolean ยท Pro | Hide the dochost footer badge. |

Returns `url`, `slug`, `expiresAt`, and an `editToken`.

> Example: *"Publish my Q3 report as a private page with a password."* โ†’
> `dochost.co/d/q3-report` (password-gated, 7-day link on free).

### `update_page`
Replace the content of a page **in place**. The URL, view/like counts and expiry
all survive โ€” only `body`, `format` and `title` change.

| Parameter | Type | Notes |
|---|---|---|
| `slug` | string (required) | The page to update. |
| `body` | string (required) | The new Markdown or HTML content. |
| `format` | `"markdown"` \| `"html"` | Auto-detected when omitted. |
| `title` | string | Override the derived title. |

> Prefer this over publishing again whenever you are revising something already
> published โ€” a second `publish` mints a second link and strands the one the
> reader already has. Resending identical content is a no-op.

### `list_my_pages`
List the pages you have published, newest first. Paginated (`limit`, `offset`);
returns compact records without page bodies.

### `get_page`
Look up one page by `slug`: title, format, status, view/like counts, expiry, and
whether it is password-protected. Never returns the body or the password.

### `get_account`
Your plan, page-quota usage and entitlement flags (size cap, custom slug,
password, branding). Worth calling before `publish` so the assistant knows your
limits up front instead of failing on them.

### `delete_page`
Permanently delete a page by `slug`. The link stops working immediately and the
slug is freed. Deleting an already-deleted page is a safe no-op.

## Notes

- Ownership and entitlements come from your authenticated account, never from
  tool input.
- Published pages live on **`dochost.co`**, a separate cookieless content origin
  โ€” never on the app origin `dochost.io`. That is what lets dochost serve author
  HTML under a hardened policy without it touching your session. `dochost.io/d/โ€ฆ`
  permanently redirects to `dochost.co/d/โ€ฆ`, so old links keep working.
- Free links last 7 days; permanent links, password, custom slug, custom
  subdomain and branding removal are on the paid plans โ€” see
  [dochost.io](https://dochost.io).

## Links

- Homepage โ€” https://dochost.io
- MCP setup & docs โ€” https://dochost.io/mcp

## License

MIT โ€” see [LICENSE](./LICENSE).

TDQS

A4.4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct responsibility: publish creates, list_my_pages enumerates, get_page retrieves metadata for one page, update_page modifies content, delete_page removes, and get_account covers account/plan details. The potential publish/update_page overlap is explicitly disambiguated in the descriptions.

Naming Consistency4/5

Most tools follow a verb_noun pattern: list_my_pages, get_account, get_page, update_page, delete_page. The lone exception is publish, which lacks an explicit object like publish_page, and list_my_pages includes a possessive that the other list/get tools do not.

Tool Count5/5

Six tools is well-scoped for a page hosting service: publish, list, get, update, delete, and account awareness. Each tool covers a necessary workflow step without unnecessary redundancy.

Completeness4/5

The core page lifecycle is covered: create, list, read metadata, update, delete, plus account/plan information. Minor gaps exist because page bodies are never retrievable via the API, so content recovery or editing an already-published page without the original source is not fully supported.

Maintenance

ActivityMaintained
ResponsivenessNo issues