DocPin

Publiez des pages HTML, des rapports et des tableaux de bord générés par votre IA sur votre propre lien, et choisissez qui peut les consulter.

Serveur MCP hébergé

npx add-mcp 'https://mcp.docpin.app/mcp'

S’installe dans Claude Code, Codex, Cursor et plus

Documentation

MCP: DocPin for AI apps

DocPin is a remote Model Context Protocol server. Connected to Claude, ChatGPT or another MCP client, an AI app can publish pages, update them, choose who can open them, and push data to them.

At a glance

Server URLhttps://mcp.docpin.app/mcp (streamable HTTP)
AuthOAuth. The person signs in to DocPin and picks a default workspace. One connection can use every workspace they can publish to, with their rights in each
Scopespublish for pages, data and entries; settings for workspace settings, granted when "Workspace settings" is ticked on connect. setup_docpin works without it
ResultsText for the model, plus structuredContent with links and ids. Errors come back with isError: true and a message to show the person
InstructionsSent on connect: how published pages run, the same rules as How pages run

Connect

ClientSteps
ClaudeCustomize → Connectors → Add → Add custom connector. Name it DocPin, paste the server URL, then Connect and sign in
ChatGPTchatgpt.com/plugins → Add → Add custom MCP server. Name it DocPin, keep OAuth, paste the server URL, create it, then Connect. In a chat, type @DocPin
Other clientsAdd a remote server with the URL. The client discovers OAuth through the server's /.well-known documents and registers itself

Tools

Pages are referred to by slug (plus board if it's in one) or by id from list_pages.

Every tool acts in the default workspace unless you pass workspace (a workspace slug); list_workspaces lists the ones the person can publish to. Connections made before 11 November 2026 cover one workspace: disconnecting and connecting again upgrades them.

Publish and manage pages

ToolKey argumentsWhat it does
publish_pagehtml or files ([{path, content, encoding?}] with an index.html; encoding: "base64" for binary files); optional slug, title, board, unlisted, access, draftPublishes and returns the links. Reusing a slug adds a version behind the same link. A draft returns url: null and a previewUrl that lasts about an hour
create_upload_linkSame options as publish_pageFor agents that can run shell commands: a one-time link (15 minutes). curl -F file=@page.html <uploadUrl> publishes the file and prints the links as JSON. Faster, and works up to 25 MB, .zip included
set_draftdraft, and access (plus listed) when sharingdraft: false shares a draft: the AI asks the person who should open it. draft: true makes a page a draft again
list_pagesoptional boardPages with links and slugs, newest first
rename_pagenew_title and/or new_slugOld links redirect; the short link never changes
move_pageto_board (empty string for the top level), optional listed, unlistedInto or out of a board, and whether it shows in listings. The old link redirects
archive_pagearchivedHides it from the page list without deleting it
delete_pagethe pageDeletes it. Only when the person explicitly asks
set_accessaccess (kind: team, public, password, people, inherit)Who can open a page or, with only board, a whole board
list_versions / restore_versionversion_idVersion history, and putting an earlier version live
get_page_viewsthe pageHow often it was opened, and who opened it when signed in. Teammates' visits aren't counted

Data and entries

ToolKey argumentsWhat it does
get_page_datathe pageThe page's data: the JSON object it reads with docpin.data()
set_page_datadata, optional replace: trueMerges data in (null removes a key), or replaces everything. No new version
set_page_entrieson: true or falseLets viewers save entries (votes, RSVPs, answers), or stops new ones
get_page_entriesoptional collectionWhat viewers saved: totals, collections and the newest entries, with emails

Workspaces and boards

ToolWhat it does
list_workspacesThe workspaces the person can publish to, with their slugs, links, plan and role, and which is the default
list_boards / create_board / update_board / delete_boardBoards: landing pages that group related pages

Workspace settings

Most of these need the workspace owner. A logo works on Free; the rest of branding, custom domains and more teammates need Pro. They use the settings scope; a connection without it must be disconnected and connected again. ChatGPT doesn't show setup_docpin or get_billing_link.

ToolWhat it does
setup_docpinA guided setup: who sees new pages, existing work, branding, domain, team and Pro. Read-only
get_workspace_settingsPlan, defaults, branding, custom domains and their DNS status, members and invites, and billing, in one call
update_defaultsWhat new pages start as (new_pages: draft, team, link or listed), and how link and listed pages are protected (access, Pro)
set_branding_imageslot (logo, logo-dark, icon or image) from an https url or base64, or remove: true
set_board_templatetemplate: default, clean, or custom with Mustache html (branding). Add board for one board, with inherit to undo; dark for dark mode
add_custom_domain / check_custom_domain / remove_custom_domainConnect a domain like docs.acme.com. Adding returns the CNAME record to set
invite_member / remove_memberInvite someone by email, or remove them or cancel their invite
get_billing_linkTo upgrade, a Stripe checkout link (interval: month or year); the person pays on Stripe. Already on Pro, the app's billing page

Deleting the workspace or account, and creating API keys, stay in the app.

How a model should build pages

PageBuild it like this
Static (a report, a proposal)publish_page with a clear slug. Republish with the same slug to update
Updated over time (a dashboard)Render from docpin.data() or docpin.onData(), with an empty state. publish_page, then set_page_data. Later updates are set_page_data alone. Call get_page_data before replacing data
Collecting from viewers (a poll, RSVPs)Use docpin.shared and docpin.mine, save from a click handler, and show entries with textContent. publish_page, then set_page_entries with on: true. Read results with get_page_entries
Interactive (tabs, filters)Keep shareable state in the URL with history.replaceState, and personal state in localStorage

Person: Make me a dashboard of this week's support tickets and publish it to DocPin.

Model: (writes HTML that renders from docpin.onData, calls publish_page with slug support, then set_page_data with { "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_data with { "open": 37, "closed": 131, "asOf": "…" }) Updated. Anyone with it open will see the new numbers within a minute.

Limits

publish_page and set_page_data are each limited to about 30 calls a minute per workspace.