MCP Notes Server
by AndriiOzemko
README.md
# MCP Notes Server
A Model Context Protocol (MCP) server for managing notes with full CRUD operations, tagging, and search capabilities.
## Features
- ✅ Create, read, update, and delete notes
- ✅ Tag-based organization and filtering
- ✅ Full-text search across notes
- ✅ Persistent storage (JSON file-based)
- ✅ Resource exposure via MCP protocol
- ✅ Compatible with Claude Desktop
## Setup Instructions
### Prerequisites
- Python 3.12 or higher
- pip package manager
### Installation
1. **Clone or download this repository**
```bash
cd "d:\Projects\AI Engineering course\MCP Server"
```
2. **Install dependencies**
```bash
pip install -r requirements.txt
```
3. **Configure Claude Desktop**
Edit your Claude Desktop configuration file:
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
Add the notes server configuration:
```json
{
"mcpServers": {
"notes": {
"command": "python",
"args": [
"d:\\Projects\\AI Engineering course\\MCP Server\\server.py"
]
}
}
}
```
**Note**: Adjust the path to match your actual installation directory.
4. **Restart Claude Desktop**
After updating the configuration, completely quit and restart Claude Desktop for the changes to take effect.
## Available Tools
### 1. `create_note`
Creates a new note with content and optional metadata.
**Parameters:**
- `content` (required): The content of the note
- `title` (optional): Title for the note (defaults to first line of content)
- `tags` (optional): Array of tags for categorization
**Example:**
```json
{
"content": "Remember to buy groceries tomorrow",
"title": "Shopping Reminder",
"tags": ["personal", "todo"]
}
```
### 2. `list_notes`
Lists all notes with optional filtering and pagination.
**Parameters:**
- `tag` (optional): Filter notes by specific tag
- `limit` (optional): Maximum number of notes to return
**Example:**
```json
{
"tag": "work",
"limit": 5
}
```
### 3. `get_note`
Retrieves the full content of a specific note.
**Parameters:**
- `note_id` (required): The ID of the note to retrieve
**Example:**
```json
{
"note_id": "1"
}
```
### 4. `update_note`
Updates an existing note's content, title, or tags.
**Parameters:**
- `note_id` (required): The ID of the note to update
- `content` (optional): New content for the note
- `title` (optional): New title for the note
- `tags` (optional): New list of tags
**Example:**
```json
{
"note_id": "1",
"title": "Updated Title",
"tags": ["work", "important"]
}
```
### 5. `delete_note`
Deletes a note by ID.
**Parameters:**
- `note_id` (required): The ID of the note to delete
**Example:**
```json
{
"note_id": "1"
}
```
### 6. `search_notes`
Searches notes by keyword in title or content.
**Parameters:**
- `query` (required): Search keyword or phrase
- `tag` (optional): Optional tag filter to narrow search
**Example:**
```json
{
"query": "meeting",
"tag": "work"
}
```
## Available Resources
### 1. `note://{note_id}`
Provides direct access to individual notes via URI.
**Example:** `note://1`
### 2. `notes://list`
Provides a JSON list of all notes with metadata.
**Example:** `notes://list`
## Example Dialogues
### Example 1: Creating and Managing a Todo List
**User:** Create a note for my grocery shopping list with items: milk, eggs, bread, and cheese.
**Claude:** I'll create a shopping list note for you.
*[Uses create_note tool with content and tags]*
**Response:** ✓ Note created successfully!
- ID: 1
- Title: Grocery Shopping List
- Tags: shopping, personal
---
**User:** Show me all my notes.
**Claude:** Let me list all your notes.
*[Uses list_notes tool]*
**Response:** Found 1 note(s):
- ID: 1 | Grocery Shopping List [shopping, personal]
Items needed: milk, eggs, bread, and cheese
---
**User:** Add apples to my shopping list.
**Claude:** I'll update your shopping list to include apples.
*[Uses update_note tool with note_id: "1"]*
**Response:** ✓ Note 1 updated successfully!
Updated fields: content
### Example 2: Work Notes and Search
**User:** Create a note about tomorrow's team meeting at 10 AM. Tag it as work and important.
**Claude:** I'll create a note for your team meeting.
*[Uses create_note tool]*
**Response:** ✓ Note created successfully!
- ID: 2
- Title: Team Meeting - Tomorrow at 10 AM
- Tags: work, important
---
**User:** Create another note: "Review Q4 budget proposal before Friday meeting" with work and finance tags.
**Claude:** Creating your budget review note.
*[Uses create_note tool]*
**Response:** ✓ Note created successfully!
- ID: 3
- Title: Review Q4 budget proposal before Friday meeting
- Tags: work, finance
---
**User:** Find all my notes about meetings.
**Claude:** I'll search for notes containing "meeting".
*[Uses search_notes tool with query: "meeting"]*
**Response:** Found 2 note(s) matching 'meeting':
- ID: 2 | Team Meeting - Tomorrow at 10 AM [work, important]
Discuss project updates and timeline...
- ID: 3 | Review Q4 budget proposal before Friday meeting [work, finance]
Review Q4 budget proposal before Friday meeting
### Example 3: Organizing with Tags
**User:** Show me all my work-related notes.
**Claude:** I'll list all notes tagged with "work".
*[Uses list_notes tool with tag: "work"]*
**Response:** Found 2 note(s):
- ID: 2 | Team Meeting - Tomorrow at 10 AM [work, important]
Discuss project updates and timeline...
- ID: 3 | Review Q4 budget proposal before Friday meeting [work, finance]
Review Q4 budget proposal before Friday meeting
---
**User:** Delete the meeting note, I don't need it anymore.
**Claude:** I'll delete note ID 2.
*[Uses delete_note tool with note_id: "2"]*
**Response:** ✓ Note 'Team Meeting - Tomorrow at 10 AM' (ID: 2) deleted successfully.
---
**User:** What notes do I still have?
**Claude:** Let me show you your remaining notes.
*[Uses list_notes tool]*
**Response:** Found 2 note(s):
- ID: 1 | Grocery Shopping List [shopping, personal]
Items needed: milk, eggs, bread, cheese, and apples
- ID: 3 | Review Q4 budget proposal before Friday meeting [work, finance]
Review Q4 budget proposal before Friday meeting
## Known Limitations
1. **Single-User Design**: The server stores notes in a local JSON file without user authentication or multi-user support.
2. **No Concurrent Access Protection**: Multiple simultaneous operations may lead to race conditions. The server is designed for single-client (Claude Desktop) usage.
3. **Limited Storage Capacity**: Uses JSON file storage which may become slow with thousands of notes. Not suitable for large-scale note databases.
4. **No Attachment Support**: Currently only supports text content. Images, files, or rich media are not supported.
5. **Basic Search**: Search is case-insensitive substring matching. No support for regex, fuzzy matching, or advanced query syntax.
6. **No Note History**: Updates overwrite existing content without maintaining version history or undo capability.
7. **No Export/Import**: Currently no built-in functionality to export notes to other formats (Markdown, PDF, etc.) or import from external sources.
8. **Tags Are Case-Sensitive**: Tags like "Work" and "work" are treated as different tags.
9. **No Nested Tags or Hierarchies**: Flat tag structure only; no support for tag hierarchies or nested categories.
10. **Storage File Location**: The `notes_storage.json` file is created in the same directory as `server.py`. Make sure this directory is writable.
## Troubleshooting
### Server Not Showing Up in Claude Desktop
1. Verify the path in `claude_desktop_config.json` is correct and uses absolute paths
2. Check that Python 3.12+ is in your PATH
3. Restart Claude Desktop completely (quit and reopen)
4. Check Claude Desktop logs for errors
### Notes Not Persisting
1. Ensure the server directory is writable
2. Check if `notes_storage.json` is being created in the correct location
3. Verify no permission errors in the console output
### Tool Calls Failing
1. Verify all required parameters are provided
2. Check note IDs are valid strings (not integers)
3. Ensure the MCP package is properly installed
## Technical Details
- **Protocol**: Model Context Protocol (MCP)
- **Transport**: stdio (standard input/output)
- **Storage**: JSON file (`notes_storage.json`)
- **Python Version**: 3.12+
- **Dependencies**: `mcp` (official MCP Python SDK)
## License
This project is provided as-is for educational purposes.
## Contributing
Feel free to submit issues or pull requests to improve the server functionality.
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues