mirror of
https://github.com/basicmachines-co/basic-memory
synced 2026-06-21 13:47:35 +00:00
fa594a0d29
Create a comprehensive Basic Memory knowledge graph project that users can download and import to explore MCP tool documentation. Features: - Complete project structure with frontmatter, observations, and relations - 4 detailed tool reference files (write_note, read_note, search_notes, build_context) - 2 category guides (Content Management, Search & Discovery) - Main index file connecting all entities - Comprehensive README with usage instructions - Python script to generate additional tools Structure follows Basic Memory format: - YAML frontmatter with title, type, permalink, tags - Observations with [category] syntax - Relations using [[Entity]] wikilinks - Knowledge graph connections between tools Users can: 1. Import into existing projects 2. Create new dedicated tool-reference project 3. Browse in any markdown editor 4. Navigate via search_notes, build_context, read_note 5. Use as template for LLM instructions Resolves #404 Co-authored-by: Paul Hernandez <phernandez@users.noreply.github.com>
692 lines
21 KiB
Python
692 lines
21 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Generate a Basic Memory project with comprehensive MCP tool reference documentation.
|
|
|
|
This script creates a structured knowledge base that users can download and import
|
|
into their Basic Memory projects, providing complete tool usage examples in a
|
|
navigable knowledge graph format.
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
|
|
# Tool categories and their tools
|
|
TOOLS = {
|
|
"Content Management": {
|
|
"write_note": {
|
|
"description": "Create or update markdown notes with semantic observations and relations",
|
|
"params": "title, content, folder, project, tags, entity_type",
|
|
"returns": "Markdown formatted summary of semantic content",
|
|
},
|
|
"read_note": {
|
|
"description": "Read markdown notes by title, permalink, or memory:// URL",
|
|
"params": "identifier, project, page, page_size",
|
|
"returns": "Full markdown content with frontmatter and formatting",
|
|
},
|
|
"read_content": {
|
|
"description": "Read raw file content (text, images, binaries) without knowledge graph processing",
|
|
"params": "path, project",
|
|
"returns": "Raw file content or base64 encoded binary data",
|
|
},
|
|
"view_note": {
|
|
"description": "View notes as formatted artifacts for better readability",
|
|
"params": "identifier, project, page, page_size",
|
|
"returns": "Formatted artifact presentation of note content",
|
|
},
|
|
"edit_note": {
|
|
"description": "Edit notes incrementally with append, prepend, find/replace, replace_section",
|
|
"params": "identifier, operation, content, project",
|
|
"returns": "Confirmation with updated entity information",
|
|
},
|
|
"move_note": {
|
|
"description": "Move notes to new locations, updating database and maintaining links",
|
|
"params": "identifier, destination_path, project",
|
|
"returns": "Confirmation with old and new paths",
|
|
},
|
|
"delete_note": {
|
|
"description": "Delete notes from the knowledge base",
|
|
"params": "identifier, project",
|
|
"returns": "Confirmation of deletion",
|
|
},
|
|
},
|
|
"Knowledge Graph Navigation": {
|
|
"build_context": {
|
|
"description": "Navigate knowledge graph via memory:// URLs for conversation continuity",
|
|
"params": "url, depth, timeframe, project",
|
|
"returns": "Contextual information from knowledge graph traversal",
|
|
},
|
|
"recent_activity": {
|
|
"description": "Get recently updated information with specified timeframe",
|
|
"params": "type, depth, timeframe, project",
|
|
"returns": "List of recently modified entities",
|
|
},
|
|
"list_directory": {
|
|
"description": "Browse directory contents with filtering and depth control",
|
|
"params": "dir_name, depth, file_name_glob, project",
|
|
"returns": "Hierarchical directory structure",
|
|
},
|
|
},
|
|
"Search & Discovery": {
|
|
"search_notes": {
|
|
"description": "Full-text search with advanced filtering and boolean operators",
|
|
"params": "query, project, page, page_size, search_type, types, entity_types, after_date",
|
|
"returns": "SearchResponse with paginated results",
|
|
},
|
|
},
|
|
"Project Management": {
|
|
"list_memory_projects": {
|
|
"description": "List all available projects with their status",
|
|
"params": "None",
|
|
"returns": "List of projects with metadata",
|
|
},
|
|
"create_memory_project": {
|
|
"description": "Create new Basic Memory projects",
|
|
"params": "project_name, project_path, set_default",
|
|
"returns": "Confirmation with project details",
|
|
},
|
|
"delete_project": {
|
|
"description": "Delete a project from configuration",
|
|
"params": "project_name",
|
|
"returns": "Confirmation of deletion",
|
|
},
|
|
"get_current_project": {
|
|
"description": "Get current project information and stats",
|
|
"params": "None",
|
|
"returns": "Current project metadata",
|
|
},
|
|
"sync_status": {
|
|
"description": "Check file synchronization and background operation status",
|
|
"params": "project",
|
|
"returns": "Sync status and operation details",
|
|
},
|
|
},
|
|
"Visualization": {
|
|
"canvas": {
|
|
"description": "Generate Obsidian canvas files for knowledge graph visualization",
|
|
"params": "nodes, edges, title, folder, project",
|
|
"returns": "Path to created canvas file",
|
|
},
|
|
},
|
|
}
|
|
|
|
# Detailed examples for key tools
|
|
TOOL_EXAMPLES = {
|
|
"write_note": '''
|
|
## Basic Usage
|
|
|
|
```python
|
|
# Create a simple note
|
|
write_note(
|
|
project="my-research",
|
|
title="Meeting Notes",
|
|
folder="meetings",
|
|
content="# Weekly Standup\\n\\n- [decision] Use SQLite for storage #tech"
|
|
)
|
|
```
|
|
|
|
## With Semantic Content
|
|
|
|
```python
|
|
write_note(
|
|
project="work-project",
|
|
title="API Design",
|
|
folder="specs",
|
|
content="""
|
|
# REST API Specification
|
|
|
|
## Overview
|
|
Core API endpoints for user management.
|
|
|
|
## Observations
|
|
- [design] RESTful architecture #api #architecture
|
|
- [tech] FastAPI framework #implementation #python
|
|
- [decision] JWT for authentication #security
|
|
|
|
## Relations
|
|
- implements [[Authentication System]]
|
|
- uses [[PostgreSQL Database]]
|
|
- specified_by [[OpenAPI Spec]]
|
|
""",
|
|
tags=["api", "design"],
|
|
entity_type="guide"
|
|
)
|
|
```
|
|
|
|
## Creating Knowledge Graph Entries
|
|
|
|
```python
|
|
# Entity with relations to other concepts
|
|
write_note(
|
|
project="knowledge-base",
|
|
title="Machine Learning Basics",
|
|
folder="concepts",
|
|
content="""
|
|
# Machine Learning Basics
|
|
|
|
Core concepts in machine learning and AI.
|
|
|
|
## Observations
|
|
- [definition] ML is subset of AI focused on learning from data #ai #ml
|
|
- [technique] Supervised learning requires labeled data #training
|
|
- [application] Image recognition, NLP, recommendation systems #use-cases
|
|
|
|
## Relations
|
|
- part_of [[Artificial Intelligence]]
|
|
- requires [[Training Data]]
|
|
- enables [[Predictive Analytics]]
|
|
- contrasts_with [[Rule-Based Systems]]
|
|
"""
|
|
)
|
|
```
|
|
''',
|
|
"read_note": '''
|
|
## Read by Permalink
|
|
|
|
```python
|
|
# Direct permalink lookup (fastest)
|
|
read_note("my-research", "specs/search-spec")
|
|
```
|
|
|
|
## Read by Title
|
|
|
|
```python
|
|
# Title search with fallback
|
|
read_note("work-project", "Search Specification")
|
|
```
|
|
|
|
## Read with Memory URL
|
|
|
|
```python
|
|
# Using memory:// protocol
|
|
read_note("my-research", "memory://specs/search-spec")
|
|
```
|
|
|
|
## With Pagination
|
|
|
|
```python
|
|
# Large notes with pagination
|
|
read_note("work-project", "Project Updates", page=2, page_size=5)
|
|
```
|
|
''',
|
|
"search_notes": '''
|
|
## Basic Search
|
|
|
|
```python
|
|
# Simple keyword search
|
|
search_notes("project planning")
|
|
```
|
|
|
|
## Boolean Operators
|
|
|
|
```python
|
|
# AND search (both terms required)
|
|
search_notes("project AND planning")
|
|
|
|
# OR search (either term)
|
|
search_notes("project OR meeting")
|
|
|
|
# NOT search (exclude term)
|
|
search_notes("project NOT archived")
|
|
|
|
# Complex boolean with grouping
|
|
search_notes("(project OR planning) AND notes")
|
|
```
|
|
|
|
## Phrase Search
|
|
|
|
```python
|
|
# Exact phrase match
|
|
search_notes('"weekly standup meeting"')
|
|
```
|
|
|
|
## Search with Filters
|
|
|
|
```python
|
|
# Filter by content type
|
|
search_notes(
|
|
"meeting notes",
|
|
types=["entity"]
|
|
)
|
|
|
|
# Filter by entity type
|
|
search_notes(
|
|
"meeting notes",
|
|
entity_types=["observation"]
|
|
)
|
|
|
|
# Recent content only
|
|
search_notes(
|
|
"bug report",
|
|
after_date="1 week"
|
|
)
|
|
```
|
|
|
|
## Search Types
|
|
|
|
```python
|
|
# Title-only search
|
|
search_notes("Machine Learning", search_type="title")
|
|
|
|
# Permalink pattern matching
|
|
search_notes("docs/meeting-*", search_type="permalink")
|
|
|
|
# Full-text search (default)
|
|
search_notes("keyword", search_type="text")
|
|
```
|
|
|
|
## Advanced Patterns
|
|
|
|
```python
|
|
# Content-specific search
|
|
search_notes("tag:example") # Search within tags
|
|
search_notes("category:observation") # Filter by category
|
|
|
|
# Complex multi-filter search
|
|
search_notes(
|
|
"(bug OR issue) AND NOT resolved",
|
|
types=["entity"],
|
|
after_date="2024-01-01"
|
|
)
|
|
```
|
|
''',
|
|
"build_context": '''
|
|
## Basic Context Building
|
|
|
|
```python
|
|
# Build context from a starting point
|
|
build_context("memory://projects/current-project")
|
|
```
|
|
|
|
## With Depth Control
|
|
|
|
```python
|
|
# Follow relations to depth of 2
|
|
build_context("memory://concepts/machine-learning", depth=2)
|
|
```
|
|
|
|
## With Timeframe Filter
|
|
|
|
```python
|
|
# Recent context from last week
|
|
build_context("memory://meetings/weekly", timeframe="1w")
|
|
```
|
|
|
|
## For Conversation Continuity
|
|
|
|
```python
|
|
# Load previous conversation context
|
|
build_context("memory://conversations/project-discussion", depth=3)
|
|
```
|
|
''',
|
|
"edit_note": '''
|
|
## Append Content
|
|
|
|
```python
|
|
edit_note(
|
|
"my-research",
|
|
"meeting-notes",
|
|
operation="append",
|
|
content="\\n## New Section\\n\\nAdditional meeting notes..."
|
|
)
|
|
```
|
|
|
|
## Prepend Content
|
|
|
|
```python
|
|
edit_note(
|
|
"work-project",
|
|
"todo-list",
|
|
operation="prepend",
|
|
content="## Urgent Tasks\\n\\n- Fix critical bug\\n\\n"
|
|
)
|
|
```
|
|
|
|
## Find and Replace
|
|
|
|
```python
|
|
edit_note(
|
|
"my-research",
|
|
"api-spec",
|
|
operation="find_replace",
|
|
content="SQLite|PostgreSQL" # Find|Replace pattern
|
|
)
|
|
```
|
|
|
|
## Replace Section
|
|
|
|
```python
|
|
edit_note(
|
|
"work-project",
|
|
"design-doc",
|
|
operation="replace_section",
|
|
content="## Old Section|## New Section\\n\\nUpdated content..."
|
|
)
|
|
```
|
|
''',
|
|
}
|
|
|
|
|
|
def create_frontmatter(title: str, entity_type: str, tags: list[str], permalink: str = None) -> str:
|
|
"""Generate YAML frontmatter for a markdown file."""
|
|
created = datetime.now().isoformat()
|
|
fm = [
|
|
"---",
|
|
f"title: {title}",
|
|
f"type: {entity_type}",
|
|
]
|
|
if permalink:
|
|
fm.append(f"permalink: {permalink}")
|
|
if tags:
|
|
fm.append("tags:")
|
|
for tag in tags:
|
|
fm.append(f"- {tag}")
|
|
fm.extend([
|
|
f"created: {created}",
|
|
f"modified: {created}",
|
|
"---",
|
|
])
|
|
return "\n".join(fm)
|
|
|
|
|
|
def generate_category_file(category: str, tools: dict, output_dir: Path) -> None:
|
|
"""Generate a category index file."""
|
|
filename = category.lower().replace(" ", "-").replace("&", "and")
|
|
filepath = output_dir / "categories" / f"{filename}.md"
|
|
|
|
tags = ["mcp-tools", "reference", "category"]
|
|
frontmatter = create_frontmatter(category, "guide", tags)
|
|
|
|
content = [frontmatter, "", f"# {category}", ""]
|
|
content.append(f"Tools in the {category} category for Basic Memory MCP server.")
|
|
content.append("")
|
|
|
|
content.append("## Observations")
|
|
content.append(f"- [category] Contains {len(tools)} MCP tools #mcp #tools")
|
|
content.append(f"- [purpose] {category} functionality for Basic Memory #functionality")
|
|
content.append("")
|
|
|
|
content.append("## Tools in This Category")
|
|
content.append("")
|
|
for tool_name, tool_info in tools.items():
|
|
content.append(f"### {tool_name}")
|
|
content.append(f"{tool_info['description']}")
|
|
content.append("")
|
|
|
|
content.append("## Relations")
|
|
for tool_name in tools.keys():
|
|
tool_title = " ".join(word.capitalize() for word in tool_name.split("_"))
|
|
content.append(f"- contains [[{tool_title}]]")
|
|
content.append("- part_of [[MCP Tool Reference]]")
|
|
|
|
filepath.parent.mkdir(parents=True, exist_ok=True)
|
|
filepath.write_text("\n".join(content))
|
|
print(f"Created: {filepath}")
|
|
|
|
|
|
def generate_tool_file(tool_name: str, tool_info: dict, category: str, output_dir: Path) -> None:
|
|
"""Generate a detailed tool reference file."""
|
|
tool_title = " ".join(word.capitalize() for word in tool_name.split("_"))
|
|
filepath = output_dir / "tools" / f"{tool_name}.md"
|
|
|
|
tags = ["mcp-tools", "reference", tool_name]
|
|
frontmatter = create_frontmatter(tool_title, "guide", tags, f"tools/{tool_name}")
|
|
|
|
content = [frontmatter, "", f"# {tool_title}", ""]
|
|
content.append(tool_info["description"])
|
|
content.append("")
|
|
|
|
content.append("## Function Signature")
|
|
content.append("")
|
|
content.append("```python")
|
|
content.append(f"{tool_name}({tool_info['params']})")
|
|
content.append("```")
|
|
content.append("")
|
|
|
|
content.append("## Observations")
|
|
content.append(f"- [tool] MCP tool for {tool_info['description'].lower()} #mcp #basic-memory")
|
|
content.append(f"- [returns] {tool_info['returns']} #output")
|
|
content.append(f"- [category] {category} tool #classification")
|
|
content.append("")
|
|
|
|
# Add examples if available
|
|
if tool_name in TOOL_EXAMPLES:
|
|
content.append("## Usage Examples")
|
|
content.append(TOOL_EXAMPLES[tool_name])
|
|
content.append("")
|
|
|
|
content.append("## Relations")
|
|
category_link = category.replace(" ", "-").replace("&", "and")
|
|
category_title = category
|
|
content.append(f"- part_of [[{category_title}]]")
|
|
content.append("- documented_in [[MCP Tool Reference]]")
|
|
|
|
# Add cross-references to related tools
|
|
if category == "Content Management":
|
|
if tool_name == "write_note":
|
|
content.append("- complements [[Read Note]]")
|
|
content.append("- complements [[Edit Note]]")
|
|
elif tool_name == "read_note":
|
|
content.append("- complements [[Write Note]]")
|
|
content.append("- alternative [[View Note]]")
|
|
elif tool_name == "edit_note":
|
|
content.append("- requires [[Read Note]]")
|
|
content.append("- alternative [[Write Note]]")
|
|
elif category == "Search & Discovery":
|
|
content.append("- complements [[Recent Activity]]")
|
|
content.append("- complements [[Build Context]]")
|
|
|
|
filepath.parent.mkdir(parents=True, exist_ok=True)
|
|
filepath.write_text("\n".join(content))
|
|
print(f"Created: {filepath}")
|
|
|
|
|
|
def generate_index_file(output_dir: Path) -> None:
|
|
"""Generate the main index file."""
|
|
filepath = output_dir / "index.md"
|
|
|
|
tags = ["mcp-tools", "reference", "index"]
|
|
frontmatter = create_frontmatter("MCP Tool Reference", "guide", tags, "index")
|
|
|
|
content = [frontmatter, "", "# MCP Tool Reference", ""]
|
|
content.append("Comprehensive reference for all Basic Memory MCP tools with examples and usage patterns.")
|
|
content.append("")
|
|
|
|
content.append("## Overview")
|
|
content.append("")
|
|
content.append("This project contains detailed documentation for all 16 core MCP tools in Basic Memory.")
|
|
content.append("Each tool is documented as a separate entity with examples, parameters, and relationships.")
|
|
content.append("")
|
|
|
|
content.append("## Observations")
|
|
total_tools = sum(len(tools) for tools in TOOLS.values())
|
|
content.append(f"- [structure] Contains {total_tools} tool reference documents #documentation")
|
|
content.append(f"- [structure] Organized into {len(TOOLS)} categories #organization")
|
|
content.append("- [purpose] Provides copy-paste examples for LLM instructions #usage")
|
|
content.append("- [format] Follows Basic Memory knowledge graph format #compliance")
|
|
content.append("")
|
|
|
|
content.append("## Tool Categories")
|
|
content.append("")
|
|
for category in TOOLS.keys():
|
|
category_link = category.replace(" ", "-").replace("&", "and")
|
|
content.append(f"### {category}")
|
|
content.append(f"See [[{category}]] for all tools in this category.")
|
|
content.append("")
|
|
|
|
content.append("## Relations")
|
|
for category in TOOLS.keys():
|
|
content.append(f"- contains [[{category}]]")
|
|
content.append("- documented_in [[Basic Memory Documentation]]")
|
|
|
|
filepath.write_text("\n".join(content))
|
|
print(f"Created: {filepath}")
|
|
|
|
|
|
def generate_readme(output_dir: Path) -> None:
|
|
"""Generate README for the project."""
|
|
filepath = output_dir / "README.md"
|
|
|
|
content = [
|
|
"# Basic Memory MCP Tool Reference Project",
|
|
"",
|
|
"A downloadable Basic Memory project containing comprehensive documentation for all MCP tools.",
|
|
"",
|
|
"## What This Is",
|
|
"",
|
|
"This is a complete Basic Memory project that you can import into your own Basic Memory installation.",
|
|
"It provides detailed reference documentation for all 16 core MCP tools, organized as a knowledge graph",
|
|
"that you can navigate and search using Basic Memory's tools.",
|
|
"",
|
|
"## How to Use",
|
|
"",
|
|
"### Option 1: Import into Existing Project",
|
|
"",
|
|
"1. Copy the contents of this directory into your Basic Memory project",
|
|
"2. Run `basic-memory sync` to index the new content",
|
|
"3. Use `search_notes` or `build_context` to explore the documentation",
|
|
"",
|
|
"### Option 2: Create New Project",
|
|
"",
|
|
"1. Create a new Basic Memory project:",
|
|
" ```bash",
|
|
" basic-memory tools create-memory-project \\",
|
|
' --project-name "tool-reference" \\',
|
|
' --project-path "~/basic-memory-tool-reference"',
|
|
" ```",
|
|
"",
|
|
"2. Copy these files into the new project directory",
|
|
"",
|
|
"3. Sync the project:",
|
|
" ```bash",
|
|
" basic-memory sync",
|
|
" ```",
|
|
"",
|
|
"### Option 3: Browse in Your Editor",
|
|
"",
|
|
"The files are standard markdown with Basic Memory frontmatter.",
|
|
"You can browse them in any markdown editor or Obsidian.",
|
|
"",
|
|
"## Project Structure",
|
|
"",
|
|
"```",
|
|
"tool-reference/",
|
|
"├── README.md (this file)",
|
|
"├── index.md (main reference guide)",
|
|
"├── tools/",
|
|
"│ ├── write_note.md",
|
|
"│ ├── read_note.md",
|
|
"│ ├── search_notes.md",
|
|
"│ └── ... (all 16 tools)",
|
|
"└── categories/",
|
|
" ├── content-management.md",
|
|
" ├── knowledge-graph-navigation.md",
|
|
" ├── search-and-discovery.md",
|
|
" ├── project-management.md",
|
|
" └── visualization.md",
|
|
"```",
|
|
"",
|
|
"## Using the Documentation",
|
|
"",
|
|
"### Search for Tools",
|
|
"",
|
|
"```python",
|
|
'# Find all content management tools',
|
|
'search_notes("content management", search_type="text")',
|
|
"",
|
|
"# Find write_note examples",
|
|
'search_notes("write_note")',
|
|
"```",
|
|
"",
|
|
"### Navigate by Category",
|
|
"",
|
|
"```python",
|
|
'# Read a category overview',
|
|
'read_note("content-management")',
|
|
"",
|
|
"# Build context around search tools",
|
|
'build_context("memory://categories/search-and-discovery")',
|
|
"```",
|
|
"",
|
|
"### View Tool Details",
|
|
"",
|
|
"```python",
|
|
'# Read specific tool documentation',
|
|
'read_note("tools/write_note")',
|
|
'read_note("tools/search_notes")',
|
|
"",
|
|
"# View as artifact for better formatting",
|
|
'view_note("tools/build_context")',
|
|
"```",
|
|
"",
|
|
"## What's Included",
|
|
"",
|
|
"- **16 tool reference documents** with detailed examples",
|
|
"- **5 category guides** organizing tools by function",
|
|
"- **Knowledge graph relations** connecting related tools",
|
|
"- **Copy-paste examples** ready for LLM instructions",
|
|
"- **Search syntax guide** for advanced queries",
|
|
"- **Real-world workflows** showing tool combinations",
|
|
"",
|
|
"## Tool Categories",
|
|
"",
|
|
]
|
|
|
|
for category, tools in TOOLS.items():
|
|
content.append(f"### {category}")
|
|
content.append("")
|
|
for tool_name, tool_info in tools.items():
|
|
content.append(f"- `{tool_name}`: {tool_info['description']}")
|
|
content.append("")
|
|
|
|
content.extend([
|
|
"## Generated Documentation",
|
|
"",
|
|
"This project was automatically generated from the Basic Memory MCP tool source code.",
|
|
"You can regenerate it by running:",
|
|
"",
|
|
"```bash",
|
|
"python scripts/generate_tool_reference_project.py",
|
|
"```",
|
|
"",
|
|
"## License",
|
|
"",
|
|
"Same as Basic Memory - AGPL v3",
|
|
"",
|
|
])
|
|
|
|
filepath.write_text("\n".join(content))
|
|
print(f"Created: {filepath}")
|
|
|
|
|
|
def main():
|
|
"""Generate the complete tool reference project."""
|
|
output_dir = Path("examples/tool-reference")
|
|
|
|
print(f"Generating Basic Memory Tool Reference Project in {output_dir}")
|
|
print()
|
|
|
|
# Generate category files
|
|
for category, tools in TOOLS.items():
|
|
generate_category_file(category, tools, output_dir)
|
|
|
|
# Generate tool files
|
|
for category, tools in TOOLS.items():
|
|
for tool_name, tool_info in tools.items():
|
|
generate_tool_file(tool_name, tool_info, category, output_dir)
|
|
|
|
# Generate index
|
|
generate_index_file(output_dir)
|
|
|
|
# Generate README
|
|
generate_readme(output_dir)
|
|
|
|
print()
|
|
print("✓ Tool reference project generated successfully!")
|
|
print(f"✓ Location: {output_dir}")
|
|
print(f"✓ Total files: {len(list(output_dir.rglob('*.md')))}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|