KURA Notes MCP Client
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@KURA Notes MCP Clientsearch my notes for meeting notes about the Q3 project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
KURA MCP Client
A Model Context Protocol (MCP) client that enables Claude Desktop to interact with KURA Notes API. This standalone client provides semantic search, note creation, retrieval, and management capabilities through Claude's native interface.
Features
Semantic Search: Find relevant notes using natural language queries
Note Creation: Create text notes with metadata (title, tags, annotations)
Note Retrieval: Get specific notes by ID or list recent notes
Note Management: Delete notes when needed
Robust Error Handling: Clear error messages for API issues
Logging: Detailed logging to stderr for debugging
Related MCP server: Trilium MCP Server
Prerequisites
Node.js >= 20.0.0
Claude Desktop application
KURA Notes API access (API key required)
Installation
Clone or download this repository:
git clone <repository-url> cd kura-mcp-clientInstall dependencies:
npm installBuild the project:
npm run buildThis will:
Compile TypeScript to JavaScript
Generate the
dist/index.jsfileMake the output file executable
Configuration
For Claude Desktop
Add the following configuration to 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
{
"mcpServers": {
"kura-notes": {
"command": "node",
"args": ["/absolute/path/to/kura-mcp-client/dist/index.js"],
"env": {
"API_KEY": "your-kura-api-key-here",
"KURA_API_URL": "https://kura.tillmaessen.de"
}
}
}
}Important: Replace /absolute/path/to/kura-mcp-client with the actual absolute path to this project directory.
Environment Variables
API_KEY(required): Your KURA Notes API authentication keyKURA_API_URL(optional): The KURA API base URL (defaults tohttps://kura.tillmaessen.de)
Available Tools
1. kura_search
Perform semantic search across your KURA Notes.
Parameters:
query(string, required): The search querylimit(number, optional): Maximum number of results (default: 10)contentType(string, optional): Filter by content type (e.g., "text")tags(string, optional): Comma-separated tags to filter by
Example:
Search my notes for "machine learning algorithms"Response: Array of search results with relevance scores and metadata.
2. kura_create
Create a new text note in KURA Notes.
Parameters:
content(string, required): The main content of the notetitle(string, optional): Title for the noteannotation(string, optional): Additional context or annotationtags(array of strings, optional): Tags to categorize the note
Example:
Create a note with the content "Today I learned about semantic search"
and tag it with "learning" and "ai"Response: Created note with ID and metadata.
3. kura_get
Retrieve a specific note by its ID.
Parameters:
id(string, required): The unique identifier of the note
Example:
Get the note with ID "abc123"Response: Full note content and metadata, or error if not found.
4. kura_list_recent
List the 20 most recent notes with metadata (without full content).
Parameters: None
Example:
Show me my recent notesResponse: Array of recent notes with metadata.
5. kura_delete
Delete a note by its ID. This action is permanent.
Parameters:
id(string, required): The unique identifier of the note to delete
Example:
Delete the note with ID "abc123"Response: Success confirmation or error if not found.
Usage Examples
Once configured in Claude Desktop, you can use natural language to interact with your KURA Notes:
Search for notes:
"Search my KURA notes for information about TypeScript"
"Find notes tagged with 'project-ideas'"
Create notes:
"Create a note: 'Meeting notes from today's standup...'"
"Save this idea to KURA: 'Build a note-taking MCP client'"
Retrieve notes:
"Get the full content of note ID xyz789"
"Show me my recent notes"
Delete notes:
"Delete note abc123"
Troubleshooting
Server not starting
Symptom: Claude Desktop shows connection error
Solutions:
Verify Node.js version:
node --version(should be >= 20.0.0)Check the absolute path in
claude_desktop_config.jsonis correctEnsure the project is built:
npm run buildCheck that
dist/index.jsexists and is executable
API_KEY error
Symptom: "ERROR: API_KEY environment variable is required"
Solutions:
Verify
API_KEYis set in theenvsection of your Claude Desktop configRestart Claude Desktop after changing the config
Check for typos in the config file
Authentication errors
Symptom: "401 Unauthorized" or "403 Forbidden" errors
Solutions:
Verify your API key is correct and active
Check if the API key has the necessary permissions
Ensure the
Authorizationheader format is correct
Network errors
Symptom: "Failed to fetch" or connection timeout errors
Solutions:
Verify
KURA_API_URLis correct and accessibleCheck your internet connection
Verify the KURA API service is running
Viewing logs
The MCP client logs to stderr. To view logs:
macOS/Linux:
Close Claude Desktop
Run from terminal:
/Applications/Claude.app/Contents/MacOS/Claude 2>&1 | grep "KURA MCP"
Windows: Check the Claude Desktop logs in the application data directory.
Development
Project Structure
kura-mcp-client/
├── README.md # This file
├── LICENSE # Elastic License 2.0
├── package.json # Project configuration and dependencies
├── tsconfig.json # TypeScript compiler configuration
├── .gitignore # Git ignore rules
├── src/
│ └── index.ts # Main MCP server implementation
└── dist/
└── index.js # Compiled JavaScript (after build)Development Commands
# Install dependencies
npm install
# Build the project (compile TypeScript)
npm run build
# Run in development mode (with hot reload)
npm run dev
# Clean build artifacts
npm run clean
# Rebuild from scratch
npm run clean && npm run buildRunning Tests Manually
You can test the MCP server manually:
# Set environment variables
export API_KEY="your-api-key"
export KURA_API_URL="https://kura.tillmaessen.de"
# Run the server (it will wait for MCP protocol messages on stdin)
node dist/index.jsThe server communicates via JSON-RPC over stdin/stdout, so manual testing requires sending properly formatted MCP protocol messages.
Code Structure
The main implementation in src/index.ts includes:
TypeScript Interfaces: Type definitions for KURA API responses
Environment Validation: Checks for required API_KEY
callKuraAPI(): Helper function for authenticated API requests
MCP Server Setup: Initializes the MCP server with stdio transport
Tool Definitions: Defines the 5 available tools with schemas
Request Handlers:
ListToolsRequestSchema: Returns available toolsCallToolRequestSchema: Executes tool calls with error handling
Adding New Tools
To add new tools:
Add the tool definition to the
toolsarrayAdd a new case in the
CallToolRequestSchemahandlerImplement the API call and response handling
Update this README with the new tool documentation
API Reference
The client interacts with these KURA Notes API endpoints:
GET /api/search- Semantic searchPOST /api/capture- Create notesGET /api/content/{id}- Get specific noteGET /api/content/recent- List recent notesDELETE /api/content/{id}- Delete note
All requests include Authorization: Bearer {API_KEY} header.
Technical Details
Protocol: Model Context Protocol (MCP) via stdio
Transport: JSON-RPC over stdin/stdout
Language: TypeScript compiled to ES2022
Runtime: Node.js >= 20.0.0
SDK: @modelcontextprotocol/sdk v1.x
License
This project is licensed under the Elastic License 2.0 (ELv2).
You are free to use, modify, and self-host this software at no cost. However, you may not provide it to third parties as a hosted or managed service where users access its features or functionality commercially. See the LICENSE file for the full terms.
Contributing
Contributions are welcome! Please ensure:
TypeScript code follows the existing style
All tools have proper error handling
Documentation is updated for new features
Code compiles without errors
Support
For issues related to:
This MCP client: Check the troubleshooting section above
KURA Notes API: Contact your KURA API administrator
Claude Desktop: Visit Anthropic's support
MCP Protocol: See MCP documentation
Available Tools
5 toolskura_createB
Create a new text note in KURA Notes. Use this to capture ideas, information, or any text content.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The main content of the note | |
| title | No | Optional title for the note | |
| annotation | No | Optional annotation or additional context | |
| tags | No | Optional array of tags to categorize the note |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states this is a creation tool ('Create a new text note'), implying a write/mutation operation, but doesn't disclose behavioral traits like required permissions, whether creation is idempotent, rate limits, or what happens on success/failure. The description adds minimal behavioral context beyond the basic creation intent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized with two concise sentences. The first sentence states the core purpose, and the second provides usage context. Every sentence earns its place with no redundant or unnecessary information. It's well-structured and front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (creation operation with 4 parameters), no annotations, and no output schema, the description is minimally adequate. It covers the basic purpose and usage but lacks details on behavioral aspects, error handling, or return values. For a creation tool without annotations, it should ideally provide more context about what happens after creation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 4 parameters (content, title, annotation, tags) with their types and descriptions. The description doesn't add any parameter-specific information beyond what's in the schema. With high schema coverage, the baseline score of 3 is appropriate as the description doesn't compensate but doesn't need to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Create a new text note in KURA Notes' with specific examples of what to capture ('ideas, information, or any text content'). It distinguishes from siblings by focusing on creation rather than deletion, retrieval, listing, or searching. However, it doesn't explicitly differentiate from hypothetical creation alternatives beyond the sibling context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implied usage context: 'Use this to capture ideas, information, or any text content.' This suggests when to use it (for text note creation) but doesn't explicitly state when not to use it or mention alternatives like using other tools for different operations. No explicit comparison to sibling tools is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_deleteA
Delete a note by its ID. This action is permanent and cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The unique identifier of the note to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and adds valuable behavioral context: it discloses that the action is 'permanent and cannot be undone,' which is critical for a destructive operation. This goes beyond the basic 'delete' verb to warn about irreversibility, though it doesn't cover other aspects like permissions or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences that are front-loaded with the core action and followed by a critical warning. Every sentence earns its place by providing essential information without waste, making it highly efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a destructive delete operation with no annotations and no output schema), the description is mostly complete: it clarifies the purpose and warns about permanence. However, it lacks details on prerequisites (e.g., authentication needs) or response behavior, leaving minor gaps for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'id' parameter fully documented in the schema. The description does not add any meaning beyond what the schema provides (e.g., no extra details on ID format or constraints), so it meets the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Delete') and target resource ('a note by its ID'), distinguishing it from sibling tools like kura_create, kura_get, kura_list_recent, and kura_search. It uses precise verb+resource language without being tautological.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by stating 'Delete a note by its ID,' which suggests this tool is for removing notes when their ID is known. However, it does not explicitly state when to use this versus alternatives (e.g., vs. kura_create for creation) or provide exclusions, leaving usage context somewhat inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_getA
Retrieve a specific note by its ID. Returns the full content and metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The unique identifier of the note |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that the tool retrieves a note and returns content and metadata, which covers basic behavior. However, it lacks details on error handling, permissions, rate limits, or other behavioral traits, leaving gaps for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose and followed by return details. Every sentence adds value without redundancy, making it efficient and well-structured for quick understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description provides basic purpose and return info but lacks details on output structure, error cases, or behavioral nuances. For a retrieval tool with minimal structured support, it is adequate but has clear gaps in completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, with the 'id' parameter fully documented in the schema. The description adds no additional parameter semantics beyond what the schema provides, such as format examples or constraints, so it meets the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Retrieve'), resource ('a specific note'), and identifier ('by its ID'), distinguishing it from siblings like kura_create (create), kura_delete (delete), kura_list_recent (list recent), and kura_search (search). It provides a complete purpose statement with no ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need a specific note by ID, but it does not explicitly state when to use this tool versus alternatives like kura_search (for searching notes) or kura_list_recent (for listing recent notes). The context is clear but lacks explicit guidance on exclusions or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_list_recentB
List the 20 most recent notes with their metadata (without full content). Use this to get an overview of recent activity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the tool lists '20 most recent notes' and excludes 'full content,' which adds some context. However, it doesn't cover critical behavioral aspects like whether this is a read-only operation, potential rate limits, authentication requirements, or pagination behavior. For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise and well-structured: two sentences that directly state the tool's function and usage. Every sentence earns its place by providing essential information without waste, making it easy to parse and understand quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (0 parameters, no output schema, no annotations), the description is adequate but has clear gaps. It explains what the tool does and its basic usage, but without annotations or output schema, it lacks details on behavioral traits like safety, performance, or return format. This makes it minimally viable but incomplete for full contextual understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema description coverage is 100%, so there are no parameters to document. The description doesn't need to add parameter semantics beyond what the schema provides. A baseline score of 4 is appropriate as it efficiently handles the lack of parameters without unnecessary elaboration.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List the 20 most recent notes with their metadata (without full content).' It specifies the verb ('List'), resource ('notes'), scope ('20 most recent'), and output limitation ('without full content'). However, it doesn't explicitly differentiate from sibling tools like kura_search or kura_get, which prevents a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implied usage guidance: 'Use this to get an overview of recent activity.' This suggests when to use the tool (for recent overviews) but doesn't explicitly state when not to use it or mention alternatives like kura_search for different filtering needs. It offers basic context but lacks explicit exclusions or sibling comparisons.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kura_searchC
Perform semantic search across KURA Notes. Returns relevant notes based on the query with metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The search query for semantic search | |
| limit | No | Maximum number of results to return (default: 10) | |
| contentType | No | Filter by content type (e.g., 'text') | |
| tags | No | Comma-separated tags to filter by |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool returns relevant notes with metadata, but lacks details on permissions, rate limits, error handling, or whether it's read-only (implied but not explicit). For a search tool with zero annotation coverage, this is a significant gap in transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the core purpose. It could be slightly more structured by explicitly mentioning it's a read operation, but it avoids redundancy and wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (semantic search with 4 parameters), no annotations, and no output schema, the description is minimally adequate. It covers the basic action and return type but lacks details on output format, error cases, or integration with sibling tools, leaving clear gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the schema already documents all four parameters thoroughly. The description adds no additional meaning beyond what the schema provides (e.g., no examples of query formats or tag usage). Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Perform semantic search') and resource ('across KURA Notes'), distinguishing it from siblings like create, delete, get, and list_recent. However, it doesn't specify the scope (e.g., all notes vs. recent) or differentiate from potential text-based search alternatives, keeping it from a perfect score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like kura_list_recent or kura_get. It mentions semantic search but doesn't clarify if this is the primary search method or when to prefer it over other filtering options, leaving usage context implied at best.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose with no ambiguity: create, delete, get, list recent, and search are all unique operations on notes. The descriptions reinforce this by specifying different actions (e.g., 'create a new text note' vs. 'retrieve a specific note'), making it easy for an agent to select the correct tool.
All tool names follow a consistent 'kura_verb' pattern (e.g., kura_create, kura_delete), with verbs that clearly indicate the action. There are no deviations in style or convention, making the naming predictable and easy to understand across the set.
With 5 tools, this server is well-scoped for a notes management system. Each tool serves a distinct and necessary function (create, delete, get, list, search), covering core operations without being overly complex or too sparse, which is ideal for this domain.
The tool set provides strong coverage for basic CRUD and search operations on notes, including create, delete, get, list, and semantic search. A minor gap exists in the lack of an update or edit tool, which could be a common need in note-taking workflows, but agents can work around this by deleting and recreating notes if necessary.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search, read, create and edit your Memol notes from Claude. Team note-taking with AI search.
Create, search and manage Knowtis collaborative notes from AI assistants.
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Create, search, and update notes in an xNotepad AI notebook, with semantic search and AI Q&A.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables Claude.ai to interact with the Papernote cloud-based note management system to create, read, and manage notes and research papers. It supports operations like text replacement, content appending, and paper summary retrieval through natural language commands.MIT
- AlicenseNot gradedqualityBmaintenanceBrings your Trilium Notes knowledge base into Claude Desktop, enabling full-text search, note management, and content interaction through natural language.6MIT
- FlicenseNot gradedqualityCmaintenanceEnables semantic search over personal study notes by exposing a vector search tool that Claude Desktop can call to retrieve relevant note content and synthesize grounded answers.
- AlicenseNot gradedqualityAmaintenanceEnables natural language interaction with a personal knowledge base stored locally on your computer, supporting semantic search, note reading, and writing through Claude Code or mobile apps.9MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TillMatthis/kura-notes-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server