TiddlyWiki MCP Server
Enables semantic search capabilities using Ollama embeddings, allowing natural language queries to find conceptually related tiddlers with vector similarity search.
Provides tools for managing TiddlyWiki wikis via HTTP API, including searching tiddlers using filter syntax or semantic search, creating and updating tiddlers with custom fields, and deleting tiddlers with content preview.
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., "@TiddlyWiki MCP Serversearch for journal entries about productivity tips"
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.
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
Semantic Search
When Ollama is available, the server provides semantic search capabilities:
Natural language queries find conceptually related tiddlers
Uses
nomic-embed-textembeddings modelSQLite-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
listencommand)Ollama (optional, for semantic search)
Build Prerequisites
This project uses native SQLite modules that require compilation. You'll need:
Linux:
build-essential, Python 3macOS: Xcode Command Line Tools (
xcode-select --install)Windows: Visual Studio Build Tools, Python 3
Installation
From npm (recommended)
TIDDLYWIKI_URL=http://localhost:8080 npx tiddlywiki-mcp-serverOr install globally:
npm install -g tiddlywiki-mcp-server
TIDDLYWIKI_URL=http://localhost:8080 tiddlywiki-mcp-serverFrom source
git clone https://github.com/ppetru/tiddlywiki-mcp.git
cd tiddlywiki-mcp
npm install
npm run buildQuick 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=80802. (Optional) Set up Ollama for Semantic Search
# Install Ollama from https://ollama.ai
# Then pull the embedding model:
ollama pull nomic-embed-text3. Start the MCP Server
TIDDLYWIKI_URL=http://localhost:8080 npx tiddlywiki-mcp-serverConfiguration
All configuration is via environment variables. See .env.example for a complete reference.
Required
Variable | Description |
| URL of your TiddlyWiki server (e.g., |
Optional
Variable | Default | Description |
|
| Transport mode: |
|
| HTTP server port (when using http transport) |
|
| Ollama API URL |
|
| Embedding model name |
|
| Enable/disable semantic search |
|
| SQLite database path for embeddings |
|
| HTTP header for authentication (can be any header your TiddlyWiki expects) |
|
| 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-serverThe server exposes:
GET /health- Health check endpointPOST /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 installRunning Tests
npm testTests 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 onlyType Checking
npm run typecheckPre-commit Hooks
Pre-commit hooks are configured with lefthook and run automatically:
Format check (Prettier)
Lint (ESLint)
Tests (Vitest)
Type check (TypeScript)
Building
npm run buildArchitecture
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 syncKey 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 toolscreate_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).
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the new tiddler | |
| text | Yes | Text content | |
| tags | No | Tags as space-separated string (optional, e.g., "Journal" or "Journal OYS") | |
| type | No | Content type (default: text/markdown) | text/markdown |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the tiddler to delete |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| semantic | No | Natural 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. | |
| filter | No | TiddlyWiki 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. | |
| includeText | No | Include text content in results (default: false). Set to true to get full tiddler content. | |
| offset | No | Number of results to skip for pagination (default: 0). Only applies to filter-based search. | |
| limit | No | Maximum 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
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Title of the tiddler to update | |
| text | No | New text content (optional) | |
| tags | No | New tags as space-separated string (optional) | |
| type | No | Content type like "text/markdown" or "text/vnd.tiddlywiki" (optional) |
TDQS
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.
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.
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.
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.
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.
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
Each tool has a completely distinct purpose: create, delete, search, and update. There is no ambiguity or overlap among them.
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.
With 4 tools, the set is well-scoped for a TiddlyWiki server. It covers the essential operations without being too sparse or overloaded.
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
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
Personal wiki and memory layer for AI assistants. Persistent, structured memory across sessions.
Shared project wiki for AI agents: read and write pages, next actions, and activity logs over MCP.
Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceEnables AI assistants to read, write, search, and navigate Obsidian vault notes with support for CRUD operations, full-text search, graph navigation, daily notes, and frontmatter management.4,785
- AlicenseNot gradedqualityCmaintenanceConnects AI agents to TiddlyWiki through the Model Context Protocol, enabling listing, searching, filtering, creating, updating, and deleting tiddlers. Defaults to read-only mode with optional write permissions.9MIT
- AlicenseNot gradedqualityBmaintenanceEnables LLM clients to interact with any MediaWiki wiki, supporting page creation/editing, search, file uploads, category browsing, and page history retrieval. Supports multiple wikis with OAuth2 or bot password authentication for both public and private wikis.566MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to search, retrieve, and optionally edit pages in a WikiJS knowledge base via the Model Context Protocol.401MIT
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/ppetru/tiddlywiki-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server