mcp-rubber-duck 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +19 -0
- package/.env.desktop.example +145 -0
- package/.env.example +45 -0
- package/.env.pi.example +106 -0
- package/.env.template +165 -0
- package/.eslintrc.json +40 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +65 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +58 -0
- package/.github/ISSUE_TEMPLATE/question.md +67 -0
- package/.github/pull_request_template.md +111 -0
- package/.github/workflows/docker-build.yml +138 -0
- package/.github/workflows/release.yml +182 -0
- package/.github/workflows/security.yml +141 -0
- package/.github/workflows/semantic-release.yml +89 -0
- package/.prettierrc +10 -0
- package/.releaserc.json +66 -0
- package/CHANGELOG.md +95 -0
- package/CONTRIBUTING.md +242 -0
- package/Dockerfile +62 -0
- package/LICENSE +21 -0
- package/README.md +803 -0
- package/audit-ci.json +8 -0
- package/config/claude_desktop.json +14 -0
- package/config/config.example.json +91 -0
- package/dist/config/config.d.ts +51 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +301 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/types.d.ts +356 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +41 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/duck-provider-enhanced.d.ts +29 -0
- package/dist/providers/duck-provider-enhanced.d.ts.map +1 -0
- package/dist/providers/duck-provider-enhanced.js +230 -0
- package/dist/providers/duck-provider-enhanced.js.map +1 -0
- package/dist/providers/enhanced-manager.d.ts +54 -0
- package/dist/providers/enhanced-manager.d.ts.map +1 -0
- package/dist/providers/enhanced-manager.js +217 -0
- package/dist/providers/enhanced-manager.js.map +1 -0
- package/dist/providers/manager.d.ts +28 -0
- package/dist/providers/manager.d.ts.map +1 -0
- package/dist/providers/manager.js +204 -0
- package/dist/providers/manager.js.map +1 -0
- package/dist/providers/provider.d.ts +29 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +179 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/providers/types.d.ts +69 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +501 -0
- package/dist/server.js.map +1 -0
- package/dist/services/approval.d.ts +44 -0
- package/dist/services/approval.d.ts.map +1 -0
- package/dist/services/approval.js +159 -0
- package/dist/services/approval.js.map +1 -0
- package/dist/services/cache.d.ts +21 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +63 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/conversation.d.ts +24 -0
- package/dist/services/conversation.d.ts.map +1 -0
- package/dist/services/conversation.js +108 -0
- package/dist/services/conversation.js.map +1 -0
- package/dist/services/function-bridge.d.ts +41 -0
- package/dist/services/function-bridge.d.ts.map +1 -0
- package/dist/services/function-bridge.js +259 -0
- package/dist/services/function-bridge.js.map +1 -0
- package/dist/services/health.d.ts +17 -0
- package/dist/services/health.d.ts.map +1 -0
- package/dist/services/health.js +77 -0
- package/dist/services/health.js.map +1 -0
- package/dist/services/mcp-client-manager.d.ts +49 -0
- package/dist/services/mcp-client-manager.d.ts.map +1 -0
- package/dist/services/mcp-client-manager.js +279 -0
- package/dist/services/mcp-client-manager.js.map +1 -0
- package/dist/tools/approve-mcp-request.d.ts +9 -0
- package/dist/tools/approve-mcp-request.d.ts.map +1 -0
- package/dist/tools/approve-mcp-request.js +111 -0
- package/dist/tools/approve-mcp-request.js.map +1 -0
- package/dist/tools/ask-duck.d.ts +9 -0
- package/dist/tools/ask-duck.d.ts.map +1 -0
- package/dist/tools/ask-duck.js +43 -0
- package/dist/tools/ask-duck.js.map +1 -0
- package/dist/tools/chat-duck.d.ts +9 -0
- package/dist/tools/chat-duck.d.ts.map +1 -0
- package/dist/tools/chat-duck.js +57 -0
- package/dist/tools/chat-duck.js.map +1 -0
- package/dist/tools/clear-conversations.d.ts +8 -0
- package/dist/tools/clear-conversations.d.ts.map +1 -0
- package/dist/tools/clear-conversations.js +17 -0
- package/dist/tools/clear-conversations.js.map +1 -0
- package/dist/tools/compare-ducks.d.ts +8 -0
- package/dist/tools/compare-ducks.d.ts.map +1 -0
- package/dist/tools/compare-ducks.js +49 -0
- package/dist/tools/compare-ducks.js.map +1 -0
- package/dist/tools/duck-council.d.ts +8 -0
- package/dist/tools/duck-council.d.ts.map +1 -0
- package/dist/tools/duck-council.js +69 -0
- package/dist/tools/duck-council.js.map +1 -0
- package/dist/tools/get-pending-approvals.d.ts +15 -0
- package/dist/tools/get-pending-approvals.d.ts.map +1 -0
- package/dist/tools/get-pending-approvals.js +74 -0
- package/dist/tools/get-pending-approvals.js.map +1 -0
- package/dist/tools/list-ducks.d.ts +9 -0
- package/dist/tools/list-ducks.d.ts.map +1 -0
- package/dist/tools/list-ducks.js +47 -0
- package/dist/tools/list-ducks.js.map +1 -0
- package/dist/tools/list-models.d.ts +8 -0
- package/dist/tools/list-models.d.ts.map +1 -0
- package/dist/tools/list-models.js +72 -0
- package/dist/tools/list-models.js.map +1 -0
- package/dist/tools/mcp-status.d.ts +17 -0
- package/dist/tools/mcp-status.d.ts.map +1 -0
- package/dist/tools/mcp-status.js +100 -0
- package/dist/tools/mcp-status.js.map +1 -0
- package/dist/utils/ascii-art.d.ts +19 -0
- package/dist/utils/ascii-art.d.ts.map +1 -0
- package/dist/utils/ascii-art.js +73 -0
- package/dist/utils/ascii-art.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +86 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/safe-logger.d.ts +23 -0
- package/dist/utils/safe-logger.d.ts.map +1 -0
- package/dist/utils/safe-logger.js +145 -0
- package/dist/utils/safe-logger.js.map +1 -0
- package/docker-compose.yml +161 -0
- package/jest.config.js +26 -0
- package/package.json +65 -0
- package/scripts/build-multiarch.sh +290 -0
- package/scripts/deploy-raspbian.sh +410 -0
- package/scripts/deploy.sh +322 -0
- package/scripts/gh-deploy.sh +343 -0
- package/scripts/setup-docker-raspbian.sh +530 -0
- package/server.json +8 -0
- package/src/config/config.ts +357 -0
- package/src/config/types.ts +89 -0
- package/src/index.ts +114 -0
- package/src/providers/duck-provider-enhanced.ts +294 -0
- package/src/providers/enhanced-manager.ts +290 -0
- package/src/providers/manager.ts +257 -0
- package/src/providers/provider.ts +207 -0
- package/src/providers/types.ts +78 -0
- package/src/server.ts +603 -0
- package/src/services/approval.ts +225 -0
- package/src/services/cache.ts +79 -0
- package/src/services/conversation.ts +146 -0
- package/src/services/function-bridge.ts +329 -0
- package/src/services/health.ts +107 -0
- package/src/services/mcp-client-manager.ts +362 -0
- package/src/tools/approve-mcp-request.ts +126 -0
- package/src/tools/ask-duck.ts +74 -0
- package/src/tools/chat-duck.ts +82 -0
- package/src/tools/clear-conversations.ts +24 -0
- package/src/tools/compare-ducks.ts +67 -0
- package/src/tools/duck-council.ts +88 -0
- package/src/tools/get-pending-approvals.ts +90 -0
- package/src/tools/list-ducks.ts +65 -0
- package/src/tools/list-models.ts +101 -0
- package/src/tools/mcp-status.ts +117 -0
- package/src/utils/ascii-art.ts +85 -0
- package/src/utils/logger.ts +116 -0
- package/src/utils/safe-logger.ts +165 -0
- package/systemd/mcp-rubber-duck-with-ollama.service +55 -0
- package/systemd/mcp-rubber-duck.service +58 -0
- package/test-functionality.js +147 -0
- package/test-mcp-interface.js +221 -0
- package/tests/ascii-art.test.ts +36 -0
- package/tests/config.test.ts +239 -0
- package/tests/conversation.test.ts +308 -0
- package/tests/mcp-bridge.test.ts +291 -0
- package/tests/providers.test.ts +269 -0
- package/tests/tools/clear-conversations.test.ts +163 -0
- package/tsconfig.json +26 -0
package/.dockerignore
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
# MCP Rubber Duck - Desktop/Server Configuration Example
|
|
2
|
+
# Optimized for high-performance systems (macOS, Linux, Windows)
|
|
3
|
+
# Copy this file to .env and add your API keys
|
|
4
|
+
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# BASIC CONFIGURATION
|
|
7
|
+
# =============================================================================
|
|
8
|
+
|
|
9
|
+
# Docker image (multi-platform)
|
|
10
|
+
DOCKER_IMAGE=ghcr.io/nesquikm/mcp-rubber-duck:latest
|
|
11
|
+
|
|
12
|
+
# Default provider and settings
|
|
13
|
+
DEFAULT_PROVIDER=openai
|
|
14
|
+
DEFAULT_TEMPERATURE=0.7
|
|
15
|
+
LOG_LEVEL=info
|
|
16
|
+
|
|
17
|
+
# =============================================================================
|
|
18
|
+
# DESKTOP/SERVER OPTIMIZATIONS
|
|
19
|
+
# =============================================================================
|
|
20
|
+
|
|
21
|
+
# Resource limits for powerful systems
|
|
22
|
+
DOCKER_CPU_LIMIT=4.0
|
|
23
|
+
DOCKER_MEMORY_LIMIT=2G
|
|
24
|
+
DOCKER_MEMORY_RESERVATION=1G
|
|
25
|
+
|
|
26
|
+
# Node.js memory optimization for desktop
|
|
27
|
+
NODE_OPTIONS=--max-old-space-size=1024
|
|
28
|
+
NODE_ENV=production
|
|
29
|
+
|
|
30
|
+
# =============================================================================
|
|
31
|
+
# MCP SERVER CONFIGURATION
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
# Enable MCP server mode
|
|
35
|
+
MCP_SERVER=true
|
|
36
|
+
|
|
37
|
+
# =============================================================================
|
|
38
|
+
# AI PROVIDER API KEYS
|
|
39
|
+
# =============================================================================
|
|
40
|
+
|
|
41
|
+
# OpenAI (required - get from https://platform.openai.com/api-keys)
|
|
42
|
+
OPENAI_API_KEY=sk-your-openai-key-here
|
|
43
|
+
OPENAI_DEFAULT_MODEL=gpt-4o
|
|
44
|
+
|
|
45
|
+
# Google Gemini (optional - get from https://aistudio.google.com/apikey)
|
|
46
|
+
GEMINI_API_KEY=your-gemini-key-here
|
|
47
|
+
GEMINI_DEFAULT_MODEL=gemini-2.5-pro
|
|
48
|
+
|
|
49
|
+
# Groq (optional - fast inference - get from https://console.groq.com/keys)
|
|
50
|
+
GROQ_API_KEY=gsk_your-groq-key-here
|
|
51
|
+
GROQ_DEFAULT_MODEL=llama-3.3-70b-versatile
|
|
52
|
+
|
|
53
|
+
# Together AI (optional - get from https://api.together.xyz/)
|
|
54
|
+
TOGETHER_API_KEY=your-together-key-here
|
|
55
|
+
|
|
56
|
+
# Perplexity AI (optional - get from https://perplexity.ai/)
|
|
57
|
+
PERPLEXITY_API_KEY=your-perplexity-key-here
|
|
58
|
+
|
|
59
|
+
# Anyscale (optional - get from https://app.endpoints.anyscale.com/)
|
|
60
|
+
# ANYSCALE_API_KEY=your-anyscale-key-here
|
|
61
|
+
|
|
62
|
+
# Azure OpenAI (optional)
|
|
63
|
+
# AZURE_OPENAI_API_KEY=your-azure-key-here
|
|
64
|
+
# AZURE_OPENAI_ENDPOINT=your-resource-name.openai.azure.com
|
|
65
|
+
|
|
66
|
+
# =============================================================================
|
|
67
|
+
# LOCAL AI (RECOMMENDED FOR DESKTOP)
|
|
68
|
+
# =============================================================================
|
|
69
|
+
|
|
70
|
+
# Ollama (local AI - enable with --profile with-ollama)
|
|
71
|
+
# Desktop systems can handle larger models
|
|
72
|
+
OLLAMA_BASE_URL=http://ollama:11434/v1
|
|
73
|
+
OLLAMA_DEFAULT_MODEL=llama3.1:8b
|
|
74
|
+
|
|
75
|
+
# Ollama resource limits for desktop
|
|
76
|
+
OLLAMA_CPU_LIMIT=4.0
|
|
77
|
+
OLLAMA_MEMORY_LIMIT=4G
|
|
78
|
+
OLLAMA_MEMORY_RESERVATION=2G
|
|
79
|
+
|
|
80
|
+
# LM Studio (alternative local AI)
|
|
81
|
+
# LMSTUDIO_BASE_URL=http://localhost:1234/v1
|
|
82
|
+
# LMSTUDIO_DEFAULT_MODEL=local-model
|
|
83
|
+
|
|
84
|
+
# =============================================================================
|
|
85
|
+
# CUSTOM PROVIDERS
|
|
86
|
+
# =============================================================================
|
|
87
|
+
|
|
88
|
+
# Example: Custom OpenAI-compatible API
|
|
89
|
+
# CUSTOM_API_KEY=your-custom-key
|
|
90
|
+
# CUSTOM_BASE_URL=https://api.example.com/v1
|
|
91
|
+
# CUSTOM_DEFAULT_MODEL=custom-model
|
|
92
|
+
# CUSTOM_NICKNAME=My Custom Duck
|
|
93
|
+
|
|
94
|
+
# Example: Additional custom provider
|
|
95
|
+
# CUSTOM_MYAPI_API_KEY=your-custom-key
|
|
96
|
+
# CUSTOM_MYAPI_BASE_URL=https://api.example.com/v1
|
|
97
|
+
# CUSTOM_MYAPI_DEFAULT_MODEL=custom-model
|
|
98
|
+
# CUSTOM_MYAPI_NICKNAME=My API Duck
|
|
99
|
+
|
|
100
|
+
# =============================================================================
|
|
101
|
+
# MCP BRIDGE CONFIGURATION (ADVANCED)
|
|
102
|
+
# =============================================================================
|
|
103
|
+
|
|
104
|
+
# Enable MCP Bridge (allows ducks to use external MCP tools)
|
|
105
|
+
MCP_BRIDGE_ENABLED=true
|
|
106
|
+
|
|
107
|
+
# Approval mode: always, trusted, or never
|
|
108
|
+
MCP_APPROVAL_MODE=trusted
|
|
109
|
+
MCP_APPROVAL_TIMEOUT=300
|
|
110
|
+
|
|
111
|
+
# Example: Context7 Documentation Server
|
|
112
|
+
MCP_SERVER_CONTEXT7_TYPE=http
|
|
113
|
+
MCP_SERVER_CONTEXT7_URL=https://mcp.context7.com/mcp
|
|
114
|
+
MCP_SERVER_CONTEXT7_ENABLED=true
|
|
115
|
+
MCP_TRUSTED_TOOLS_CONTEXT7=*
|
|
116
|
+
|
|
117
|
+
# =============================================================================
|
|
118
|
+
# PERFORMANCE TUNING FOR DESKTOP
|
|
119
|
+
# =============================================================================
|
|
120
|
+
|
|
121
|
+
# Cache settings (higher for desktop)
|
|
122
|
+
CACHE_TTL=600
|
|
123
|
+
|
|
124
|
+
# Network settings
|
|
125
|
+
ENABLE_FAILOVER=true
|
|
126
|
+
MAX_RETRIES=3
|
|
127
|
+
REQUEST_TIMEOUT=60000
|
|
128
|
+
|
|
129
|
+
# Monitoring (enable for development/debugging)
|
|
130
|
+
ENABLE_PERFORMANCE_MONITORING=true
|
|
131
|
+
ENABLE_REQUEST_LOGGING=false
|
|
132
|
+
ENABLE_MEMORY_REPORTING=true
|
|
133
|
+
|
|
134
|
+
# =============================================================================
|
|
135
|
+
# DEVELOPMENT SETTINGS
|
|
136
|
+
# =============================================================================
|
|
137
|
+
|
|
138
|
+
# Enable debug mode for development
|
|
139
|
+
# LOG_LEVEL=debug
|
|
140
|
+
|
|
141
|
+
# Duck nicknames (optional fun customization)
|
|
142
|
+
# OPENAI_NICKNAME=DUCK-4
|
|
143
|
+
# GEMINI_NICKNAME=Duckmini
|
|
144
|
+
# GROQ_NICKNAME=Quackers
|
|
145
|
+
# OLLAMA_NICKNAME=Local Quacker
|
package/.env.example
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# OpenAI Provider
|
|
2
|
+
OPENAI_API_KEY=sk-...
|
|
3
|
+
|
|
4
|
+
# Google Gemini Provider
|
|
5
|
+
GEMINI_API_KEY=...
|
|
6
|
+
|
|
7
|
+
# Groq Provider
|
|
8
|
+
GROQ_API_KEY=gsk_...
|
|
9
|
+
|
|
10
|
+
# Together AI Provider
|
|
11
|
+
TOGETHER_API_KEY=...
|
|
12
|
+
|
|
13
|
+
# Perplexity Provider
|
|
14
|
+
PERPLEXITY_API_KEY=pplx-...
|
|
15
|
+
|
|
16
|
+
# Custom Providers (you can add multiple)
|
|
17
|
+
# Format: CUSTOM_{NAME}_* where NAME becomes the provider key (lowercase)
|
|
18
|
+
# Required: API_KEY and BASE_URL. Optional: MODELS, DEFAULT_MODEL, NICKNAME
|
|
19
|
+
|
|
20
|
+
# Example 1: Custom provider "MYAPI" (becomes provider key "myapi")
|
|
21
|
+
# CUSTOM_MYAPI_API_KEY=sk-...
|
|
22
|
+
# CUSTOM_MYAPI_BASE_URL=https://my-api.com/v1
|
|
23
|
+
# CUSTOM_MYAPI_MODELS=model1,model2,model3
|
|
24
|
+
# CUSTOM_MYAPI_DEFAULT_MODEL=model1
|
|
25
|
+
# CUSTOM_MYAPI_NICKNAME=My API Duck
|
|
26
|
+
|
|
27
|
+
# Example 2: Custom provider "AZURE" (becomes provider key "azure")
|
|
28
|
+
# CUSTOM_AZURE_API_KEY=...
|
|
29
|
+
# CUSTOM_AZURE_BASE_URL=https://myazure.openai.azure.com/v1
|
|
30
|
+
# CUSTOM_AZURE_NICKNAME=Azure Duck
|
|
31
|
+
|
|
32
|
+
# Optional: Default settings
|
|
33
|
+
DEFAULT_PROVIDER=openai
|
|
34
|
+
DEFAULT_TEMPERATURE=0.7
|
|
35
|
+
|
|
36
|
+
# Optional: Logging
|
|
37
|
+
LOG_LEVEL=info
|
|
38
|
+
|
|
39
|
+
# Optional: Custom Duck Nicknames (Have fun with these!)
|
|
40
|
+
# OPENAI_NICKNAME="DUCK-4"
|
|
41
|
+
# GEMINI_NICKNAME="Duckmini"
|
|
42
|
+
# GROQ_NICKNAME="Quackers"
|
|
43
|
+
# TOGETHER_NICKNAME="Speedy Duck"
|
|
44
|
+
# PERPLEXITY_NICKNAME="Search Duck"
|
|
45
|
+
# OLLAMA_NICKNAME="Local Duck"
|
package/.env.pi.example
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# MCP Rubber Duck - Raspberry Pi Configuration Example
|
|
2
|
+
# Optimized for low-memory devices (Pi 3+)
|
|
3
|
+
# Copy this file to .env and add your API keys
|
|
4
|
+
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# BASIC CONFIGURATION
|
|
7
|
+
# =============================================================================
|
|
8
|
+
|
|
9
|
+
# Docker image (multi-platform)
|
|
10
|
+
DOCKER_IMAGE=ghcr.io/nesquikm/mcp-rubber-duck:latest
|
|
11
|
+
|
|
12
|
+
# Default provider and settings
|
|
13
|
+
DEFAULT_PROVIDER=openai
|
|
14
|
+
DEFAULT_TEMPERATURE=0.7
|
|
15
|
+
LOG_LEVEL=info
|
|
16
|
+
|
|
17
|
+
# =============================================================================
|
|
18
|
+
# RASPBERRY PI OPTIMIZATIONS
|
|
19
|
+
# =============================================================================
|
|
20
|
+
|
|
21
|
+
# Resource limits optimized for Pi
|
|
22
|
+
DOCKER_CPU_LIMIT=1.5
|
|
23
|
+
DOCKER_MEMORY_LIMIT=512M
|
|
24
|
+
DOCKER_MEMORY_RESERVATION=256M
|
|
25
|
+
|
|
26
|
+
# Node.js memory optimization for Pi
|
|
27
|
+
NODE_OPTIONS=--max-old-space-size=256
|
|
28
|
+
NODE_ENV=production
|
|
29
|
+
|
|
30
|
+
# =============================================================================
|
|
31
|
+
# MCP SERVER CONFIGURATION
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
# Enable MCP server mode
|
|
35
|
+
MCP_SERVER=true
|
|
36
|
+
|
|
37
|
+
# =============================================================================
|
|
38
|
+
# AI PROVIDER API KEYS
|
|
39
|
+
# =============================================================================
|
|
40
|
+
|
|
41
|
+
# OpenAI (required - get from https://platform.openai.com/api-keys)
|
|
42
|
+
OPENAI_API_KEY=sk-your-openai-key-here
|
|
43
|
+
OPENAI_DEFAULT_MODEL=gpt-4o-mini
|
|
44
|
+
|
|
45
|
+
# Google Gemini (optional - get from https://aistudio.google.com/apikey)
|
|
46
|
+
GEMINI_API_KEY=your-gemini-key-here
|
|
47
|
+
GEMINI_DEFAULT_MODEL=gemini-2.5-flash
|
|
48
|
+
|
|
49
|
+
# Groq (optional - fast inference - get from https://console.groq.com/keys)
|
|
50
|
+
GROQ_API_KEY=gsk_your-groq-key-here
|
|
51
|
+
GROQ_DEFAULT_MODEL=llama-3.3-70b-versatile
|
|
52
|
+
|
|
53
|
+
# Other providers (optional)
|
|
54
|
+
# TOGETHER_API_KEY=your-together-key-here
|
|
55
|
+
# PERPLEXITY_API_KEY=your-perplexity-key-here
|
|
56
|
+
|
|
57
|
+
# =============================================================================
|
|
58
|
+
# LOCAL AI (OPTIONAL)
|
|
59
|
+
# =============================================================================
|
|
60
|
+
|
|
61
|
+
# Ollama (local AI - enable with --profile with-ollama)
|
|
62
|
+
# Warning: Ollama requires significant RAM on Pi
|
|
63
|
+
# OLLAMA_BASE_URL=http://ollama:11434/v1
|
|
64
|
+
# OLLAMA_DEFAULT_MODEL=llama3.2
|
|
65
|
+
|
|
66
|
+
# Ollama resource limits for Pi (if enabled)
|
|
67
|
+
OLLAMA_CPU_LIMIT=2.0
|
|
68
|
+
OLLAMA_MEMORY_LIMIT=1G
|
|
69
|
+
OLLAMA_MEMORY_RESERVATION=512M
|
|
70
|
+
|
|
71
|
+
# =============================================================================
|
|
72
|
+
# CUSTOM PROVIDERS
|
|
73
|
+
# =============================================================================
|
|
74
|
+
|
|
75
|
+
# Example: Custom OpenAI-compatible API
|
|
76
|
+
# CUSTOM_API_KEY=your-custom-key
|
|
77
|
+
# CUSTOM_BASE_URL=https://api.example.com/v1
|
|
78
|
+
# CUSTOM_DEFAULT_MODEL=custom-model
|
|
79
|
+
|
|
80
|
+
# =============================================================================
|
|
81
|
+
# MCP BRIDGE CONFIGURATION (OPTIONAL)
|
|
82
|
+
# =============================================================================
|
|
83
|
+
|
|
84
|
+
# Enable MCP Bridge (allows ducks to use external MCP tools)
|
|
85
|
+
MCP_BRIDGE_ENABLED=false
|
|
86
|
+
|
|
87
|
+
# Approval mode: always, trusted, or never
|
|
88
|
+
MCP_APPROVAL_MODE=trusted
|
|
89
|
+
MCP_APPROVAL_TIMEOUT=300
|
|
90
|
+
|
|
91
|
+
# =============================================================================
|
|
92
|
+
# PERFORMANCE TUNING FOR PI
|
|
93
|
+
# =============================================================================
|
|
94
|
+
|
|
95
|
+
# Cache settings (lower for Pi)
|
|
96
|
+
CACHE_TTL=300
|
|
97
|
+
|
|
98
|
+
# Network settings
|
|
99
|
+
ENABLE_FAILOVER=true
|
|
100
|
+
MAX_RETRIES=3
|
|
101
|
+
REQUEST_TIMEOUT=30000
|
|
102
|
+
|
|
103
|
+
# Monitoring (disable to save resources)
|
|
104
|
+
ENABLE_PERFORMANCE_MONITORING=false
|
|
105
|
+
ENABLE_REQUEST_LOGGING=false
|
|
106
|
+
ENABLE_MEMORY_REPORTING=true
|
package/.env.template
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# MCP Rubber Duck - Universal Configuration Template
|
|
2
|
+
# Copy this file to .env and fill in your API keys
|
|
3
|
+
# For platform-specific examples, see .env.pi.example or .env.desktop.example
|
|
4
|
+
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# BASIC CONFIGURATION
|
|
7
|
+
# =============================================================================
|
|
8
|
+
|
|
9
|
+
# Docker image to use (multi-platform: AMD64, ARM64)
|
|
10
|
+
# Works on: macOS, Linux, Windows, Raspberry Pi 3+
|
|
11
|
+
DOCKER_IMAGE=ghcr.io/nesquikm/mcp-rubber-duck:latest
|
|
12
|
+
|
|
13
|
+
# Default provider to use when none specified
|
|
14
|
+
DEFAULT_PROVIDER=openai
|
|
15
|
+
|
|
16
|
+
# Default temperature for LLM responses (0.0 - 2.0)
|
|
17
|
+
DEFAULT_TEMPERATURE=0.7
|
|
18
|
+
|
|
19
|
+
# Logging level (error, warn, info, debug)
|
|
20
|
+
LOG_LEVEL=info
|
|
21
|
+
|
|
22
|
+
# =============================================================================
|
|
23
|
+
# NODE.JS & SYSTEM OPTIMIZATION
|
|
24
|
+
# =============================================================================
|
|
25
|
+
|
|
26
|
+
# Node.js memory optimization for Raspberry Pi (in MB)
|
|
27
|
+
# Adjust based on your Pi model:
|
|
28
|
+
# - Pi 3 (1GB RAM): --max-old-space-size=256
|
|
29
|
+
# - Pi 4 (2GB RAM): --max-old-space-size=512
|
|
30
|
+
# - Pi 4 (4GB+): --max-old-space-size=1024
|
|
31
|
+
NODE_OPTIONS=--max-old-space-size=256
|
|
32
|
+
|
|
33
|
+
# Node environment
|
|
34
|
+
NODE_ENV=production
|
|
35
|
+
|
|
36
|
+
# =============================================================================
|
|
37
|
+
# MCP SERVER CONFIGURATION
|
|
38
|
+
# =============================================================================
|
|
39
|
+
|
|
40
|
+
# Enable MCP server mode (required for Claude Desktop integration)
|
|
41
|
+
MCP_SERVER=true
|
|
42
|
+
|
|
43
|
+
# =============================================================================
|
|
44
|
+
# AI PROVIDER API KEYS
|
|
45
|
+
# Replace the placeholder values with your actual API keys
|
|
46
|
+
# =============================================================================
|
|
47
|
+
|
|
48
|
+
# OpenAI (https://platform.openai.com/api-keys)
|
|
49
|
+
# Get your API key from: https://platform.openai.com/account/api-keys
|
|
50
|
+
OPENAI_API_KEY=sk-your-openai-key-here
|
|
51
|
+
OPENAI_DEFAULT_MODEL=gpt-4o-mini
|
|
52
|
+
|
|
53
|
+
# Google Gemini (https://aistudio.google.com/apikey)
|
|
54
|
+
# Get your API key from: https://aistudio.google.com/apikey
|
|
55
|
+
GEMINI_API_KEY=your-gemini-key-here
|
|
56
|
+
GEMINI_DEFAULT_MODEL=gemini-2.5-flash
|
|
57
|
+
|
|
58
|
+
# Groq (https://console.groq.com/keys)
|
|
59
|
+
# Get your API key from: https://console.groq.com/keys
|
|
60
|
+
GROQ_API_KEY=gsk_your-groq-key-here
|
|
61
|
+
GROQ_DEFAULT_MODEL=llama-3.3-70b-versatile
|
|
62
|
+
|
|
63
|
+
# Together AI (https://api.together.xyz/)
|
|
64
|
+
# Uncomment and fill if you have a Together AI account
|
|
65
|
+
# TOGETHER_API_KEY=your-together-key-here
|
|
66
|
+
|
|
67
|
+
# Perplexity AI (https://perplexity.ai/)
|
|
68
|
+
# Uncomment and fill if you have a Perplexity account
|
|
69
|
+
# PERPLEXITY_API_KEY=your-perplexity-key-here
|
|
70
|
+
|
|
71
|
+
# Anyscale (https://app.endpoints.anyscale.com/)
|
|
72
|
+
# Uncomment and fill if you have an Anyscale account
|
|
73
|
+
# ANYSCALE_API_KEY=your-anyscale-key-here
|
|
74
|
+
|
|
75
|
+
# Azure OpenAI (https://azure.microsoft.com/en-us/products/cognitive-services/openai-service/)
|
|
76
|
+
# Uncomment and fill if you have Azure OpenAI
|
|
77
|
+
# AZURE_OPENAI_API_KEY=your-azure-key-here
|
|
78
|
+
# AZURE_OPENAI_ENDPOINT=your-resource-name.openai.azure.com
|
|
79
|
+
|
|
80
|
+
# =============================================================================
|
|
81
|
+
# LOCAL AI PROVIDERS (RASPBERRY PI)
|
|
82
|
+
# =============================================================================
|
|
83
|
+
|
|
84
|
+
# Ollama (Local AI on Raspberry Pi)
|
|
85
|
+
# Only enable if you're running Ollama locally or in Docker
|
|
86
|
+
# OLLAMA_BASE_URL=http://localhost:11434/v1
|
|
87
|
+
# OLLAMA_DEFAULT_MODEL=llama3.2
|
|
88
|
+
|
|
89
|
+
# LM Studio (Local AI)
|
|
90
|
+
# Only enable if you're running LM Studio locally
|
|
91
|
+
# LMSTUDIO_BASE_URL=http://localhost:1234/v1
|
|
92
|
+
# LMSTUDIO_DEFAULT_MODEL=local-model
|
|
93
|
+
|
|
94
|
+
# =============================================================================
|
|
95
|
+
# CUSTOM PROVIDERS
|
|
96
|
+
# You can add multiple custom providers using CUSTOM_{NAME}_* format
|
|
97
|
+
# =============================================================================
|
|
98
|
+
|
|
99
|
+
# Example: Custom OpenAI-compatible API
|
|
100
|
+
# CUSTOM_MYAPI_API_KEY=your-custom-key
|
|
101
|
+
# CUSTOM_MYAPI_BASE_URL=https://api.example.com/v1
|
|
102
|
+
# CUSTOM_MYAPI_DEFAULT_MODEL=custom-model
|
|
103
|
+
# CUSTOM_MYAPI_NICKNAME=My Custom Duck
|
|
104
|
+
|
|
105
|
+
# =============================================================================
|
|
106
|
+
# MCP BRIDGE CONFIGURATION (Advanced)
|
|
107
|
+
# Allows ducks to access external MCP servers
|
|
108
|
+
# =============================================================================
|
|
109
|
+
|
|
110
|
+
# Enable MCP Bridge (allows ducks to use external MCP tools)
|
|
111
|
+
MCP_BRIDGE_ENABLED=false
|
|
112
|
+
|
|
113
|
+
# Approval mode for MCP tool usage: always, trusted, or never
|
|
114
|
+
MCP_APPROVAL_MODE=trusted
|
|
115
|
+
|
|
116
|
+
# Timeout for approval requests (seconds)
|
|
117
|
+
MCP_APPROVAL_TIMEOUT=300
|
|
118
|
+
|
|
119
|
+
# Example: Context7 Documentation Server
|
|
120
|
+
# Uncomment to enable Context7 MCP server integration
|
|
121
|
+
# MCP_SERVER_CONTEXT7_TYPE=http
|
|
122
|
+
# MCP_SERVER_CONTEXT7_URL=https://mcp.context7.com/mcp
|
|
123
|
+
# MCP_SERVER_CONTEXT7_ENABLED=true
|
|
124
|
+
# MCP_TRUSTED_TOOLS_CONTEXT7=*
|
|
125
|
+
|
|
126
|
+
# =============================================================================
|
|
127
|
+
# DUCK NICKNAMES (Optional Fun Customization)
|
|
128
|
+
# =============================================================================
|
|
129
|
+
|
|
130
|
+
# Customize your duck names (optional)
|
|
131
|
+
# OPENAI_NICKNAME=DUCK-4
|
|
132
|
+
# GEMINI_NICKNAME=Duckmini
|
|
133
|
+
# GROQ_NICKNAME=Quackers
|
|
134
|
+
# OLLAMA_NICKNAME=Local Quacker
|
|
135
|
+
|
|
136
|
+
# =============================================================================
|
|
137
|
+
# RASPBERRY PI SPECIFIC SETTINGS
|
|
138
|
+
# =============================================================================
|
|
139
|
+
|
|
140
|
+
# Cache TTL for responses (seconds)
|
|
141
|
+
# Lower values use less memory but more API calls
|
|
142
|
+
CACHE_TTL=300
|
|
143
|
+
|
|
144
|
+
# Enable automatic failover to other providers
|
|
145
|
+
ENABLE_FAILOVER=true
|
|
146
|
+
|
|
147
|
+
# Maximum retries for failed API calls
|
|
148
|
+
MAX_RETRIES=3
|
|
149
|
+
|
|
150
|
+
# Request timeout (milliseconds)
|
|
151
|
+
# Increase for slower internet connections
|
|
152
|
+
REQUEST_TIMEOUT=30000
|
|
153
|
+
|
|
154
|
+
# =============================================================================
|
|
155
|
+
# MONITORING & DEBUGGING
|
|
156
|
+
# =============================================================================
|
|
157
|
+
|
|
158
|
+
# Enable performance monitoring
|
|
159
|
+
ENABLE_PERFORMANCE_MONITORING=false
|
|
160
|
+
|
|
161
|
+
# Enable detailed request logging (increases log size)
|
|
162
|
+
ENABLE_REQUEST_LOGGING=false
|
|
163
|
+
|
|
164
|
+
# Enable memory usage reporting
|
|
165
|
+
ENABLE_MEMORY_REPORTING=true
|
package/.eslintrc.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"root": true,
|
|
3
|
+
"parser": "@typescript-eslint/parser",
|
|
4
|
+
"parserOptions": {
|
|
5
|
+
"ecmaVersion": 2022,
|
|
6
|
+
"sourceType": "module",
|
|
7
|
+
"project": "./tsconfig.json"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
"@typescript-eslint"
|
|
11
|
+
],
|
|
12
|
+
"extends": [
|
|
13
|
+
"eslint:recommended",
|
|
14
|
+
"plugin:@typescript-eslint/recommended",
|
|
15
|
+
"plugin:@typescript-eslint/recommended-requiring-type-checking"
|
|
16
|
+
],
|
|
17
|
+
"rules": {
|
|
18
|
+
"@typescript-eslint/no-unused-vars": [
|
|
19
|
+
"error",
|
|
20
|
+
{
|
|
21
|
+
"argsIgnorePattern": "^_",
|
|
22
|
+
"varsIgnorePattern": "^_"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"@typescript-eslint/explicit-function-return-type": "off",
|
|
26
|
+
"@typescript-eslint/explicit-module-boundary-types": "off",
|
|
27
|
+
"no-console": [
|
|
28
|
+
"warn",
|
|
29
|
+
{
|
|
30
|
+
"allow": ["warn", "error"]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"ignorePatterns": [
|
|
35
|
+
"dist/",
|
|
36
|
+
"node_modules/",
|
|
37
|
+
"coverage/",
|
|
38
|
+
"*.config.js"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: 🐛 Bug Report
|
|
3
|
+
about: Found a bug? Help us debug the duck!
|
|
4
|
+
title: 'bug: '
|
|
5
|
+
labels: ['bug', '🐛 needs triage']
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🦆 Duck Debugging Report
|
|
10
|
+
|
|
11
|
+
Thanks for helping us squash bugs! Even rubber ducks need debugging sometimes. 🔧
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
__
|
|
15
|
+
<(o )___
|
|
16
|
+
( ._> / "Quack! Something's not right here..."
|
|
17
|
+
`---'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 🐛 What's Wrong?
|
|
21
|
+
**Describe the bug clearly:**
|
|
22
|
+
<!-- A clear and concise description of what the bug is -->
|
|
23
|
+
|
|
24
|
+
### 🔄 How to Reproduce
|
|
25
|
+
**Steps to make the bug happen:**
|
|
26
|
+
1. Go to '...'
|
|
27
|
+
2. Click on '...'
|
|
28
|
+
3. Enter '...'
|
|
29
|
+
4. See error
|
|
30
|
+
|
|
31
|
+
### 🎯 Expected Behavior
|
|
32
|
+
**What should have happened:**
|
|
33
|
+
<!-- A clear description of what you expected to happen -->
|
|
34
|
+
|
|
35
|
+
### 📷 Screenshots
|
|
36
|
+
**If applicable, add screenshots to help explain your problem:**
|
|
37
|
+
<!-- Drag and drop images here -->
|
|
38
|
+
|
|
39
|
+
### 🌍 Your Duck Pond Environment
|
|
40
|
+
**Please complete the following information:**
|
|
41
|
+
- **OS:** [e.g., macOS 14.0, Ubuntu 22.04, Windows 11]
|
|
42
|
+
- **Node.js version:** [e.g., 20.5.0]
|
|
43
|
+
- **MCP Rubber Duck version:** [e.g., 1.2.0]
|
|
44
|
+
- **Installation method:** [e.g., npm, Docker, source]
|
|
45
|
+
- **LLM providers configured:** [e.g., OpenAI, Gemini, Groq]
|
|
46
|
+
|
|
47
|
+
### 🔍 Error Details
|
|
48
|
+
**Console output or error messages:**
|
|
49
|
+
```
|
|
50
|
+
Paste any error messages or logs here
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 📋 Additional Context
|
|
54
|
+
**Anything else that might help:**
|
|
55
|
+
<!-- Add any other context about the problem here -->
|
|
56
|
+
|
|
57
|
+
### ✅ Checklist
|
|
58
|
+
- [ ] I searched existing issues to make sure this isn't a duplicate
|
|
59
|
+
- [ ] I included all the information requested above
|
|
60
|
+
- [ ] I can reproduce this bug consistently
|
|
61
|
+
- [ ] I'm using a supported version of Node.js (20+)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
*"The best way to debug code is to explain it to a rubber duck. Thanks for explaining this bug to us!" 🦆*
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ✨ Feature Request
|
|
3
|
+
about: Suggest an idea to make our ducks even more awesome!
|
|
4
|
+
title: 'feat: '
|
|
5
|
+
labels: ['enhancement', '✨ feature request']
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🦆 Duck Enhancement Proposal
|
|
10
|
+
|
|
11
|
+
Got an idea that would make our duck pond even better? We're all ears! (Do ducks have ears? 🤔)
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
__
|
|
15
|
+
<(o )___
|
|
16
|
+
( ._> / "Quack! Tell me about your brilliant idea!"
|
|
17
|
+
`---'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 💡 The Problem
|
|
21
|
+
**What problem would this feature solve?**
|
|
22
|
+
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
|
23
|
+
|
|
24
|
+
### 🚀 Proposed Solution
|
|
25
|
+
**What would you like to happen?**
|
|
26
|
+
<!-- A clear and concise description of what you want to happen -->
|
|
27
|
+
|
|
28
|
+
### 🦆 Duck Use Cases
|
|
29
|
+
**How would this make our ducks better?**
|
|
30
|
+
<!-- Describe specific scenarios where this feature would be useful -->
|
|
31
|
+
- **Example 1:** When using the duck council feature, users could...
|
|
32
|
+
- **Example 2:** When configuring providers, it would help to...
|
|
33
|
+
|
|
34
|
+
### 🎯 Alternatives Considered
|
|
35
|
+
**What other solutions did you think about?**
|
|
36
|
+
<!-- A clear and concise description of any alternative solutions or features you've considered -->
|
|
37
|
+
|
|
38
|
+
### 📋 Implementation Ideas
|
|
39
|
+
**Any thoughts on how this could work?** *(optional)*
|
|
40
|
+
<!-- If you have ideas about implementation, share them! No pressure though. -->
|
|
41
|
+
|
|
42
|
+
### 🌟 Additional Context
|
|
43
|
+
**Anything else that would help?**
|
|
44
|
+
<!-- Add any other context, screenshots, mockups, or examples about the feature request here -->
|
|
45
|
+
|
|
46
|
+
### 🔗 Related Issues
|
|
47
|
+
**Are there any related issues or discussions?**
|
|
48
|
+
<!-- Link to any related issues or discussions -->
|
|
49
|
+
|
|
50
|
+
### ✅ Checklist
|
|
51
|
+
- [ ] I searched existing issues to make sure this isn't a duplicate
|
|
52
|
+
- [ ] I described the problem this feature would solve
|
|
53
|
+
- [ ] I explained how this would benefit users
|
|
54
|
+
- [ ] I considered alternative approaches
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
*"Every great feature starts with a great idea. Thanks for sharing yours with our duck pond!" 🦆✨*
|