Multitenant MCP Server for HedgeDoc

HedgeDoc MCP Multitenant Proxy Server

This repository contains a Model Context Protocol (MCP) server that actsas a secure, multi-tenant proxy between an AI Assistant and the HedgeDocbackend API. It exposes 27 MCP tools covering 5 resource domainswith full CRUD and permission management.

โœจ Features

  • ๐Ÿ”‘ Identity Passthrough โ€” Extracts the Authorization: Bearer <token>header from incoming HTTP requests and forwards it to the HedgeDoc APIwithout server-side authentication.
  • ๐Ÿ‘ฅ Multi-Tenancy โ€” Uses Python contextvars to maintain thread-safeuser identity isolation, ensuring all AI-driven actions are scoped tothe authenticated user's permissions.
  • ๐Ÿ“Š Full HedgeDoc Coverage โ€” 27 tools mapped to HedgeDoc API endpointsacross 5 resource domains.
  • โšก TOON Optimization โ€” Bulk list responses are automatically compressedusing TOON (Token-Optimized Object Notation) to reduce token consumptionand maximize context window efficiency.
  • ๐Ÿš€ Efficient Gets โ€” GET responses return only commonly used fields bydefault. Full objects are available via an include_all_fields flag.
  • ๐Ÿงช Comprehensive Testing โ€” 38 automated tests covering all tooldomains, run via the test runner pipeline.

๐Ÿ”ง Environment Variables

Variable Required Description
HEDGEDOC_BASE_URL Yes Docker-internal URL of the HedgeDoc API (e.g. http://hedgedoc-backend:3000).
MCP_SERVER_PORT Yes Port number the MCP server listens on.
ALLOW_ALL_AGGREGATE No When true, aggregate listing tools honor the include_all_fields parameter. When false (default), the parameter is silently forced to False for aggregate list operations.
IS_STATEFUL No When true, uses stateful Streamable HTTP with session tracking. When false (default), uses stateless mode.
HEDGEDOC_PUBLIC_URL No Public-facing URL for note_url in responses. Defaults to HEDGEDOC_BASE_URL if not set.

๐Ÿ“ฆ Installation & Local Development

  1. Ensure you have Python 3.12+ installed.
  2. Install dependencies:
    pip install fastmcp httpx pydantic uvicorn toon-mcp-server
    
  3. Run the server:
    export HEDGEDOC_BASE_URL=http://localhost:7462
    export HEDGEDOC_PUBLIC_URL=https://hedgedoc.example.com
    export MCP_SERVER_PORT=80
    python -m src.main
    

๐Ÿณ Docker Deployment

Build and run the server using Docker:

docker build -t hedgedoc-mcp:latest .
docker run -d --name hedgedoc-mcp \
    -e HEDGEDOC_BASE_URL="http://hedgedoc-backend:3000" \
    -e HEDGEDOC_PUBLIC_URL="https://hedgedoc.example.com" \
    -e MCP_SERVER_PORT=80 \
    -e IS_STATEFUL=false \
    hedgedoc-mcp:latest

The MCP server serves at `http://hedgedoc-mcp:80/mcp` (Streamable HTTP).

โš ๏ธ Important Notes

  • ๐Ÿ“‹ include_all_fields โ€” The include_all_fields parameter (availableon all get_* and list_* tools) controls whether all available fieldsare included in responses. Defaults to False for performance; set toTrue only when additional fields are needed.
  • โšก TOON Compression โ€” All bulk list responses are automaticallycompressed using TOON to reduce token consumption by 30โ€“60%.
  • ๐Ÿ“ Required Fields & Defaults โ€” Each create_* tool requires specifickey fields. All other fields default to empty strings or reasonable values.The owner field is automatically set to the authenticated user for mostresources.

๐Ÿ› ๏ธ API Tool Mapping

The server implements 27 MCP tools organized into the following categories:

๐Ÿ“„ Notes Core (6 tools)

  • create_note โ€” Create a new note from markdown content
  • get_note_by_id โ€” Get a single note by ID or alias
  • update_note โ€” Update an existing note's content
  • delete_note_by_id โ€” Delete a note by ID or alias
  • get_note_content โ€” Get raw markdown content of a note
  • get_note_metadata โ€” Get a note's metadata (title, tags, etc.)

๐Ÿ“Ž Notes Advanced (7 tools)

  • list_note_media โ€” List all media files attached to a note
  • list_note_revisions โ€” List all revisions of a note
  • get_note_revision_by_id โ€” Get a specific revision by UUID
  • revert_to_revision โ€” Revert a note to a previous revision
  • add_alias โ€” Add an alias to a note
  • make_alias_primary โ€” Set an alias as primary or non-primary
  • remove_alias โ€” Remove an alias from a note

๐Ÿ” Notes Permissions (6 tools)

  • get_note_permissions โ€” Get a note's permission settings
  • set_note_user_permission โ€” Set a user's permission on a note
  • remove_note_user_permission โ€” Remove a user's permission from a note
  • set_note_group_permission โ€” Set a group's permission on a note
  • remove_note_group_permission โ€” Remove a group's permission from a note
  • change_note_owner โ€” Change the owner of a note

๐Ÿ“‹ Notes Listing (4 tools)

  • list_all_my_notes โ€” List notes owned by the current user
  • list_all_shared_notes โ€” List notes shared with the current user
  • list_all_public_notes โ€” List public notes visible to the current user
  • list_all_pinned_notes โ€” List notes pinned by the current user

๐Ÿ‘ค Profile & Media (4 tools)

  • get_my_profile โ€” Get the current user's profile information
  • list_all_my_media โ€” List all media files owned by the current user
  • get_media_by_id โ€” Get a single media file by UUID
  • delete_media_by_id โ€” Delete a media file by UUID

MCP Server ยท Populars

MCP Server ยท New