Search / ai.pubspace/mcp
PubSpace
R0· no sign-inPublish HTML or markdown from your agent as a shareable link, with password or work-email walls.
v0.25.1 · active · website · descriptor JSON · versions
Search / ai.pubspace/mcp
R0· no sign-inPublish HTML or markdown from your agent as a shareable link, with password or work-email walls.
v0.25.1 · active · website · descriptor JSON · versions
{
"mcpServers": {
"pubspace": {
"type": "http",
"url": "https://pubspace.ai/mcp",
"headers": {
"X-API-Key": "${X_API_KEY}"
}
}
}
}claude mcp add --transport http pubspace https://pubspace.ai/mcp --header "X-API-Key: ${X_API_KEY}"[mcp_servers.pubspace]
url = "https://pubspace.ai/mcp"
env_http_headers = { "X-API-Key" = "X_API_KEY" }
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"pubspace": {
"type": "remote",
"url": "https://pubspace.ai/mcp",
"enabled": true,
"headers": {
"X-API-Key": "{env:X_API_KEY}"
}
}
}
}{
"mcpServers": {
"pubspace": {
"type": "http",
"url": "https://pubspace.ai/mcp",
"headers": {
"X-API-Key": "${X_API_KEY}"
}
}
},
"deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=pubspace&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vcHVic3BhY2UuYWkvbWNwIiwiaGVhZGVycyI6eyJYLUFQSS1LZXkiOiIke1hfQVBJX0tFWX0ifX0%3D"
}{
"servers": {
"pubspace": {
"type": "http",
"url": "https://pubspace.ai/mcp",
"headers": {
"X-API-Key": "${X_API_KEY}"
}
}
}
}{
"mcpServers": {
"pubspace": {
"httpUrl": "https://pubspace.ai/mcp",
"headers": {
"X-API-Key": "${X_API_KEY}"
}
}
}
}extensions:
"pubspace":
enabled: true
name: "pubspace"
type: streamable_http
uri: "https://pubspace.ai/mcp"
headers:
"X-API-Key": "${X_API_KEY}"
timeout: 300
Placeholders to fill from your own secret store: ${X_API_KEY}. The registry never accepts secret values.
protocol.modernprotocol.statelessprotocol.transportprotocol.list_ttlauth.prm, auth.as_metadata, auth.cimdauth.secret_in_urltools.descriptionstools.description_lengthtools.schemastools.annotationstools.directory_hintstools.token_costtools.api_dumptools.hidden_textstability.changesstability.rug_pullstability.new_linksdeps.known_vulns, deps.mcp_sdk_version, deps.resolvableclaim_pageaddedFor pages published without an API key (previews): ask PubSpace to email your human one link that keeps every page under a claim token. Callable without an API key. Only call it after the human has told you their email; never invent or guess one. Opening the link shows a Keep button; pressing it, or one bare POST to the link (do that if the human pastes it to you), moves the pages into a free PubSpace space at <name>.pubspace.ai (or into the account they already have, as many pages as its plan holds): the preview links redirect there and stop expiring, even after the 7 days. Pass claim_token from publish_page, or omit it in the session that published the preview. Returns { ok, sent, email, expiresInHours, tell_user }: relay tell_user. The answer is the same whether or not the address already has an account. Once the human clicks, the pages that moved answer preview_already_claimed: ask them for their API key to keep updating those. Pages that did not fit an existing account's plan stay previews; the claim token still updates them, and calling claim_page again keeps them once there is room. When every page has moved, the claim token stops working. Fails with invalid_email, disposable_email_not_allowed, email_opted_out, invalid_claim_token, preview_already_claimed or rate_limited.
update_pagechangeddescription, input schemaReplace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space, and with secrets_detected (nothing changes) if the new content looks like it holds live credentials. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos.
Replace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space, and with secrets_detected (nothing changes) if the new content looks like it holds live credentials. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos. Connected without an API key, it updates a preview instead: pass the claim_token that publish_page returned (or omit it in the same session that published the page). The URL stays the same and the 7-day expiry does not move; previews have no drafts or version history. After the human claims the preview (claim_page), a page that moved into their account answers preview_already_claimed: reconnect with their API key to keep updating it. Pages that did not fit their plan stay previews and the claim token still updates them.
publish_pagechangeddescription, input schemaPublish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Content that looks like live credentials (API keys, private keys, .env lines, database URLs with passwords) is refused with secrets_detected and the line numbers; remove them and retry. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos. Returns { url, id, mode, visibility, dashboardUrl }.
Publish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Content that looks like live credentials (API keys, private keys, .env lines, database URLs with passwords) is refused with secrets_detected and the line numbers; remove them and retry. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos. Returns { url, id, mode, visibility, dashboardUrl }. Connected without an API key, it publishes a 7-day preview at a pubspace.page link instead (no account needed, up to 5 MB, no password, stricter sign-in lookalike check) and returns { url, id, mode, preview: true, expiresAt, claimToken, tell_user }: relay tell_user, and keep claimToken, the only way to change that page later (update_page with claim_token). Pass claim_token to add another page under the same token (up to 5 live previews). Later publishes in the same session join the first preview's token and do not return claimToken again: that first token covers them. To keep previews for good, call claim_page with the human's email.
update_pagechangeddescriptionReplace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space, and with secrets_detected (nothing changes) if the new content looks like it holds live credentials.
Replace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space, and with secrets_detected (nothing changes) if the new content looks like it holds live credentials. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos.
publish_pagechangeddescriptionPublish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Content that looks like live credentials (API keys, private keys, .env lines, database URLs with passwords) is refused with secrets_detected and the line numbers; remove them and retry. Returns { url, id, mode, visibility, dashboardUrl }.
Publish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Content that looks like live credentials (API keys, private keys, .env lines, database URLs with passwords) is refused with secrets_detected and the line numbers; remove them and retry. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos. Returns { url, id, mode, visibility, dashboardUrl }.
update_pagechangeddescriptionReplace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space.
Replace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space, and with secrets_detected (nothing changes) if the new content looks like it holds live credentials.
publish_pagechangeddescription, input schemaPublish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Returns { url, id, mode, visibility, dashboardUrl }.
Publish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Content that looks like live credentials (API keys, private keys, .env lines, database URLs with passwords) is refused with secrets_detected and the line numbers; remove them and retry. Returns { url, id, mode, visibility, dashboardUrl }.
set_commentsaddedTurn click-to-pin comments on or off for a page. While on, anyone who can view the page can click a spot on it to comment once they sign in with their email (on a work-email-locked page, their viewing sign-in is enough); the maker gets an email per comment. Off hides comments without deleting them. Off by default. Returns { ok, page_id, commentsEnabled }. Use it when the human asks for feedback or review on a page.
resolve_commentaddedMark a comment thread resolved (or reopen it with resolved: false) after you have addressed it. The pin turns grey and drops out of the open list for everyone; nothing is deleted. Returns { ok, page_id, thread_id, resolved }. Fails with thread_not_found if the id is not an open-or-resolved thread on that page.
list_commentsaddedRead the comments people left on a page: { page_id, url, commentsEnabled, threads: [{ id, resolved, on, comments: [{ id, author, body, createdAt }] }] }. Each thread is a pin someone dropped on the page; `on` is the text of the element they clicked, so you can tell what the comment is about without seeing the page. author is the commenter's full email. Read-only. Typical loop: list_comments → update_page with the fixes → resolve_comment on each thread you addressed. Open threads only unless include_resolved is true. Fails with page_not_found if the id is not in this space.
Showing the latest 10. Full history: list_changes · trend: quality JSON.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+dns-namespace +website +reachable +uptime-100% +updated-12d-ago -no-repository
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
| remote | auth | reachable | uptime 30d | p50 | protocol | last ok |
|---|---|---|---|---|---|---|
https://pubspace.ai/mcp streamable-http | none | yes | 100% | 287 ms | 2025-06-18 | 2026-11-14 |
claim_page | For pages published without an API key (previews): ask PubSpace to email your human one link that keeps every page under a claim token. Callable without an API key. Only call it after the human has told you their email; never invent or guess one. Opening the link shows a Keep button; pressing it, or one bare POST to the link (do that if the human pastes it to you), moves the pages into a free PubSpace space at <name>.pubspace.ai (or into the account they already have, as many pages as its plan holds): the preview links redirect there and stop expiring, even after the 7 days. Pass claim_token from publish_page, or omit it in the session that published the preview. Returns { ok, sent, email, expiresInHours, tell_user }: relay tell_user. The answer is the same whether or not the address already has an account. Once the human clicks, the pages that moved answer preview_already_claimed: ask them for their API key to keep updating those. Pages that did not fit an existing account's plan stay previews; the claim token still updates them, and calling claim_page again keeps them once there is room. When every page has moved, the claim token stops working. Fails with invalid_email, disposable_email_not_allowed, email_opted_out, invalid_claim_token, preview_already_claimed or rate_limited. |
create_account | Sign your human up for a free PubSpace space (no card) without leaving this session. Callable without an API key. Only call it after the human has told you their email and chosen a space name; never invent or guess either. Their pages will live at <subdomain>.pubspace.ai, so treat the name as permanent (renames are limited). A 6-digit verification code is emailed to them: ask them to read it to you, then call verify_email. Once verified, publish_page works in this same session. Returns { subdomain, email, apiKey, verificationRequired, connectHint }; persist the key with the connectHint command so future sessions start connected. Fails with email_taken (they already have an account: have them sign in and copy their key from Settings → Connect your agent), subdomain_taken, invalid_subdomain, invalid_email or rate_limited. If this session is already connected with a key, it fails with already_connected. |
delete_pagedestructive | Delete a page: its URL stops working at once. The maker gets only a brief undo in the dashboard, then it is purged for good (there is no restore tool). Only use it when the human asked for deletion; to hide a page reversibly, use unpublish_page instead. Returns { ok, id, deleted }; fails with page_not_found if the id is not in this space or is already deleted. |
get_pageread-only | Fetch one page by id: metadata always ({ id, title, url, project, views, live, workEmailGated, hasDraft, comments: { total, open }, createdAt, updatedAt, visibility }), plus the stored HTML when include_html is true. Read-only. Use it to read a page before editing it with update_page; use list_pages to find ids or browse. Fails with page_not_found if the id is not in this space or the page was deleted. |
list_commentsread-only | Read the comments people left on a page: { page_id, url, commentsEnabled, threads: [{ id, resolved, on, comments: [{ id, author, body, createdAt }] }] }. Each thread is a pin someone dropped on the page; `on` is the text of the element they clicked, so you can tell what the comment is about without seeing the page. author is the commenter's full email. Read-only. Typical loop: list_comments → update_page with the fixes → resolve_comment on each thread you addressed. Open threads only unless include_resolved is true. Fails with page_not_found if the id is not in this space. |
list_pagesread-only | List every page in the maker's space, newest first, with no paging: { total, pages: [{ id, title, url, project, views, live, workEmailGated, hasDraft, comments: { total, open }, createdAt, updatedAt }] }. Read-only. Use it to find a page_id before update_page / get_page / unpublish_page / delete_page, or to reuse an existing project name. Offline pages are included (live: false); deleted pages are not. Pass q to search instead of scanning the full list; use get_page when you need one page's HTML. |
publish_page | Publish a new HTML (or Markdown) page to the maker's PubSpace space and get back a live, shareable URL to hand to the human. Pages are unlisted by default — indexed by search engines only if the maker turns that on later (Pro); anyone with the link can view. Use this only for a brand-new page; to change a page that already exists, call update_page so its URL stays the same (find the id with list_pages). Each call creates a page that counts toward the plan's live-page cap; at the cap the call fails with doc_limit_reached and, on the free plan, an upgrade link to relay to the human. Content that looks like live credentials (API keys, private keys, .env lines, database URLs with passwords) is refused with secrets_detected and the line numbers; remove them and retry. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos. Returns { url, id, mode, visibility, dashboardUrl }. Connected without an API key, it publishes a 7-day preview at a pubspace.page link instead (no account needed, up to 5 MB, no password, stricter sign-in lookalike check) and returns { url, id, mode, preview: true, expiresAt, claimToken, tell_user }: relay tell_user, and keep claimToken, the only way to change that page later (update_page with claim_token). Pass claim_token to add another page under the same token (up to 5 live previews). Later publishes in the same session join the first preview's token and do not return claimToken again: that first token covers them. To keep previews for good, call claim_page with the human's email. |
resolve_comment | Mark a comment thread resolved (or reopen it with resolved: false) after you have addressed it. The pin turns grey and drops out of the open list for everyone; nothing is deleted. Returns { ok, page_id, thread_id, resolved }. Fails with thread_not_found if the id is not an open-or-resolved thread on that page. |
set_comments | Turn click-to-pin comments on or off for a page. While on, anyone who can view the page can click a spot on it to comment once they sign in with their email (on a work-email-locked page, their viewing sign-in is enough); the maker gets an email per comment. Off hides comments without deleting them. Off by default. Returns { ok, page_id, commentsEnabled }. Use it when the human asks for feedback or review on a page. |
unpublish_page | Take a page offline without deleting it: its URL shows an "offline" notice to viewers, and the content, id, URL and view count are kept. Pass restore: true to put it back online at the same URL. Prefer this over delete_page when the human wants a page hidden or paused. Calling it twice is harmless. Returns { ok, id, live }; fails with page_not_found if the id is not in this space. |
update_pagedestructive | Replace the content of an existing page in place: the same URL serves the new content immediately, so links the human already shared keep working. Use this instead of publish_page whenever the page already exists. The previous version stays restorable from the dashboard for 7 days (Pro keeps full version history). Pass draft: true to stage the update instead: nothing changes for viewers until the maker reviews the previewUrl and presses "Sync to live"; use it when the human asked to see changes before they go out. Fails with page_not_found if the id is not a live or offline page in this space, and with secrets_detected (nothing changes) if the new content looks like it holds live credentials. A page that works as a sign-in or payment form sending what people type to another site can be refused with unsafe_page_detected (no override): make such forms non-functional demos. Connected without an API key, it updates a preview instead: pass the claim_token that publish_page returned (or omit it in the same session that published the page). The URL stays the same and the 7-day expiry does not move; previews have no drafts or version history. After the human claims the preview (claim_page), a page that moved into their account answers preview_already_claimed: reconnect with their API key to keep updating it. Pages that did not fit their plan stay previews and the claim token still updates them. |
verify_email | Finish account verification with the 6-digit code PubSpace emailed to the human (ask them to read it to you). Publishing unlocks on success. Works in the session where create_account ran, or with an API key for an unverified account. Returns { ok, verified, subdomain }; fails with invalid_code (and attemptsRemaining), code_expired, too_many_attempts or already_verified. |
Schemas: list_tools.
{
"name": "ai.pubspace/mcp",
"title": "PubSpace",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"remotes": [
{
"url": "https://pubspace.ai/mcp",
"type": "streamable-http",
"headers": [
{
"name": "X-API-Key",
"isSecret": true,
"description": "Your PubSpace API key (Settings → Connect your agent). Optional: without one, call create_account + verify_email to sign up from the chat."
}
]
}
],
"version": "0.25.1",
"websiteUrl": "https://pubspace.ai",
"description": "Publish HTML or markdown from your agent as a shareable link, with password or work-email walls."
}