视觉画布设计
canvas-design
基于设计原则创作静态视觉作品,用于海报与品牌图形。
documentation-server【文档与办公】Use when you need to store, retrieve, search, or manage documents in a local knowledge base with semantic search and hybrid (vector + full-text) retrieval. Also use when interacting with the documentation server web interface, managing uploads, or performing AI-powered document analysis. Use this instead of MCP-native tool definitions when context ef…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
This server provides a local-first knowledge base with semantic search, parent-child chunking, and an embedded vector database (Orama). Every operation available through the MCP protocol is also accessible via a REST API on http://127.0.0.1:3080/api/.
Calling the REST API directly (with curl or your agent's HTTP tool) is more token-efficient than loading MCP tool schemas — only the response JSON enters context, not the tool definitions.
When NOT to use: If the server isn't running and you cannot start it (no npx/Node.js available), fall back to another documentation strategy.
The server includes a full-featured graphical web interface at http://127.0.0.1:3080 that runs automatically alongside the REST API. Use it for:
GEMINI_API_KEY is set).txt, .md, or .pdf filesThe REST API is for programmatic access; the web UI is for visual exploration and one-off operations.
curl -s http://127.0.0.1:3080/api/config
If you get a JSON response, the server is active. If the connection fails, proceed to start it.
# Start in background, redirect logs to a temp file
npx -y @andrea9293/mcp-documentation-server > /tmp/doc-server.log 2>&1 &
# Wait for startup (embedding model download may take a few extra seconds on first run)
sleep 5
Then verify with the check step above. Retry after a few seconds if the model is still downloading.
pkill -f "@andrea9293/mcp-documentation-server" || true
The server is safe to leave running in the background between sessions.
All endpoints are on http://127.0.0.1:3080/api/. All POST endpoints accept Content-Type: application/json.
| Method | Endpoint | Description |
|---|---|---|
GET | /api/documents | List all documents |
GET | /api/documents/:id | Get a document's full content |
POST | /api/documents | Add a new document |
DELETE | /api/documents/:id | Delete a document |
| Method | Endpoint | Description |
|---|---|---|
POST | /api/search | Semantic search within a single document |
POST | /api/search-all | Hybrid search across all documents |
POST | /api/context-window | Get surrounding chunks around a matched section |
POST | /api/search-ai | AI-powered analysis (requires GEMINI_API_KEY) |
| Method | Endpoint | Description |
|---|---|---|
GET | /api/uploads | List files in the uploads folder |
GET | /api/uploads/path | Get the uploads directory path |
POST | /api/uploads/process | Process all pending upload files into documents |
POST | /api/uploads/upload | Upload files via multipart form |
| Method | Endpoint | Description |
|---|---|---|
GET | /api/config | Server configuration (embedding model, Gemini availability) |
curl -s http://127.0.0.1:3080/api/documents
curl -s -X POST http://127.0.0.1:3080/api/documents \
-H "Content-Type: application/json" \
-d '{
"title": "My Document Title",
"content": "Full document content here...",
"metadata": { "source": "web", "tags": ["reference"] }
}'
curl -s -X POST http://127.0.0.1:3080/api/search-all \
-H "Content-Type: application/json" \
-d '{"query": "your search query here", "limit": 10}'
Each result includes:
content — the matched text chunkscore — relevance score (0-1, higher = more relevant)document_id — ID of the document this chunk belongs toparent_index — chunk index within the document (needed for context window queries)curl -s http://127.0.0.1:3080/api/documents/DOCUMENT_ID_HERE
Note: returns a single object, not an array.
curl -s -X POST http://127.0.0.1:3080/api/search \
-H "Content-Type: application/json" \
-d '{"document_id": "DOCUMENT_ID_HERE", "query": "search term", "limit": 5}'
After search results give you a document_id and parent_index, expand the context:
curl -s -X POST http://127.0.0.1:3080/api/context-window \
-H "Content-Type: application/json" \
-d '{"document_id": "DOCUMENT_ID_HERE", "parent_index": 3, "before": 2, "after": 2}'
curl -s -X DELETE http://127.0.0.1:3080/api/documents/DOCUMENT_ID_HERE
curl -s -X POST http://127.0.0.1:3080/api/uploads/process
curl -s http://127.0.0.1:3080/api/uploads
curl -s http://127.0.0.1:3080/api/uploads/path
curl -s http://127.0.0.1:3080/api/config
Returns server metadata: embedding model, Gemini availability, chunking settings.
curl -s -X POST http://127.0.0.1:3080/api/search-ai \
-H "Content-Type: application/json" \
-d '{"document_id": "DOCUMENT_ID_HERE", "query": "what does this document say about X?"}'
Returns an AI-generated answer grounded in the document content.
Always check if the server is running before making requests. Start it if inactive. A running server is safe to keep between sessions.
Prefer calling the REST API over MCP tool definitions — the REST API returns JSON directly without the overhead of loading tool schemas into the agent's context window.
Keep output minimal. For lists: just IDs and titles. For search: scores and truncated content snippets (~200 chars is usually enough). For errors: the error message.
Handle the limit parameter. Default is 10. Increase for exhaustive searches, decrease for quick lookups.
Use the web UI (http://127.0.0.1:3080) for visual browsing, drag-and-drop uploads, and one-off operations. The REST API is for programmatic access.
Document IDs are opaque strings (e.g. 4ecc2235ec887d3e). Always list documents first to get the correct ID.
First startup may be slow because the embedding model (~80 MB) is downloaded from Hugging Face. Subsequent starts are fast.
The server prints startup info to stdout. When started in background with > /tmp/doc-server.log, these logs don't clutter the terminal.
| Mistake | Fix |
|---|---|
| Forgetting to start the server | Always check /api/config first; start if it fails |
| Not waiting for model download on first run | Use sleep 5 after starting; verify with the check step |
| Using wrong document ID | Always get the ID from list or search results first |
| Printing raw JSON in conversation | Log only what you need (IDs, scores, truncated snippets) |
| Expecting array from single-document GET | GET /api/documents/:id returns a single object, not an array |
| Putting the server on a different port | Default is 3080; override with WEB_PORT env var |
All endpoints return JSON. Typical response shapes:
[{id, title, ...}]{id, title, content, metadata, createdAt}{success, id, title}[{content, score, document_id, parent_index, ...}]{parents: [{index, content, ...}], ...}{success, message}{error: "message"}