Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/cryguy/hashboard/llms.txt

Use this file to discover all available pages before exploring further.

Hashboard ships a Model Context Protocol server at /mcp that exposes the full product surface — boards, cards, documents, attachments, comments, labels, search, and admin operations — as 54 callable tools. Any MCP-compatible AI client can connect with a single bearer token and immediately read, write, and navigate a Hashboard instance with the same fidelity as the REST API or the browser UI.

Endpoint and transport

The MCP server listens at POST /mcp. It uses the @modelcontextprotocol/sdk’s WebStandardStreamableHTTPServerTransport with enableJsonResponse: true, making every exchange a single HTTP request/response pair — no persistent connection, no SSE stream. Stateless by design. Each POST creates a fresh McpServer instance bound to the authenticated actor. There is no session to resume or delete; GET /mcp and DELETE /mcp both return 405 with a plain explanation. This keeps the server compatible with the synchronous service layer (no await can interleave inside a transaction) and eliminates state management entirely.

Authentication

Authentication is a single Authorization: Bearer hb_… header — the same token used for every REST call. The SvelteKit hooks.server.ts gate resolves the actor before the MCP route runs, so the tool implementations receive a fully authenticated principal and never need to inspect credentials themselves. An MCP session acts as the agent, not as its owner. Every tool call is attributed to the agent’s own identity in activity feeds, card histories, and comments.
There is no OAuth flow for the MCP server. Tokens are issued via POST /api/v1/tokens on the REST API (see Agent Management). Add an OAuth layer only if a specific connector UI — such as claude.ai’s — requires it.

Connecting an MCP client

The configuration below works with Claude Desktop and any other client that supports streamable HTTP transport:
{
  "mcpServers": {
    "hashboard": {
      "transport": "http",
      "url": "https://hashboard.example.com/mcp",
      "headers": {
        "Authorization": "Bearer hb_YOUR_AGENT_TOKEN"
      }
    }
  }
}
Replace https://hashboard.example.com with your instance’s origin and hb_YOUR_AGENT_TOKEN with a token issued to your agent principal.

How read tools work

get_board, get_card, and get_doc return the same markdown rendition served at /<type>/<id>.md. The response opens with YAML frontmatter carrying all IDs and the doc version field needed for save_doc. Every link in the body uses the .md suffix so follow-up fetches need no Accept header. This means an agent navigating the workspace sees one consistent format across direct URL fetches and MCP tool calls.

Error handling

Service errors are translated into MCP tool errors the model can read and react to:
  • ConflictError (optimistic concurrency on doc saves) returns isError: true with the message and the currentVersion value so the agent can re-read and retry.
  • All other ServiceError subtypes (NotFoundError, ForbiddenError, ValidationError, etc.) return isError: true with the error message.
  • Unexpected errors are re-thrown and surface as uncaught exceptions rather than being swallowed silently.

All 54 tools

The credential and identity lifecycle — token creation/revocation, agent creation, and agent deactivation — is deliberately absent from MCP. Fresh secrets must never transit an LLM context. These operations are REST-only. The exact tool count is asserted in server.spec.ts; adding a tool requires updating that assertion.
ToolDescription
whoamiReturns your principal ID, kind (human or agent), display name, and either your role (humans) or your owner’s ID (agents). Use this to confirm which identity the current token resolves to.
ToolDescription
list_boardsList boards visible to you — name, ID, visibility, and URL. Pass archived: true to list archived boards instead.
get_boardFull board as markdown: columns with their cards, each linked as /cards/<id>. Frontmatter carries the board ID and metadata.
create_boardCreate a board with a name, optional description, and visibility (private by default). Board grants cascade to cards and their docs.
update_boardUpdate a board’s name, description (pass null to clear), or visibility. Visibility changes are creator-only.
archive_boardArchive a board (creator-only).
unarchive_boardRestore an archived board (creator-only).
get_board_archiveReturns the archived columns and cards for a board — the IDs unarchive_column and unarchive_card need.
ToolDescription
list_columnsList the columns of a board in position order.
create_columnAdd a column at the end of a board.
rename_columnRename a column.
move_columnReorder a column by specifying prevId and/or nextId neighbor IDs. Omit both to move to the end.
archive_columnArchive a column (board-creator-only). Its ID remains discoverable via get_board_archive.
unarchive_columnRestore an archived column (board-creator-only).
ToolDescription
get_cardFull card as markdown: frontmatter with IDs, doc version, labels, assignees, linked docs, and attachment URLs; description; linked documents; attachments; comments.
create_cardCreate a card. Provide columnId to place it on a board, or omit it for a loose (inbox) card. content is the full-markdown description; dueAt is ISO 8601.
update_cardUpdate card fields: title, dueAt (ISO 8601 or null to clear), visibility. Content edits go through save_doc.
move_cardPlace a card in a column between prevId/nextId neighbors. Omit both to append at the end.
detach_cardRemove a card from its board entirely; it becomes a loose card.
archive_cardArchive a card (creator-only).
unarchive_cardRestore an archived card (creator-only).
assign_cardAssign a principal (human or agent) to a card. Reserved for the card’s creator and current assignees. Assigning a private card shares it with the assignee durably.
unassign_cardRemove a principal from a card’s assignee list.
inboxYour household’s loose cards — created by or assigned to you or your agents. Pass archived: true for archived loose cards.
ToolDescription
list_docsList standalone documents visible to you. Optionally filter by boardId.
get_docA document as markdown with frontmatter. version is the baseVersion for save_doc; linked_cards lists cards referencing it.
create_docCreate a standalone markdown document, optionally filed under a board.
save_docSave a document (card descriptions included — use the docId from get_card frontmatter). baseVersion must match the version you read; a conflict returns currentVersion to retry with.
delete_docPermanently delete a standalone document (creator-only). Card description docs cannot be deleted — archive the card instead.
set_doc_visibilityChange a standalone document’s visibility (creator-only). Card descriptions inherit their card’s visibility and cannot be changed here.
list_revisionsA document’s content snapshots, newest first: version, author ID, timestamp, and character count. Does not include content bodies.
ToolDescription
list_attachmentsFiles attached to exactly one card or standalone document. Pass exactly one of cardId or docId. Each file is served at /attachments/<id>.
attach_fileAttach a file to a card or standalone document with its content base64-encoded. See the note below about size limits.
delete_attachmentRemove an attached file. Allowed for the uploader’s household or the subject’s creator (moderation).
MCP uploads use base64-encoded content in a single message, which keeps the entire payload in the conversation context. This path has a smaller size cap than the REST binary upload endpoint. For larger files, POST the raw bytes to /api/v1/cards/<id>/attachments?filename=NAME or /api/v1/docs/<id>/attachments?filename=NAME with Content-Type: application/octet-stream. Do not use multipart/form-data — SvelteKit rejects cross-site form submissions before the route runs.
ToolDescription
add_commentComment on exactly one of a card or a document. Pass exactly one of cardId or docId.
delete_commentDelete a comment — allowed for the author’s household or the creator of the card/document (moderation).
ToolDescription
list_labelsThe global label palette: names, IDs, and colors.
create_labelAdd a label to the global palette. Names are unique instance-wide.
update_labelRename or recolor a palette label; the change applies everywhere the label is used.
delete_labelDelete a palette label, detaching it from every card.
add_label_to_cardAttach a label from the global palette to a card.
remove_label_from_cardDetach a label from a card (the label itself stays in the palette).
ToolDescription
list_principalsWorkspace directory: all non-disabled humans and agents, useful for finding principal IDs to pass to assign_card. Includes the synthetic Guest principal (anonymous link visitors) — it cannot be assigned.
ToolDescription
searchSubstring search over board names/descriptions, card titles/descriptions, and standalone document titles/content. Visibility-filtered; minimum 2 characters. Results grouped by boards, cards, and documents.
ToolDescription
get_activityActivity feed for exactly one of a board, card, or document, newest first. Pass exactly one of boardId, cardId, or docId. Default 50 events, max 200.
These tools require the admin or super role on the acting principal (agents inherit their owner’s role).
ToolDescription
admin_get_settingsInstance settings: local registration toggle and invite-only mode.
admin_update_settingsToggle local registration (registrationEnabled) and invite-only mode (inviteOnly).
admin_list_usersEvery principal with role, kind, and sign-in methods (local username / OIDC).
admin_set_roleSet a human’s instance role (user or admin). The superadmin cannot be modified, and super cannot be granted via the API.
admin_list_invitesRegistration invites and their usage. Raw codes are never stored — this returns hashes and metadata only.
admin_create_inviteCreate a single-use invite code, optionally with an ISO 8601 expiry. The code is returned exactly once.
admin_delete_inviteRevoke an unused invite. Used invites remain as an audit trail.

Build docs developers (and LLMs) love