Skip to main content
Glama

NotePilot (Notes Assistant AI Chat App)

Turn thoughts into structured knowledge..!

A minimal Notes application built on the Model-Context-Protocol (MCP). A Python MCP server exposes note management tools over stdio; an async client connects Claude AI to those tools so you can create, search, and manage notes through a natural-language chat interface.

Overview

You ──► Claude AI (Anthropic) ──► MCP Client ──► MCP Server ──► SQLite
              (tool calls)          (stdio)       (FastMCP)     (notes.db)

Claude receives a set of note-management tools from the MCP server. When you ask it to "create a note about X" or "find notes mentioning Y", it invokes the appropriate tool, gets the result, and responds conversationally.

Related MCP server: Notes MCP

Tech Stack

Layer

Technology

Language

Python 3.12+

Package manager

uv

MCP framework

mcp[cli] (FastMCP)

AI / LLM

Anthropic SDK (AsyncAnthropic)

Database

SQLite via sqlite-utils

CLI formatting

colorama

Config

python-dotenv

Prerequisites

Configuration

Create a .env file in the project root:

ANTHROPIC_API_KEY="sk-ant-..."
CLAUDE_MODEL="claude-haiku-4-5-20251001"

Installation

# Clone the repo
git clone https://github.com/chaitanya-jadhav11/notes-mcp
cd notes-mcp

# Install dependencies
uv sync

Usage

# Start the interactive chat client
uv run -m client.client

You can then chat naturally with Claude. Examples:

You: Create a note titled "Shopping list" with milk, eggs, and bread.
You: Show me all my notes.
You: Search for notes about bread.
You: Update the shopping list to add butter.
You: Delete the shopping list note.

To inspect or develop the MCP server interactively:

uv run mcp dev server/server.py

Project Structure

notes-mcp/
├── .env                    # API key and model config (create this)
├── pyproject.toml          # Project metadata and dependencies
├── uv.lock                 # Pinned dependency lock file
├── notes.db                # SQLite database (auto-created on first run)
│
├── server/
│   ├── server.py           # FastMCP server — defines the 8 note tools
│   └── db.py               # SQLite CRUD layer (UUID keys, ISO timestamps)
│
└── client/
    ├── client.py           # MCPClient class + interactive REPL loop
    └── claude_client.py    # Anthropic API wrapper — manages conversation
                            # history, tool-call loops, and prompt caching

Available MCP Tools

The server exposes the following tools to Claude:

Tool

Description

list_notes

List all notes (id + title)

create_note

Create a note with a title and body

get_note_by_id

Fetch a single note by UUID

get_notes_by_title

Find notes by exact or partial title match

search_notes

Full-text search across note bodies

update_note

Update a note's title and/or body

delete_note_by_id

Delete a note by UUID

delete_notes_by_title

Delete all notes matching a title

App Screenshot

mcp-Notes-chat-example.jpg

Anthropic course certificate

Anthropic-MCP_cert.jpg

Available Tools

8 tools
create_noteC

Create a new note with title and body

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
titleYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose any behavioral traits such as persistence, id generation, error conditions, or side effects. It only states the basic function without additional context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence. It is very concise, but it could include more details without becoming overly long. The front-loaded structure is good.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema and only 2 parameters, the description should mention what is returned (e.g., the created note object). It lacks information about proper usage steps and error handling, making it incomplete for a creation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. However, it merely restates the parameter names ('title and body') without adding constraints like format, length limits, or uniqueness conditions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (Create), the resource (note), and the required fields (title and body). It distinguishes from sibling tools like list_notes and search_notes which are read operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. There is no mention of when not to use it or any prerequisites. The description simply states what it does without context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_note_by_idC

Delete a note using its ID

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and the description fails to disclose important behavioral traits such as whether deletion is permanent, if it cascades, or requires specific permissions. The minimal description leaves the agent uninformed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely short (6 words), which is concise but at the cost of essential details. Not front-loaded with key info because there is barely any content. Could be expanded slightly without harming conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple tool with one parameter but no annotations, output schema, or sibling differentiation, the description is too sparse. Missing usage context, behavioral impacts, and parameter clarification make it incomplete for reliable agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning no parameter descriptions. The description only repeats the parameter name (note_id) without explaining format, source, or constraints. Fails to compensate for missing schema details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the action (delete), resource (note), and method (by ID). Distinguishes from sibling tools like delete_notes_by_title which deletes multiple by title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like delete_notes_by_title or update_note. Does not specify prerequisites or constraints.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_notes_by_titleC

Delete all notes matching a given title

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the destructive nature (delete), which is the primary behavioral trait. However, with no annotations, additional context like irreversibility, required permissions, or side effects is absent. This is adequate but minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single short sentence, which is efficient for a simple tool. However, it lacks structure (e.g., sections) and could include more detail while remaining concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the essential action. It implies deletion of all matching notes. But it does not describe return values or error conditions, which would enhance completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter 'title' with no description (0% coverage). The description adds no meaning beyond the schema, merely restating 'given title'. This fails to compensate for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'delete' and resource 'notes matching a given title'. It distinguishes itself from siblings like 'delete_note_by_id' (deletes by ID) and 'get_notes_by_title' (retrieves). However, it could be more explicit about deleting all matching notes, not just one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool over alternatives such as 'delete_note_by_id' or 'search_notes'. There are no prerequisites or when-not-to-use instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_note_by_idA

Retrieve a single note using its unique ID

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It only states 'retrieve' (read operation) but provides no details on permissions, error behavior, or side effects. Minimal disclosure beyond the obvious.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence that efficiently communicates the tool's purpose without any wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description is functionally adequate. However, it lacks hints about the return value or error cases, which could aid an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 0% description coverage and the description does not elaborate on the note_id parameter (e.g., format, example). For a single required parameter, some guidance would be helpful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'retrieve', resource 'a single note', and method 'using its unique ID'. It effectively distinguishes from siblings like list_notes (multiple) or search_notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when you have a specific note ID, providing clear context. However, it does not explicitly state when not to use it or mention alternatives, but given the straightforward use case, it's adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_notes_by_titleB

Get notes by title (exact or partial match)

ParametersJSON Schema
NameRequiredDescriptionDefault
exactNo
titleYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description lacks details on behavioral traits such as whether multiple notes can be returned, case sensitivity, or behavior on no match. The mention of exact/partial match is helpful but insufficient for full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no wasted words. It could be slightly more detailed without losing conciseness, but it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, no annotations, and only 2 parameters, the description omits crucial context: return format (list vs. single note), multiple matches, error handling, and sorting. Incomplete for confident agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains that exact (boolean) controls exact vs. partial matching, but does not clarify the title parameter beyond its name. Some value added, but not comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get', resource 'notes', and criteria 'by title (exact or partial match)'. It effectively distinguishes from sibling tools like list_notes, get_note_by_id, and search_notes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for finding notes by title but does not provide explicit guidance on when to use this tool versus alternatives (e.g., search_notes) or when to set exact to true or false.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_notesA

List all notes

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of transparency. It only states 'List all notes' without disclosing behaviors like pagination, ordering, potential data volume, or permissions required.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one sentence with no wasted words. It is appropriately sized for a tool with no parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description lacks details on output format, pagination, or any constraints. Given potential large results and no output schema, it is not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has no parameters, and the description adds nothing beyond the schema. However, with no parameters, a clear purpose is sufficient; baseline is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'List all notes' clearly states the verb 'list' and resource 'notes'. It uniquely identifies the tool as returning all notes without filtering, distinguishing it from sibling tools like search_notes and get_notes_by_title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as search_notes or get_notes_by_title. The description lacks context for appropriate selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_notesD

Search notes

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

TDQS

D1.7/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided and the description gives zero behavioral information. It does not state whether the operation is read-only, destructive, or has side effects, nor does it mention pagination, rate limits, or return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short but sacrifices clarity and usefulness. While concise in word count, it fails to front-load essential information and is underspecified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has one parameter and no output schema or annotations. The description does not address return values, result format, or error handling. It is inadequate for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%. The description does not clarify what constitutes a valid query (e.g., exact match, full-text search, syntax for operators). The parameter name 'query' is somewhat self-explanatory but the description adds no value beyond the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description 'Search notes' states verb and resource but lacks specificity about what is searched (title, content, metadata?) and how results are returned. Siblings like get_notes_by_title and list_notes suggest overlapping functionality without differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus siblings like list_notes or get_notes_by_title. No context about prerequisites, input formats, or expected behavior.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_noteB

Update note title and/or body using note ID

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
titleNo
note_idYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description only states it updates fields. It omits behavioral details like idempotency, error handling (e.g., missing note ID), return value, or permissions. The mutation is implied but not elaborated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no redundant information. It is concise but could be slightly improved by including minimal usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple update tool with no output schema, the description covers the basic action and fields. However, it lacks details on preconditions (note existence), partial update behavior, and success/failure responses, making it incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description mentions note_id, title, and body but adds no extra semantics (e.g., format, limits, behavior when omitted). It only ties parameters to the update action.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates a note's title and/or body using the note ID. It specifies the action (update), resource (note), and which fields can be modified, effectively distinguishing it from sibling tools like create_note or delete_note_by_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites (e.g., note must exist), scenarios, or when to prefer this over create_note or search capabilities.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv0.1.0
    • First observedcreate_note
    • First observeddelete_note_by_id
    • First observeddelete_notes_by_title
    • First observedget_note_by_id
    • First observedget_notes_by_title
    • First observedlist_notes
    • First observedsearch_notes
    • First observedupdate_note

TDQS

B3.1/5.0

Scored across 8 tools

Disambiguation4/5

Tools are mostly distinct, but search_notes and get_notes_by_title may overlap in functionality since search could also target titles. However, descriptions help differentiate: search is general, get_by_title is explicit. Overall clear boundaries.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., list_notes, create_note, delete_notes_by_title). Prepositions like 'by' are used uniformly where needed.

Tool Count5/5

8 tools is well-scoped for a note management server. Covers all CRUD operations plus search, with no redundancy. The number feels complete without being excessive.

Completeness4/5

Covers create, read (by ID, by title, list all), update, delete, and search. Minor gap: no way to retrieve notes by other attributes like date, but sufficient for basic note-taking.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables AI assistants like Claude to access and manipulate Apple Notes on macOS, allowing for retrieving, creating, and managing notes through natural language interactions.
    82
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A Python-based MCP server adapted from the n8n_agent project that implements a note storage and summarization system. It enables users to create, retrieve, and summarize notes through the Model Context Protocol.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    A beginner-friendly MCP server for managing personal notes. Enables Claude to create, list, read, search, update, and delete notes saved as Markdown files.
    MIT