DocPin
Publish HTML pages, reports and dashboards from your AI to your own link, and choose who can open them.
Hosted MCP Server
npx add-mcp 'https://mcp.docpin.app/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
MCP: DocPin for AI apps
DocPin is a remote Model Context Protocol server. Once it's connected, an AI app like Claude or ChatGPT can publish pages, update them, manage who can open them, and push data to them.
- Server URL:
https://mcp.docpin.app/mcp(streamable HTTP) - Auth: OAuth. The person signs in to DocPin and picks one workspace; the app then acts in that workspace with their rights.
Connect
Claude: Customize → Connectors → Add → Add custom connector. Name it DocPin, paste the server URL, then Connect and sign in.
ChatGPT: chatgpt.com/plugins → Add → Add custom MCP server. Name it DocPin, keep OAuth, paste the server URL, create it, then Connect DocPin. In a chat, type @DocPin.
Other MCP clients: add a remote server with the URL above. The client discovers OAuth through the server's /.well-known documents and registers itself.
Tools
Pages are referred to by slug (plus board if the page is in one) or by id from list_pages.
| Tool | What it does |
|---|---|
publish_page | Publishes HTML (html) or several files (files: [{path, content}] with an index.html) and returns the links. Reusing a slug publishes a new version behind the same link. Optional title, board, unlisted, access, draft. A draft returns url: null and a previewUrl that works for about an hour and isn't for sharing. |
create_upload_link | For agents that can run shell commands. Returns a one-time link (15 minutes) for a page saved as a file: curl -F file=@page.html <uploadUrl> publishes it and prints the links as JSON. Much faster than publish_page and works for large pages (up to 25 MB; a .zip with an index.html works too). Same options as publish_page. |
set_draft | draft: false shares a draft. It needs access (and listed: true for the home page): the AI asks the person who should open it. draft: true makes a page a draft again. |
list_pages | Pages with their links and slugs, newest first. Optional board. |
rename_page | New title and/or slug. Old links redirect, and the short link never changes. |
move_page | Moves a page into or out of a board. |
archive_page | Hides a page from the page list without deleting it (archived: false brings it back). |
delete_page | Deletes a page. Only when the person explicitly asks. |
set_access | Who can open a page or board: team (workspace members), public, password, people (emails and @domains), or inherit. Passwords and people-only pages need Pro. |
list_versions / restore_version | Version history, and putting an earlier version live again. |
get_page_views | How often a page was opened, and by whom on people-only pages. |
get_page_data | A page's data: the JSON object it reads with docpin.data(). |
set_page_data | Updates a page's data without republishing. Merges by default (null removes a key); replace: true replaces everything. |
list_boards / create_board / update_board / delete_board | Boards: landing pages that group related pages. |
Workspace settings
Everything in Settings in the DocPin app can be changed from an AI app too. Most of these need the workspace owner, and branding, custom domains and teammates need Pro.
| Tool | What it does |
|---|---|
setup_docpin | A guided setup for new users: who sees new pages, existing work, branding, domain, team and Pro. Any member; it's read-only. |
get_workspace_settings | The plan, defaults for new pages, branding, custom domains and their DNS status, members and invites, and billing, in one call. Any member. |
update_defaults | What new pages start as (new_pages: draft, team, link or listed), and for link and listed, how they're protected (access, Pro). Pages published into a board follow the board. Existing pages keep their settings. |
set_branding_image | The logo, tab icon or share image, from an https url or base64 data, or remove: true. |
set_board_template | How the home page and board pages look: default, clean, or custom with your own Mustache html (see branding). Add board to give one board its own look, or inherit to undo that. |
add_custom_domain / check_custom_domain / remove_custom_domain | Connect a domain like docs.acme.com. Adding returns the CNAME record to set, and a one-click link where the DNS provider supports it. Checking is open to any member. |
invite_member / remove_member | Email an invite, or remove someone (or cancel their invite) by email. |
get_billing_link | A Stripe link to upgrade (interval: month or year) or to manage an existing subscription. The person pays on Stripe themselves. |
Deleting the workspace or account, and creating API keys, stay in the app. These tools use the settings OAuth scope, which connections get when they're approved with "Workspace settings" ticked. A connection without it has to be disconnected and connected again to use them.
The server also returns instructions on connect that summarise how published pages run. They're the same rules as How pages run.
Building pages with an AI app
For a page that's interactive or updated over time, a model should:
- Write the page to read from page data. Lay out the HTML, then fill values from
docpin.data(), ordocpin.onData()for pages left open. Always handle empty data. - Publish it with
publish_pageand a clearslug. - Fill in the data with
set_page_data. Useget_page_datafirst when changing an existing page's data, so no keys are lost. - Update later with
set_page_dataalone. Republish only when the layout changes, withpublish_pageand the same slug. - Keep shareable state in the URL (
history.replaceState) and personal state inlocalStorage.
Example conversation:
Person: Make me a dashboard of this week's support tickets and publish it to DocPin.
Model: (writes HTML that renders from
docpin.onData, callspublish_pagewith slugsupport, thenset_page_datawith{ "open": 42, "closed": 118, "asOf": "…" }) It's live at acme.docpin.it/support.Person (the next day): Update it: 37 open, 131 closed.
Model: (calls
set_page_datawith{ "open": 37, "closed": 131, "asOf": "…" }) Updated. Anyone with it open will see the new numbers within a minute.
Notes for app builders
- Tool results include structured content (
structuredContent) alongside the text, for example links and ids frompublish_page. - Errors come back as tool results with
isError: trueand a plain-English message to show the person, such as an upgrade prompt for Pro features. set_page_dataand publishing are each rate limited to about 30 a minute per workspace.