A minimal Python MCP (Model Context Protocol) server that allows Cursor AI to manage your BookStack documentation.
This server provides essential BookStack management tools:
- List Content: Browse books, bookshelves, chapters, and pages
- Search: Full-text search across all content
- Page Management: Create, read, update, and delete pages
- Book Management: Create new books
- Chapter Management: Create new chapters
- Python 3.8 or higher
- BookStack instance with API access
- BookStack API token (ID and Secret)
pip install -r requirements.txtFirst, you need to create an API token in BookStack:
- Log in to your BookStack instance at http://192.168.1.193:6875
- Go to your profile → API Tokens
- Create a new token with appropriate permissions
- Copy the Token ID and Token Secret
Then create a .env file:
cp .env.example .envEdit .env and add your BookStack credentials:
BS_URL=http://192.168.1.193:6875
BS_TOKEN_ID=your_actual_token_id
BS_TOKEN_SECRET=your_actual_token_secretRun the server directly to test:
python server.pyThe server will start and listen for MCP protocol messages via stdio.
To use this MCP server with Cursor, add it to your Cursor MCP settings:
- Open Cursor Settings (Cmd/Ctrl + ,)
- Navigate to Features → Model Context Protocol
- Add a new server configuration:
{
"mcpServers": {
"bookstack": {
"command": "python",
"args": ["/home/borjigin/dev/bookstack-mcp/server.py"],
"env": {
"BS_URL": "http://192.168.1.193:6875",
"BS_TOKEN_ID": "your_token_id",
"BS_TOKEN_SECRET": "your_token_secret"
}
}
}
}Or use a script wrapper:
{
"mcpServers": {
"bookstack": {
"command": "/home/borjigin/dev/bookstack-mcp/run_server.sh"
}
}
}- Restart Cursor
Once configured, you can ask Cursor to interact with BookStack:
- "List all books in BookStack"
- "Show me the chapters in book 5"
- "Find pages with 'API' in the name"
- "Search for 'authentication' in BookStack"
- "Find documentation about Docker"
- "Get the content of page 42"
- "Show me what's in page ID 10"
- "Create a new book called 'API Documentation'"
- "Create a chapter named 'Getting Started' in book 5"
- "Create a page in book 3 with markdown content..."
- "Update page 15 to change the title to 'New Title'"
- "Modify page 20's content with this markdown..."
- "Delete page 99"
List content entities (books, bookshelves, chapters, pages)
entity_type: "books" | "bookshelves" | "chapters" | "pages"count: Number of items (default 20)offset: Pagination offset (default 0)filter_name: Filter by name substring
Search across all content
query: Search query stringpage: Page number (default 1)count: Results per page (default 20)
Get page details and content
page_id: Page ID
Create a new page
book_id: Book ID (required)name: Page title (required)htmlormarkdown: Content (one required)chapter_id: Optional chapter IDtags: Optional tags (format: "tag1=value1,tag2=value2")
Update an existing page
page_id: Page ID (required)name: New title (optional)htmlormarkdown: New content (optional)tags: Optional tags
Delete a page
page_id: Page ID (required)
Create a new book
name: Book name (required)description: Optional descriptiontags: Optional tags
Create a new chapter
book_id: Book ID (required)name: Chapter name (required)description: Optional descriptiontags: Optional tags
If Cursor can't connect to BookStack:
- Verify BookStack is running:
curl http://192.168.1.193:6875 - Check your API tokens are correct
- Ensure the token has sufficient permissions
If you get 403 errors:
- Your API token may lack necessary permissions
- Create a new token with admin or appropriate role permissions
If the Python server won't start:
- Check Python version:
python --version(must be 3.8+) - Verify dependencies:
pip list | grep fastmcp - Check for errors in the
.envfile
To extend this server with more tools:
- Add new functions decorated with
@mcp.tool() - Use the
BookStackClientfor API calls - Follow the pattern of existing tools
Example:
@mcp.tool()
async def bookstack_custom_operation(param: str) -> str:
"""Your custom tool description"""
client = get_client()
result = await client.request("GET", f"endpoint/{param}")
return str(result)BookStack API documentation: https://www.bookstackapp.com/docs/api/
This project is open source and available for modification and use.