Skip to main content
Glama
ppetru

TiddlyWiki MCP Server

by ppetru

TiddlyWiki MCP Server

A Model Context Protocol (MCP) server that provides AI assistants with access to TiddlyWiki wikis via the HTTP API. Supports semantic search using Ollama embeddings.

Features

MCP Tools

  • search_tiddlers - Search tiddlers using TiddlyWiki filter syntax, semantic similarity, or hybrid (both combined)

  • create_tiddler - Create new tiddlers with custom fields

  • update_tiddler - Update existing tiddlers with diff preview

  • delete_tiddler - Delete tiddlers with content preview

MCP Resources

  • filter-reference://syntax - Complete TiddlyWiki filter syntax reference

When Ollama is available, the server provides semantic search capabilities:

  • Natural language queries find conceptually related tiddlers

  • Uses nomic-embed-text embeddings model

  • SQLite-vec for efficient vector similarity search

  • Background sync keeps embeddings up-to-date

  • Hybrid mode combines filter results with semantic reranking

Related MCP server: Tiddly MCP

Requirements

  • Node.js 22+

  • TiddlyWiki with HTTP API enabled (e.g., TiddlyWiki on Node.js with listen command)

  • Ollama (optional, for semantic search)

Build Prerequisites

This project uses native SQLite modules that require compilation. You'll need:

  • Linux: build-essential, Python 3

  • macOS: Xcode Command Line Tools (xcode-select --install)

  • Windows: Visual Studio Build Tools, Python 3

Installation

TIDDLYWIKI_URL=http://localhost:8080 npx tiddlywiki-mcp-server

Or install globally:

npm install -g tiddlywiki-mcp-server
TIDDLYWIKI_URL=http://localhost:8080 tiddlywiki-mcp-server

From source

git clone https://github.com/ppetru/tiddlywiki-mcp.git
cd tiddlywiki-mcp
npm install
npm run build

Quick Start

1. Start TiddlyWiki with HTTP API

# Install TiddlyWiki if you haven't already
npm install -g tiddlywiki

# Create a new wiki and start it with HTTP API
tiddlywiki mywiki --init server
tiddlywiki mywiki --listen port=8080
# Install Ollama from https://ollama.ai
# Then pull the embedding model:
ollama pull nomic-embed-text

3. Start the MCP Server

TIDDLYWIKI_URL=http://localhost:8080 npx tiddlywiki-mcp-server

Configuration

All configuration is via environment variables. See .env.example for a complete reference.

Required

Variable

Description

TIDDLYWIKI_URL

URL of your TiddlyWiki server (e.g., http://localhost:8080)

Optional

Variable

Default

Description

MCP_TRANSPORT

stdio

Transport mode: stdio or http

MCP_PORT

3000

HTTP server port (when using http transport)

OLLAMA_URL

http://localhost:11434

Ollama API URL

OLLAMA_MODEL

nomic-embed-text

Embedding model name

EMBEDDINGS_ENABLED

true

Enable/disable semantic search

EMBEDDINGS_DB_PATH

./embeddings.db

SQLite database path for embeddings

AUTH_HEADER

X-Oidc-Username

HTTP header for authentication (can be any header your TiddlyWiki expects)

AUTH_USER

mcp-user

Username for TiddlyWiki API requests

Usage

stdio Mode (Claude Desktop)

Add to your Claude Desktop configuration (claude_desktop_config.json):

{
  "mcpServers": {
    "tiddlywiki": {
      "command": "npx",
      "args": ["tiddlywiki-mcp-server"],
      "env": {
        "TIDDLYWIKI_URL": "http://localhost:8080"
      }
    }
  }
}

HTTP Mode

Start the server:

TIDDLYWIKI_URL=http://localhost:8080 MCP_TRANSPORT=http MCP_PORT=3000 npx tiddlywiki-mcp-server

The server exposes:

  • GET /health - Health check endpoint

  • POST /mcp - MCP JSON-RPC endpoint (stateless mode)

Example Tool Usage

Filter search (TiddlyWiki filter syntax):

{
  "name": "search_tiddlers",
  "arguments": {
    "filter": "[tag[Journal]prefix[2025-01]]",
    "includeText": true
  }
}

Semantic search (natural language):

{
  "name": "search_tiddlers",
  "arguments": {
    "semantic": "times I felt anxious about work",
    "limit": 10
  }
}

Hybrid search (filter + semantic reranking):

{
  "name": "search_tiddlers",
  "arguments": {
    "filter": "[tag[Journal]]",
    "semantic": "productivity tips",
    "limit": 20
  }
}

Development

Setup

npm install

Running Tests

npm test

Tests run quickly (~1s) and include unit tests for all tool handlers.

Linting

npm run lint        # Check for issues
npm run format      # Fix formatting
npm run format:check # Check formatting only

Type Checking

npm run typecheck

Pre-commit Hooks

Pre-commit hooks are configured with lefthook and run automatically:

  1. Format check (Prettier)

  2. Lint (ESLint)

  3. Tests (Vitest)

  4. Type check (TypeScript)

Building

npm run build

Architecture

src/
├── index.ts              # Entry point, transport setup, server lifecycle
├── tiddlywiki-http.ts    # TiddlyWiki HTTP API client
├── service-discovery.ts  # URL resolution (direct URLs, Consul SRV, hostname:port)
├── filter-reference.ts   # Filter syntax documentation
├── logger.ts             # Structured logging
├── tools/                # MCP tool handlers
│   ├── types.ts          # Shared types and Zod schemas
│   ├── search-tiddlers.ts
│   ├── create-tiddler.ts
│   ├── update-tiddler.ts
│   └── delete-tiddler.ts
└── embeddings/           # Semantic search infrastructure
    ├── database.ts       # SQLite-vec database
    ├── ollama-client.ts  # Ollama API client
    └── sync-worker.ts    # Background embedding sync

Key Design Decisions

  • Stateless HTTP mode: Each request gets its own Server/Transport instance to prevent request ID collisions with concurrent clients

  • Graceful degradation: Semantic search is optional; the server works without Ollama

  • Token-aware responses: Search results are validated against token limits with pagination suggestions

  • Background sync: Embeddings are updated periodically without blocking requests

License

MIT

Available Tools

4 tools
create_tiddlerA

Create a new tiddler. Shows a preview and requests approval before creating. Supports arbitrary custom fields beyond the standard ones (e.g., caption, summary, author, or any TiddlyWiki field).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle of the new tiddler
textYesText content
tagsNoTags as space-separated string (optional, e.g., "Journal" or "Journal OYS")
typeNoContent type (default: text/markdown)text/markdown

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description fully discloses the non-immediate nature of the action ('shows a preview and requests approval'). It also mentions support for custom fields, adding useful behavioral context. No contradictions.

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-loads the primary purpose and key behavior, and contains no unnecessary information. Every sentence is essential.

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?

The description covers purpose, key behavior (preview/approval), and custom fields. Without an output schema, it does not mention return values, but for a creation tool this is acceptable. Slightly missing confirmation details, but overall complete given context.

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?

Schema coverage is 100%, so parameters are well-documented in the schema. The description adds value by explicitly noting that arbitrary custom fields beyond the schema are supported, which is not evident from the schema alone.

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 a new tiddler'), identifies the resource ('tiddler'), and distinguishes itself from sibling tools (delete, search, update) by specifying creation-specific behavior like preview and approval.

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 usage for creation by contrasting with siblings (no search/delete/update) and notes a key behavior (preview/approval). However, it does not explicitly state when not to use it or provide alternatives, but this is partially mitigated by sibling names.

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

delete_tiddlerA

Delete a tiddler. Shows current content and requests approval before deleting.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle of the tiddler to delete

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries full burden. It discloses the behavioral traits of showing content and requesting approval before deletion, but it does not mention permissions, reversibility, or what happens after approval. This is adequate but not comprehensive.

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 long, no unnecessary words, and front-loads the key action. Every sentence earns its place.

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 simplicity of the tool (one parameter, no output schema), the description covers the core behavior. It could mention side effects or how the approval request is handled, but it is mostly complete for a delete 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?

Schema coverage is 100% with one parameter 'title' described in the schema. The description adds no additional meaning beyond what the schema provides, so a baseline score of 3 is appropriate.

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 'Delete' and the resource 'a tiddler', and it distinguishes from sibling tools (create, search, update) by specifying the action and the additional step of showing content and requesting approval.

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 a confirmation step but does not explicitly state when to use this tool versus alternatives like update_tiddler or whether there is a way to delete without approval. No guidance on prerequisites or conditions is provided.

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

search_tiddlersA

Search tiddlers using filter syntax, semantic similarity, or both. Supports filter-based queries (e.g., by tag, date, title), semantic/conceptual search, and hybrid combinations. Returns matching tiddlers with metadata and optionally text content.

ParametersJSON Schema
NameRequiredDescriptionDefault
semanticNoNatural language semantic search query (e.g., "times I felt anxious about parenting", "entries about work stress"). Finds conceptually related entries even without exact keyword matches.
filterNoTiddlyWiki filter expression (e.g., "[tag[Journal]prefix[2025-11]]" for November 2025 journal entries, "[title[2025-11-12]]" for specific entry). Can be used alone for filter-based search, or combined with semantic for hybrid search.
includeTextNoInclude text content in results (default: false). Set to true to get full tiddler content.
offsetNoNumber of results to skip for pagination (default: 0). Only applies to filter-based search.
limitNoMaximum number of results to return (default: 10 for semantic search, unlimited for filter-only, max: 100). Use for pagination to avoid response size limits.

TDQS

A4.1/5.0
Behavior4/5

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

No annotations provided. The description explains that results include metadata and optionally text, details pagination mechanics (offset/limit apply to filter-only, defaults differ by mode), and supports hybrid searches. It implies read-only behavior but does not explicitly state it.

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?

Concise two-sentence overview followed by parameter details. Each sentence is informative and front-loaded with purpose. No unnecessary text.

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 no output schema, the description adequately covers return behavior (metadata and optional text). It addresses pagination, hybrid mode, and text inclusion. Missing explicit sorting or ordering information, but not critical for search functionality.

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?

Schema coverage is 100%, but the description adds value by providing examples for filter and semantic queries, explaining default limits per mode, and clarifying pagination applicability. This goes beyond the schema descriptions.

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?

Clearly states the tool searches tiddlers using filter syntax, semantic similarity, or both. Provides specific examples and distinguishes itself from the CRUD sibling tools (create, delete, update).

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?

Describes when to use each search mode (filter, semantic, hybrid) and pagination behavior, but lacks explicit when-not guidance or comparison to alternatives. The distinction from CRUD tools is implicit.

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

update_tiddlerA

Update an existing tiddler. Shows a diff of changes and requests approval before applying. Preserves metadata like created timestamp. Supports arbitrary custom fields beyond the standard ones (e.g., caption, summary, author, or any TiddlyWiki field).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYesTitle of the tiddler to update
textNoNew text content (optional)
tagsNoNew tags as space-separated string (optional)
typeNoContent type like "text/markdown" or "text/vnd.tiddlywiki" (optional)

TDQS

A4.1/5.0
Behavior4/5

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

Given no annotations, the description carries full burden. It discloses that the tool shows a diff, requests approval before applying, and preserves metadata like created timestamp. This is fairly transparent, though it lacks details on auth needs, rate limits, or what happens on failure. Still above average.

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?

Three sentences, each earning its place: first states purpose, second adds key behavioral traits, third clarifies field support. Front-loaded and efficient.

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 tool has 4 parameters and no output schema. The description covers the update behavior and arbitrary fields but does not explain return values, error handling (e.g., tiddler not found), or the full scope of what 'preserves metadata' entails. Adequate but not complete.

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 100%, so the baseline is 3. The description mentions support for arbitrary custom fields, which reinforces the schema's additionalProperties but does not add new meaning beyond what the schema already provides (e.g., 'caption, summary, author'). No additional parameter context is provided.

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 'Update an existing tiddler' and distinguishes it from sibling tools (create, delete, search) by name and description. It also adds specific behavior like showing a diff and requesting approval, which clarifies the tool's role.

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 the tool is for updating existing tiddlers, and the sibling tool names provide context, but it does not explicitly state when to use this over alternatives or when not to use it. However, the behavioral note about diff/approval suggests an interactive use case.

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

TDQS

A4.2/5.0
Disambiguation5/5

Each tool has a completely distinct purpose: create, delete, search, and update. There is no ambiguity or overlap among them.

Naming Consistency5/5

All tool names follow the consistent verb_noun pattern: create_tiddler, delete_tiddler, search_tiddlers, update_tiddler. The singular vs plural in 'tiddler' vs 'tiddlers' is negligible.

Tool Count5/5

With 4 tools, the set is well-scoped for a TiddlyWiki server. It covers the essential operations without being too sparse or overloaded.

Completeness4/5

The tools cover create, read (via search), update, and delete. A dedicated get_tiddler by ID is missing, but search can filter by title, so the gap is minor.

Maintenance

ActivityInactive
ResponsivenessSyncing

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

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/ppetru/tiddlywiki-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server