mcp-knowledge-base
by vishnu-vasan
README.md
# š§ MCP Knowledge Base Server
A **Personal Knowledge Base** built as an MCP (Model Context Protocol) server in Python. Connect it to Claude Desktop, Claude Code, VS Code Copilot, Cursor, or any MCP-compatible client ā and let your AI assistant manage your notes, tasks, and ideas.
This project teaches you the **three core MCP primitives** through a practical, useful application:
| Primitive | What It Is | Examples in This Project |
|-----------|-----------|------------------------|
| **Tools** | Functions the LLM can call | `add_note`, `search_notes`, `add_task`, `update_task`, `get_stats` |
| **Resources** | Data the LLM can browse | `kb://notes`, `kb://tasks`, `kb://stats` |
| **Prompts** | Reusable templates | `daily_review`, `weekly_planning`, `capture_learning` |
## Architecture
```
āāāāāāāāāāāāāāāāāāāāāāā stdio / SSE āāāāāāāāāāāāāāāāāāāāāāāā
ā MCP Client āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāŗā Knowledge Base ā
ā (Claude Desktop, ā JSON-RPC 2.0 messages ā MCP Server ā
ā Claude Code, ā ā ā
ā Cursor, etc.) ā ā āāāāāāāāāāāāāāāā ā
ā ā tools/call āāāāāāāāāāāāāāāŗ ā ā 12 Tools ā ā
ā ā resources/read āāāāāāāāāāāŗ ā ā 4 Resources ā ā
ā ā prompts/get āāāāāāāāāāāāāāŗ ā ā 4 Prompts ā ā
āāāāāāāāāāāāāāāāāāāāāāā ā āāāāāāāā¬āāāāāāāā ā
ā ā ā
ā āāāāāāāā¼āāāāāāāā ā
ā ā SQLite DB ā ā
ā ā + FTS5 idx ā ā
ā āāāāāāāāāāāāāāāā ā
āāāāāāāāāāāāāāāāāāāāāāāā
```
## Quick Start
### Prerequisites
- **Python 3.11+**
- **[uv](https://docs.astral.sh/uv/getting-started/installation/)** (modern Python package manager)
```bash
# Install uv if you don't have it
curl -LsSf https://astral.sh/uv/install.sh | sh
```
### 1. Clone & Install
```bash
cd mcp-knowledge-base
# Create virtual environment and install dependencies
uv venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
uv sync
```
### 2. Verify It Works
```bash
uv run test_server.py
```
You should see all tests pass ā tools, resources, and prompts all registering correctly.
### 3. Connect to an MCP Client
#### Option A: Claude Desktop
Edit your Claude Desktop config file:
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
```json
{
"mcpServers": {
"knowledge-base": {
"command": "uv",
"args": [
"--directory", "/FULL/PATH/TO/mcp-knowledge-base",
"run", "server.py"
]
}
}
}
```
> ā ļø Replace `/FULL/PATH/TO/mcp-knowledge-base` with the actual absolute path.
Restart Claude Desktop. You should see a šØ hammer icon in the chat input ā click it to see all 12 tools.
#### Option B: Claude Code
```bash
# From the project directory
claude mcp add knowledge-base -- uv run server.py
# Or globally
claude mcp add --scope user knowledge-base -- uv --directory /FULL/PATH/TO/mcp-knowledge-base run server.py
```
Then in Claude Code, your knowledge base tools are available automatically.
#### Option C: Cursor / VS Code
Add to your `.cursor/mcp.json` or VS Code MCP settings:
```json
{
"mcpServers": {
"knowledge-base": {
"command": "uv",
"args": ["--directory", "/FULL/PATH/TO/mcp-knowledge-base", "run", "server.py"]
}
}
}
```
## What You Can Do
Once connected, try these conversations with Claude:
### Notes
> "Save a note about what I learned about MCP today ā it uses JSON-RPC 2.0, has three primitives (tools, resources, prompts), and the Python SDK uses FastMCP for the high-level API."
> "Search my notes for anything about Python"
> "Show me all my notes tagged with 'learning'"
### Tasks
> "Add a task: Build a multi-agent system with CrewAI, high priority, due next Friday"
> "What are my urgent tasks?"
> "Mark task #3 as done"
### Prompts (Workflows)
> "Run my daily review" ā triggers the `daily_review` prompt
> "Help me plan my week" ā triggers `weekly_planning`
> "I want to capture what I learned about Docker" ā triggers `capture_learning`
### Stats
> "Give me an overview of my knowledge base"
## Project Structure
```
mcp-knowledge-base/
āāā server.py # The MCP server ā all tools, resources, prompts
āāā test_server.py # Test client to verify everything works
āāā pyproject.toml # Project config and dependencies
āāā README.md # You are here
```
Data is stored in `~/.mcp-knowledge-base/knowledge.db` (SQLite with FTS5 full-text search).
## Key Concepts You'll Learn
### 1. Tools (the most important primitive)
Tools are Python functions decorated with `@mcp.tool()`. The MCP SDK automatically generates the JSON schema from your type hints and docstrings:
```python
@mcp.tool()
def add_note(title: str, content: str, tags: list[str] | None = None) -> dict:
"""Create a new note in the knowledge base."""
...
```
The LLM sees this as a callable function with typed parameters. Good docstrings = better tool use.
### 2. Resources (browsable data)
Resources are URIs the LLM can read, like a file system:
```python
@mcp.resource("kb://notes/{note_id}")
def resource_single_note(note_id: int) -> str:
"""Full content of a specific note."""
...
```
### 3. Prompts (workflow templates)
Prompts are pre-written instructions that guide the LLM through multi-step workflows:
```python
@mcp.prompt()
def daily_review() -> str:
"""Generate a daily review of all open tasks and recent notes."""
return "Please review my current tasks and recent notes..."
```
### 4. Full-Text Search with FTS5
SQLite's FTS5 extension gives you fast, relevance-ranked search across all your notes ā no external search engine needed.
### 5. Transport Modes
- **stdio** (default): The client spawns the server as a subprocess. Used by Claude Desktop, Claude Code, Cursor.
- **SSE**: Server runs as an HTTP endpoint. Used by web-based clients.
## Extending This Project
Here are ideas to keep building:
1. **Add a `web_clip` tool** ā save content from URLs as notes (use `httpx` + `BeautifulSoup`)
2. **Add reminders** ā tasks with due dates that surface automatically
3. **Add note linking** ā `[[wiki-style]]` links between notes
4. **Add export tools** ā export notes as Markdown files or a PDF
5. **Add an embedding-based search** ā use OpenAI/Anthropic embeddings for semantic search alongside FTS5
6. **Add OAuth** ā protect your server when running over SSE (the June 2025 MCP spec update covers this)
7. **Deploy to the cloud** ā run on Cloudflare Workers, Fly.io, or Railway with Streamable HTTP transport
## Troubleshooting
| Issue | Fix |
|-------|-----|
| Claude Desktop doesn't show tools | Restart Claude Desktop after editing config. Check the config path is correct. |
| `ModuleNotFoundError: mcp` | Run `uv sync` to install dependencies |
| Server crashes on startup | Check Python version: `python --version` (need 3.11+) |
| FTS search returns nothing | FTS index only covers notes added *after* the table was created |
| Database locked errors | Make sure only one instance of the server is running |
## Resources
- [MCP Official Docs](https://modelcontextprotocol.io/)
- [MCP Python SDK](https://github.com/modelcontextprotocol/python-sdk)
- [FastMCP](https://github.com/jlowin/fastmcp) ā the high-level API (v1 is built into the official SDK)
- [MCP Server Registry](https://registry.modelcontextprotocol.io/) ā discover community servers
- [MCP Specification (Nov 2025)](https://spec.modelcontextprotocol.io/) ā the full protocol spec
## License
MIT ā use this however you want. Build on it, learn from it, ship it.
TDQS
A4.2/5.0
Scored across 11 tools
Disambiguation5/5
Every tool targets a distinct resource and action: notes vs. tasks, with separate CRUD and list/search operations. get_stats provides an overview, and there is no ambiguity between note and task operations.
Naming Consistency5/5
All tool names follow a consistent verb_noun snake_case pattern (add_note, list_tasks, delete_note, etc.). The naming is uniform and predictable across the entire set.
Tool Count5/5
11 tools is well-scoped for a knowledge base managing notes and tasks. Each tool covers a distinct operation, and there are no redundant or unnecessary tools.
Completeness4/5
Notes have full CRUD plus search. Tasks have add, list, update, and delete, but lack a dedicated get_task by ID (though list_tasks can filter). This is a minor gap that agents can work around.
Maintenance
ActivityInactive
ResponsivenessNo issues