Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
897 changes: 897 additions & 0 deletions CLAUDE.md

Large diffs are not rendered by default.

236 changes: 236 additions & 0 deletions examples/mcp/advanced_workflow_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
#!/usr/bin/env python3
"""
Advanced MCP Workflow Example

This example demonstrates more complex workflows using the Memori MCP server,
including:
- Multi-session management
- Category-based filtering
- Importance-based search
- Memory lifecycle management
"""

import sys
import os
from datetime import datetime

# Add parent directory to path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

# Set environment variables
os.environ["MEMORI_DATABASE_URL"] = "sqlite:///advanced_mcp.db"
os.environ["OPENAI_API_KEY"] = "your-api-key-here"

from mcp.memori_mcp_server import (
record_conversation,
search_memories,
get_recent_memories,
get_memory_statistics,
clear_session_memories,
)


def simulate_project_conversation():
"""Simulate a conversation about a software project"""

print("\n" + "=" * 80)
print("SCENARIO 1: Software Project Discussion")
print("=" * 80)

user_id = "developer_123"
session_id = "project_planning"

# Day 1: Initial project discussion
print("\nDay 1: Initial Planning")
conversations = [
{
"user": "I'm starting a new e-commerce platform project",
"ai": "Exciting! Let's plan this carefully. What's your tech stack preference?",
},
{
"user": "I want to use Next.js for frontend and Python FastAPI for backend",
"ai": "Great choices! Next.js provides excellent SEO and FastAPI is very performant.",
},
{
"user": "I'll need user authentication, product catalog, and payment processing",
"ai": "Those are the core features. For auth, I'd suggest JWT tokens. For payments, Stripe is a solid choice.",
},
]

for conv in conversations:
result = record_conversation(
user_input=conv["user"],
ai_response=conv["ai"],
user_id=user_id,
session_id=session_id,
)
print(f" Recorded: {conv['user'][:50]}...")

# Check what was recorded
stats = get_memory_statistics(user_id=user_id)
print(f"\n Stats after Day 1: {stats['statistics']['total_memories']} memories")


def simulate_preference_learning():
"""Simulate learning user preferences over time"""

print("\n" + "=" * 80)
print("SCENARIO 2: Learning User Preferences")
print("=" * 80)

user_id = "power_user_456"

preferences = [
{
"user": "I always prefer TypeScript over JavaScript",
"ai": "Noted! I'll suggest TypeScript solutions from now on.",
},
{
"user": "I like to write comprehensive tests for everything",
"ai": "Great practice! I'll make sure to include test examples in my suggestions.",
},
{
"user": "I prefer functional programming patterns when possible",
"ai": "Understood! I'll focus on functional approaches and avoid mutations.",
},
{
"user": "I use VS Code with Vim keybindings",
"ai": "Nice setup! I'll keep that in mind when suggesting editor configurations.",
},
]

for pref in preferences:
result = record_conversation(
user_input=pref["user"],
ai_response=pref["ai"],
user_id=user_id,
)
print(f" Learned: {pref['user']}")

# Search for preferences
print("\n Searching for programming preferences...")
results = search_memories(
query="programming preferences",
user_id=user_id,
category="preference",
limit=10,
)

print(f" Found {results['total_results']} preferences:")
for mem in results.get('results', []):
print(f" - {mem.get('summary', 'N/A')}")


def simulate_multi_session_workflow():
"""Simulate working across multiple sessions"""

print("\n" + "=" * 80)
print("SCENARIO 3: Multi-Session Workflow")
print("=" * 80)

user_id = "researcher_789"

# Session 1: Research on AI
print("\n Session 1: AI Research")
session1_id = "ai_research"
for conv in [
("Tell me about transformer architectures", "Transformers revolutionized NLP..."),
("How do attention mechanisms work?", "Attention allows models to focus on relevant parts..."),
]:
record_conversation(conv[0], conv[1], user_id, session_id=session1_id)
print(f" Recorded: {conv[0][:40]}...")

# Session 2: Research on databases
print("\n Session 2: Database Research")
session2_id = "database_research"
for conv in [
("What are the benefits of PostgreSQL?", "PostgreSQL offers ACID compliance, advanced features..."),
("Explain database indexing", "Indexes speed up queries by creating lookup structures..."),
]:
record_conversation(conv[0], conv[1], user_id, session_id=session2_id)
print(f" Recorded: {conv[0][:40]}...")

# Session 3: Temporary brainstorming
print("\n Session 3: Temporary Brainstorming")
session3_id = "temp_brainstorm"
for conv in [
("Random idea: AI-powered code reviewer", "Interesting! That could help catch bugs..."),
("Another idea: Automated documentation generator", "That would save a lot of time..."),
]:
record_conversation(conv[0], conv[1], user_id, session_id=session3_id)
print(f" Recorded: {conv[0][:40]}...")

# Now clear the temporary session
print("\n Clearing temporary brainstorming session...")
clear_result = clear_session_memories(
session_id=session3_id,
user_id=user_id,
)
print(f" {clear_result.get('message', 'Done')}")

# Check remaining memories
stats = get_memory_statistics(user_id=user_id)
print(f"\n Final stats: {stats['statistics']['total_memories']} memories (temp session cleared)")


def demonstrate_search_filtering():
"""Demonstrate advanced search with filtering"""

print("\n" + "=" * 80)
print("SCENARIO 4: Advanced Search Filtering")
print("=" * 80)

user_id = "data_scientist_101"

# Record various types of information
print("\n Recording diverse information...")

facts = [
"I work with pandas and numpy daily",
"My current dataset has 10 million rows",
"I'm using scikit-learn for machine learning",
]

for fact in facts:
record_conversation(fact, "Got it, I'll remember that.", user_id)

# Search with different filters
print("\n Searching for 'data' with category filter...")
results = search_memories(
query="data science tools",
user_id=user_id,
category="fact",
limit=5,
)
print(f" Found {results['total_results']} fact-type memories")

print("\n Searching for high-importance memories...")
results = search_memories(
query="machine learning",
user_id=user_id,
min_importance=0.7,
limit=5,
)
print(f" Found {results['total_results']} high-importance memories")


def main():
"""Run all advanced workflow examples"""

print("=" * 80)
print("Memori MCP Server - Advanced Workflow Examples")
print("=" * 80)

# Run each scenario
simulate_project_conversation()
simulate_preference_learning()
simulate_multi_session_workflow()
demonstrate_search_filtering()

print("\n" + "=" * 80)
print("All scenarios completed! Check advanced_mcp.db for stored data.")
print("=" * 80)


if __name__ == "__main__":
main()
122 changes: 122 additions & 0 deletions examples/mcp/basic_usage_example.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
#!/usr/bin/env python3
"""
Basic MCP Usage Example

This example demonstrates how to test the Memori MCP server tools directly
without needing a full MCP client like Claude Desktop.

This is useful for:
- Testing the MCP server functionality
- Understanding how the tools work
- Debugging issues
- Development and iteration
"""

import sys
import os

# Add parent directory to path
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))

# Set environment variables
os.environ["MEMORI_DATABASE_URL"] = "sqlite:///test_mcp.db"
os.environ["OPENAI_API_KEY"] = "your-api-key-here"

# Import the MCP server tools
from mcp.memori_mcp_server import (
record_conversation,
search_memories,
get_recent_memories,
get_memory_statistics,
get_conversation_history,
)


def main():
"""Run basic MCP tool examples"""

print("=" * 80)
print("Memori MCP Server - Basic Usage Example")
print("=" * 80)
print()

user_id = "demo_user"

# Example 1: Record a conversation
print("1. Recording a conversation...")
result = record_conversation(
user_input="I'm building a web application with FastAPI and PostgreSQL",
ai_response="That's great! FastAPI is excellent for building high-performance APIs. Would you like help with the database setup?",
user_id=user_id,
)
print(f" Result: {result}")
print()

# Example 2: Record another conversation
print("2. Recording another conversation...")
result = record_conversation(
user_input="Yes, I need help setting up SQLAlchemy models",
ai_response="I can help you with that. Let's start by defining your database models using SQLAlchemy ORM.",
user_id=user_id,
)
print(f" Result: {result}")
print()

# Example 3: Record a preference
print("3. Recording a user preference...")
result = record_conversation(
user_input="I prefer using async/await patterns in Python",
ai_response="Noted! I'll keep that in mind and suggest async patterns when appropriate.",
user_id=user_id,
)
print(f" Result: {result}")
print()

# Example 4: Get memory statistics
print("4. Getting memory statistics...")
stats = get_memory_statistics(user_id=user_id)
print(f" Statistics: {stats}")
print()

# Example 5: Search for memories
print("5. Searching for memories about 'Python'...")
search_results = search_memories(
query="Python programming",
user_id=user_id,
limit=5,
)
print(f" Found {search_results.get('total_results', 0)} results")
for i, memory in enumerate(search_results.get('results', []), 1):
print(f" {i}. {memory.get('summary', 'N/A')} (Category: {memory.get('category', 'N/A')})")
print()

# Example 6: Get recent memories
print("6. Getting recent memories...")
recent = get_recent_memories(
user_id=user_id,
limit=5,
)
print(f" Found {recent.get('total_results', 0)} recent memories")
for i, memory in enumerate(recent.get('memories', []), 1):
print(f" {i}. {memory.get('summary', 'N/A')}")
print()

# Example 7: Get conversation history
print("7. Getting conversation history...")
history = get_conversation_history(
user_id=user_id,
limit=10,
)
print(f" Found {history.get('total_conversations', 0)} conversations")
for i, conv in enumerate(history.get('conversations', []), 1):
print(f" {i}. User: {conv.get('user_input', 'N/A')[:50]}...")
print(f" AI: {conv.get('ai_output', 'N/A')[:50]}...")
print()

print("=" * 80)
print("Example completed! Check test_mcp.db for stored data.")
print("=" * 80)


if __name__ == "__main__":
main()
Loading