Skip to main content
Glama
TillMatthis

KURA Notes MCP Client

by TillMatthis

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

  1. Clone or download this repository:

    git clone <repository-url>
    cd kura-mcp-client
  2. Install dependencies:

    npm install
  3. Build the project:

    npm run build

    This will:

    • Compile TypeScript to JavaScript

    • Generate the dist/index.js file

    • Make 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 key

  • KURA_API_URL (optional): The KURA API base URL (defaults to https://kura.tillmaessen.de)

Available Tools

1. kura_search

Perform semantic search across your KURA Notes.

Parameters:

  • query (string, required): The search query

  • limit (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 note

  • title (string, optional): Title for the note

  • annotation (string, optional): Additional context or annotation

  • tags (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 notes

Response: 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:

  1. Search for notes:

    • "Search my KURA notes for information about TypeScript"

    • "Find notes tagged with 'project-ideas'"

  2. Create notes:

    • "Create a note: 'Meeting notes from today's standup...'"

    • "Save this idea to KURA: 'Build a note-taking MCP client'"

  3. Retrieve notes:

    • "Get the full content of note ID xyz789"

    • "Show me my recent notes"

  4. 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.json is correct

  • Ensure the project is built: npm run build

  • Check that dist/index.js exists and is executable

API_KEY error

Symptom: "ERROR: API_KEY environment variable is required"

Solutions:

  • Verify API_KEY is set in the env section of your Claude Desktop config

  • Restart 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 Authorization header format is correct

Network errors

Symptom: "Failed to fetch" or connection timeout errors

Solutions:

  • Verify KURA_API_URL is correct and accessible

  • Check your internet connection

  • Verify the KURA API service is running

Viewing logs

The MCP client logs to stderr. To view logs:

macOS/Linux:

  1. Close Claude Desktop

  2. 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 build

Running 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.js

The 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 tools

    • CallToolRequestSchema: Executes tool calls with error handling

Adding New Tools

To add new tools:

  1. Add the tool definition to the tools array

  2. Add a new case in the CallToolRequestSchema handler

  3. Implement the API call and response handling

  4. Update this README with the new tool documentation

API Reference

The client interacts with these KURA Notes API endpoints:

  • GET /api/search - Semantic search

  • POST /api/capture - Create notes

  • GET /api/content/{id} - Get specific note

  • GET /api/content/recent - List recent notes

  • DELETE /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 tools
kura_createB

Create a new text note in KURA Notes. Use this to capture ideas, information, or any text content.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYesThe main content of the note
titleNoOptional title for the note
annotationNoOptional annotation or additional context
tagsNoOptional array of tags to categorize the note

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe unique identifier of the note to delete

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe unique identifier of the note

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

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 (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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

TDQS

A3.7/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityInactive
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    Brings your Trilium Notes knowledge base into Claude Desktop, enabling full-text search, note management, and content interaction through natural language.
    6
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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.
    9
    MIT

Appeared in Searches

Latest Blog Posts

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