Skip to content
Closed
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
6 changes: 6 additions & 0 deletions .github/workflows/image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ jobs:
- mcp: wait
dockerfile: ./Dockerfile
context: ./
- mcp: think
dockerfile: ./Dockerfile
context: ./
- mcp: memory
dockerfile: ./Dockerfile
context: ./
Expand Down Expand Up @@ -60,6 +63,9 @@ jobs:
- mcp: opencode
dockerfile: ./opencode/Dockerfile
context: ./
- mcp: codemogger
dockerfile: ./codemogger/Dockerfile
context: ./
permissions:
packages: write
contents: read
Expand Down
130 changes: 91 additions & 39 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,44 @@ mcp:
}
```

### 🤖 Codemogger Server

A codemogger MCP server that provides code analysis and indexing capabilities.

**Features:**
- Code search functionality
- Code indexing capabilities
- Reindex functionality
- JSON schema validation for inputs/outputs

**Tools:**
- `codemogger_search` - Search code using codemogger
- `codemogger_index` - Index code using codemogger
- `codemogger_reindex` - Reindex code using codemogger

**Docker Image:**
```bash
docker run ghcr.io/mudler/mcps/codemogger:latest
```

**LocalAI configuration ( to add to the model config):**
```yaml
mcp:
stdio: |
{
"mcpServers": {
"codemogger": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"ghcr.io/mudler/mcps/codemogger:master"
]
}
}
}
```


### 🌤️ Weather Server

A weather information server that provides current weather and forecast data for cities worldwide.
Expand Down Expand Up @@ -101,6 +139,56 @@ mcp:
}
```


### 🧠 Think Server

A no-op tool that forces the model to think about a message. Useful for debugging or forcing explicit reasoning steps in the model.

**Features:**
- Simple message input that gets echoed back
- Forces the model to explicitly process and think about the message
- Input validation (non-empty message)
- JSON schema validation for inputs/outputs

**Tool:**
- `think` - Think about a given message

**Input Format:**
```json
{
"message": "What is the capital of France?"
}
```

**Output Format:**
```json
{
"result": "Thinking about: What is the capital of France?"
}
```

**Docker Image:**
```bash
docker run ghcr.io/mudler/mcps/think:latest
```

**LocalAI configuration (to add to the model config):**
```yaml
mcp:
stdio: |
{
"mcpServers": {
"think": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"ghcr.io/mudler/mcps/think:master"
]
}
}
}
```

### ⏱️ Wait Server

A simple wait/sleep server that allows AI models to autonomously wait for a specified duration. Useful for waiting for asynchronous operations to complete.
Expand Down Expand Up @@ -1471,45 +1559,9 @@ func main() {

Docker images are automatically built and pushed to GitHub Container Registry:

- `ghcr.io/mudler/mcps/duckduckgo:latest` - Latest DuckDuckGo server
- `ghcr.io/mudler/mcps/duckduckgo:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/duckduckgo:master` - Development versions
- `ghcr.io/mudler/mcps/weather:latest` - Latest Weather server
- `ghcr.io/mudler/mcps/weather:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/weather:master` - Development versions
- `ghcr.io/mudler/mcps/wait:latest` - Latest Wait server
- `ghcr.io/mudler/mcps/wait:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/wait:master` - Development versions
- `ghcr.io/mudler/mcps/memory:latest` - Latest Memory server
- `ghcr.io/mudler/mcps/memory:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/memory:master` - Development versions
- `ghcr.io/mudler/mcps/shell:latest` - Latest Shell server
- `ghcr.io/mudler/mcps/shell:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/shell:master` - Development versions
- `ghcr.io/mudler/mcps/ssh:latest` - Latest SSH server
- `ghcr.io/mudler/mcps/ssh:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/ssh:master` - Development versions
- `ghcr.io/mudler/mcps/homeassistant:latest` - Latest Home Assistant server
- `ghcr.io/mudler/mcps/homeassistant:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/homeassistant:master` - Development versions
- `ghcr.io/mudler/mcps/scripts:latest` - Latest Script Runner server
- `ghcr.io/mudler/mcps/scripts:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/scripts:master` - Development versions
- `ghcr.io/mudler/mcps/localrecall:latest` - Latest LocalRecall server
- `ghcr.io/mudler/mcps/localrecall:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/localrecall:master` - Development versions
- `ghcr.io/mudler/mcps/todo:latest` - Latest TODO server
- `ghcr.io/mudler/mcps/todo:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/todo:master` - Development versions
- `ghcr.io/mudler/mcps/mailbox:latest` - Latest Mailbox server
- `ghcr.io/mudler/mcps/mailbox:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/mailbox:master` - Development versions
- `ghcr.io/mudler/mcps/opencode:latest` - Latest Opencode server
- `ghcr.io/mudler/mcps/opencode:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/opencode:master` - Development versions
- `ghcr.io/mudler/mcps/filesystem:latest` - Latest Filesystem server
- `ghcr.io/mudler/mcps/filesystem:v1.0.0` - Tagged versions
- `ghcr.io/mudler/mcps/filesystem:master` - Development versions
- `ghcr.io/mudler/mcps/<component>:latest` - Latest component tagged version
- `ghcr.io/mudler/mcps/<component>:v<version>` - Specific tagged versions
- `ghcr.io/mudler/mcps/<component>:master` - Development versions

## Contributing

Expand Down
3 changes: 3 additions & 0 deletions codemogger/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FROM node:20-slim

ENTRYPOINT ["npx", "-y", "codemogger", "mcp"]
53 changes: 32 additions & 21 deletions localrecall/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,14 @@ var httpClient *http.Client
var localRecallURL string
var apiKey string
var defaultCollectionName string
var debugMode bool

// debugLog prints debug messages only when DEBUG=1 is set
func debugLog(format string, args ...interface{}) {
if debugMode {
log.Printf("[DEBUG] "+format, args...)
}
}

// LocalRecall API response structure
type APIResponse struct {
Expand Down Expand Up @@ -601,6 +609,9 @@ func deleteEntryWithCollection(ctx context.Context, collectionName, entry string
}

func main() {
// Check for debug mode
debugMode = os.Getenv("DEBUG") == "1"

// Get configuration from environment variables
localRecallURL = os.Getenv("LOCALRECALL_URL")
if localRecallURL == "" {
Expand All @@ -621,13 +632,13 @@ func main() {

// Valid tool names
validTools := map[string]bool{
"search": true,
"search": true,
"create_collection": true,
"reset_collection": true,
"add_document": true,
"list_collections": true,
"list_files": true,
"delete_entry": true,
"reset_collection": true,
"add_document": true,
"list_collections": true,
"list_files": true,
"delete_entry": true,
}

if enabledToolsStr != "" {
Expand All @@ -641,7 +652,7 @@ func main() {
if validTools[tool] {
enabledTools[tool] = true
} else {
log.Printf("Warning: Unknown tool name '%s' will be ignored", tool)
debugLog("Warning: Unknown tool name '%s' will be ignored", tool)
}
}
} else {
Expand All @@ -665,13 +676,13 @@ func main() {
Name: "search",
Description: desc,
}, SearchWithoutCollection)
log.Printf("Tool 'search' enabled (using default collection: %s)", defaultCollectionName)
debugLog("Tool 'search' enabled (using default collection: %s)", defaultCollectionName)
} else {
mcp.AddTool(server, &mcp.Tool{
Name: "search",
Description: "Search content in a LocalRecall collection",
}, Search)
log.Println("Tool 'search' enabled")
debugLog("Tool 'search' enabled")
}
}

Expand All @@ -680,15 +691,15 @@ func main() {
Name: "create_collection",
Description: "Create a new collection in LocalRecall",
}, CreateCollection)
log.Println("Tool 'create_collection' enabled")
debugLog("Tool 'create_collection' enabled")
}

if enabledTools["reset_collection"] {
mcp.AddTool(server, &mcp.Tool{
Name: "reset_collection",
Description: "Reset (clear) a collection in LocalRecall",
}, ResetCollection)
log.Println("Tool 'reset_collection' enabled")
debugLog("Tool 'reset_collection' enabled")
}

if enabledTools["add_document"] {
Expand All @@ -698,13 +709,13 @@ func main() {
Name: "add_document",
Description: desc,
}, AddDocumentWithoutCollection)
log.Printf("Tool 'add_document' enabled (using default collection: %s)", defaultCollectionName)
debugLog("Tool 'add_document' enabled (using default collection: %s)", defaultCollectionName)
} else {
mcp.AddTool(server, &mcp.Tool{
Name: "add_document",
Description: "Add a document to a LocalRecall collection",
}, AddDocument)
log.Println("Tool 'add_document' enabled")
debugLog("Tool 'add_document' enabled")
}
}

Expand All @@ -713,7 +724,7 @@ func main() {
Name: "list_collections",
Description: "List all collections in LocalRecall",
}, ListCollections)
log.Println("Tool 'list_collections' enabled")
debugLog("Tool 'list_collections' enabled")
}

if enabledTools["list_files"] {
Expand All @@ -723,13 +734,13 @@ func main() {
Name: "list_files",
Description: desc,
}, ListFilesWithoutCollection)
log.Printf("Tool 'list_files' enabled (using default collection: %s)", defaultCollectionName)
debugLog("Tool 'list_files' enabled (using default collection: %s)", defaultCollectionName)
} else {
mcp.AddTool(server, &mcp.Tool{
Name: "list_files",
Description: "List files in a LocalRecall collection",
}, ListFiles)
log.Println("Tool 'list_files' enabled")
debugLog("Tool 'list_files' enabled")
}
}

Expand All @@ -740,21 +751,21 @@ func main() {
Name: "delete_entry",
Description: desc,
}, DeleteEntryWithoutCollection)
log.Printf("Tool 'delete_entry' enabled (using default collection: %s)", defaultCollectionName)
debugLog("Tool 'delete_entry' enabled (using default collection: %s)", defaultCollectionName)
} else {
mcp.AddTool(server, &mcp.Tool{
Name: "delete_entry",
Description: "Delete an entry from a LocalRecall collection",
}, DeleteEntry)
log.Println("Tool 'delete_entry' enabled")
debugLog("Tool 'delete_entry' enabled")
}
}

log.Printf("LocalRecall MCP server initialized. URL: %s", localRecallURL)
debugLog("LocalRecall MCP server initialized. URL: %s", localRecallURL)
if len(enabledTools) == 0 {
log.Println("Warning: No tools enabled!")
debugLog("Warning: No tools enabled!")
} else {
log.Printf("Enabled %d tool(s)", len(enabledTools))
debugLog("Enabled %d tool(s)", len(enabledTools))
}

// Run the server
Expand Down
6 changes: 2 additions & 4 deletions shell/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,15 @@ COPY shell/ ./shell/
# Build the binary
RUN CGO_ENABLED=0 GOOS=linux go build -o shell-mcp-server ./shell/

# Final stage - use Debian instead of Alpine for glibc compatibility
FROM debian:bookworm-slim

FROM ubuntu
# Install required runtime dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl \
bash \
wget \
git jq \
openssh-client \
openssh-client gnupg2 \
&& rm -rf /var/lib/apt/lists/*

# Install GitHub CLI
Expand Down
Loading
Loading