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
8 changes: 7 additions & 1 deletion mcp/zep-mcp-server/.env.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Zep MCP Server Configuration
# Copy this file to .env and fill in your values
# Copy this file to .env and fill in your values.
# docker compose reads this file via docker-compose.yml:env_file.
# docker run can use it via --env-file .env.

# Required: Your Zep Cloud API key
# Get your API key from https://app.getzep.com
Expand All @@ -8,3 +10,7 @@ ZEP_API_KEY=
# Optional: Logging level (debug, info, warn, error)
# Default: info
LOG_LEVEL=info

# Optional: Host port published by docker compose
# Default: 8081
ZEP_MCP_HOST_PORT=8081
45 changes: 7 additions & 38 deletions mcp/zep-mcp-server/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,55 +1,24 @@
# Multi-stage Dockerfile for Zep MCP Server
# Stage 1: Build
FROM golang:1.23.0-alpine3.19 AS builder
FROM golang:1.23-alpine AS builder

# Install build dependencies
RUN apk add --no-cache git ca-certificates tzdata
WORKDIR /src

WORKDIR /build

# Copy go mod files first for better caching
COPY go.mod go.sum ./
RUN go mod download

# Copy source code
COPY . .

# Build static binary
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
-ldflags="-s -w -X main.Version=${VERSION:-0.1.0}" \
-o zep-mcp-server \
-trimpath \
-ldflags="-s -w" \
-o /out/zep-mcp-server \
./cmd/server

# Stage 2: Runtime
FROM alpine:3.19

# Install runtime dependencies
RUN apk add --no-cache ca-certificates curl

# Create non-root user
RUN addgroup -g 1001 -S zep && \
adduser -u 1001 -S zep -G zep
FROM gcr.io/distroless/static-debian12:nonroot

WORKDIR /app

# Copy binary from builder
COPY --from=builder /build/zep-mcp-server .

# Copy timezone data
COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo

# Set ownership
RUN chown -R zep:zep /app

# Switch to non-root user
USER zep

# Health check for HTTP mode (port 8080)
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
COPY --from=builder /out/zep-mcp-server /app/zep-mcp-server

# Expose HTTP port
EXPOSE 8080

# Run the server (default to HTTP mode)
ENTRYPOINT ["/app/zep-mcp-server"]
28 changes: 14 additions & 14 deletions mcp/zep-mcp-server/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ help:
@echo ""
@echo "Docker targets:"
@echo " make docker-build - Build Docker image"
@echo " make docker-run - Run server with docker-compose"
@echo " make docker-down - Stop docker-compose"
@echo " make docker-run - Run server with docker compose"
@echo " make docker-down - Stop docker compose"
@echo " make docker-clean - Remove Docker images and containers"
@echo ""

Expand Down Expand Up @@ -137,30 +137,30 @@ docker-build:
docker build -t $(DOCKER_IMAGE):$(DOCKER_TAG) .
@echo "✓ Docker image built: $(DOCKER_IMAGE):$(DOCKER_TAG)"

## docker-run: Run server with docker-compose
## docker-run: Run server with docker compose
docker-run:
@echo "Starting server with docker-compose..."
docker-compose up
@echo "Starting server with docker compose..."
docker compose up

## docker-run-detached: Run server with docker-compose in background
## docker-run-detached: Run server with docker compose in background
docker-run-detached:
@echo "Starting server with docker-compose (detached)..."
docker-compose up -d
@echo "Starting server with docker compose (detached)..."
docker compose up -d
@echo "✓ Server started in background"

## docker-down: Stop docker-compose
## docker-down: Stop docker compose
docker-down:
@echo "Stopping docker-compose..."
docker-compose down
@echo "Stopping docker compose..."
docker compose down
@echo "✓ Stopped"

## docker-logs: View docker-compose logs
## docker-logs: View docker compose logs
docker-logs:
docker-compose logs -f
docker compose logs -f

## docker-clean: Remove Docker images and containers
docker-clean:
@echo "Cleaning Docker resources..."
@docker-compose down -v 2>/dev/null || true
@docker compose down -v 2>/dev/null || true
@docker rmi $(DOCKER_IMAGE):$(DOCKER_TAG) 2>/dev/null || true
@echo "✓ Docker resources cleaned"
55 changes: 37 additions & 18 deletions mcp/zep-mcp-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,38 @@ A Model Context Protocol (MCP) server for [Zep Cloud](https://www.getzep.com/),

## Features

- **🔍 Search & Retrieval**: Search the knowledge graph, retrieve context, and access conversation history
- **🔍 Search & Retrieval**: Search the knowledge graph, detect structural patterns, retrieve context, and access conversation history
- **📊 Graph Exploration**: Query nodes, edges, and episodes from the temporal knowledge graph
- **🔒 Read-Only**: Safe, non-destructive operations for AI assistants
- **⚡ Fast**: Built with Go for optimal performance
- **🎯 MCP-Compatible**: Works with Claude Desktop, Cline, and other MCP clients

## Tools

The server provides 13 read-only tools:
The server provides 14 read-only tools:

### Core Search & Retrieval

1. **`search_graph`** - Search the knowledge graph with filters, reranking, and scoped search
2. **`get_user_context`** - Retrieve formatted context for a thread (supports custom templates)
3. **`get_user`** - Get user information and metadata
4. **`list_threads`** - List conversation threads for a user
2. **`detect_patterns`** - Detect recurring structural patterns in a user or named graph
3. **`get_user_context`** - Retrieve formatted context for a thread (supports custom templates)
4. **`get_user`** - Get user information and metadata
5. **`list_threads`** - List conversation threads for a user

### Graph Query

5. **`get_user_nodes`** - Retrieve entity nodes from a user's knowledge graph
6. **`get_user_edges`** - Retrieve relationship edges from a user's knowledge graph
7. **`get_episodes`** - Get episode nodes (temporal data ingestion events)
6. **`get_user_nodes`** - Retrieve entity nodes from a user's knowledge graph
7. **`get_user_edges`** - Retrieve relationship edges from a user's knowledge graph
8. **`get_episodes`** - Get episode nodes (temporal data ingestion events)

### Detail Retrieval

8. **`get_thread_messages`** - Retrieve messages from a conversation thread
9. **`get_node`** - Get a specific node by UUID
10. **`get_edge`** - Get a specific edge by UUID
11. **`get_episode`** - Get a specific episode by UUID
12. **`get_node_edges`** - Get all edges connected to a specific node
13. **`get_episode_mentions`** - Get nodes and edges mentioned in an episode
9. **`get_thread_messages`** - Retrieve messages from a conversation thread
10. **`get_node`** - Get a specific node by UUID
11. **`get_edge`** - Get a specific edge by UUID
12. **`get_episode`** - Get a specific episode by UUID
13. **`get_node_edges`** - Get all edges connected to a specific node
14. **`get_episode_mentions`** - Get nodes and edges mentioned in an episode

## Installation

Expand Down Expand Up @@ -121,14 +122,17 @@ See [Docker Deployment Guide](docs/DOCKER.md) for full Docker documentation.
# Build the image
make docker-build

# Run with docker-compose
# Run with docker compose (loads .env)
make docker-run
```

Or manually:
```bash
cp .env.example .env
# Optional: change ZEP_MCP_HOST_PORT in .env if you do not want the default 8081
docker build -t zep-mcp-server:latest .
docker run -e ZEP_API_KEY=your-key -p 8080:8080 zep-mcp-server:latest
# If you changed ZEP_MCP_HOST_PORT, use the same host port here
docker run --env-file .env -p 8081:8080 zep-mcp-server:latest
```

### MCP Client Configuration
Expand Down Expand Up @@ -193,10 +197,11 @@ Claude Code uses HTTP transport to connect to MCP servers. Configure it using th
**Using Docker:**
```bash
# Edit .env file with your ZEP_API_KEY
docker-compose up -d
# Optional: set ZEP_MCP_HOST_PORT if you do not want the default 8081
docker compose up -d

# Add to Claude Code
claude mcp add --transport http zep http://localhost:8080
claude mcp add --transport http zep http://localhost:8081
```

The HTTP transport supports both stateless JSON requests and streaming responses, allowing Claude Code and other HTTP-based MCP clients to interact with the Zep knowledge graph.
Expand All @@ -215,6 +220,20 @@ tools.search_graph({
})
```

### Detect Graph Patterns

```javascript
// Detect recurring graph patterns around decision nodes
tools.detect_patterns({
user_id: "user_123",
seeds: {
node_labels: ["Decision"]
},
recency_weight: "30_days",
include_examples: true
})
```

### Get Thread Context

```javascript
Expand Down
50 changes: 4 additions & 46 deletions mcp/zep-mcp-server/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,51 +1,9 @@
version: '3.8'

services:
zep-mcp-server:
build:
context: .
dockerfile: Dockerfile
build: .
image: zep-mcp-server:latest
container_name: zep-mcp-server
restart: unless-stopped

environment:
# Zep API Configuration
- ZEP_API_KEY=${ZEP_API_KEY}
# Optional: Override default log level
- LOG_LEVEL=${LOG_LEVEL:-info}

env_file:
- .env
ports:
- "8080:8080"

# Health check
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/"]
interval: 30s
timeout: 3s
retries: 3
start_period: 5s

# Resource limits
deploy:
resources:
limits:
cpus: '1'
memory: 128M
reservations:
cpus: '0.5'
memory: 64M

# Security
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp

# Logging
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
- "${ZEP_MCP_HOST_PORT:-8081}:8080"
Loading