@ekkos/mcp-server 1.2.3 → 2.0.1
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/README.md +122 -282
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +138 -0
- package/dist/index.js.map +1 -0
- package/package.json +29 -9
- package/CHANGELOG.md +0 -138
- package/PUBLISH.md +0 -127
- package/build/index.d.ts +0 -15
- package/build/index.js +0 -2321
- package/ekkos-mcp-server-1.2.0.tgz +0 -0
- package/index.ts +0 -2499
- package/tsconfig.json +0 -19
package/README.md
CHANGED
|
@@ -1,44 +1,30 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @ekkos/mcp-server
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Stdio-to-SSE bridge for [ekkOS](https://ekkos.dev) Memory substrate. Enables AI tools like Claude Code and Cursor to access your persistent memory via the Model Context Protocol (MCP).
|
|
4
4
|
|
|
5
5
|
## Quick Start
|
|
6
6
|
|
|
7
|
-
###
|
|
7
|
+
### Claude Code
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
npm install -g @ekkos/mcp-server
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
### 2. Get Your API Key
|
|
14
|
-
|
|
15
|
-
1. Visit https://platform.ekkos.dev
|
|
16
|
-
2. Sign in or create an account
|
|
17
|
-
3. Copy your API key from the dashboard
|
|
18
|
-
4. Copy your User ID from your profile
|
|
19
|
-
|
|
20
|
-
### 3. Configure Your IDE
|
|
21
|
-
|
|
22
|
-
**For Cursor:** Add to `~/.cursor/mcp.json`
|
|
23
|
-
|
|
24
|
-
**For Windsurf:** Add to `~/.codeium/windsurf/mcp_config.json`
|
|
9
|
+
Add to `~/.claude/settings.json`:
|
|
25
10
|
|
|
26
11
|
```json
|
|
27
12
|
{
|
|
28
13
|
"mcpServers": {
|
|
29
14
|
"ekkos-memory": {
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"X-User-ID": "your-user-id-here"
|
|
15
|
+
"command": "npx",
|
|
16
|
+
"args": ["-y", "@ekkos/mcp-server"],
|
|
17
|
+
"env": {
|
|
18
|
+
"EKKOS_API_KEY": "your_api_key_here"
|
|
35
19
|
}
|
|
36
20
|
}
|
|
37
21
|
}
|
|
38
22
|
}
|
|
39
23
|
```
|
|
40
24
|
|
|
41
|
-
|
|
25
|
+
### Cursor
|
|
26
|
+
|
|
27
|
+
Add to `.cursor/mcp.json` in your project:
|
|
42
28
|
|
|
43
29
|
```json
|
|
44
30
|
{
|
|
@@ -47,281 +33,135 @@ npm install -g @ekkos/mcp-server
|
|
|
47
33
|
"command": "npx",
|
|
48
34
|
"args": ["-y", "@ekkos/mcp-server"],
|
|
49
35
|
"env": {
|
|
50
|
-
"EKKOS_API_KEY": "
|
|
51
|
-
"EKKOS_USER_ID": "your-user-id-here"
|
|
36
|
+
"EKKOS_API_KEY": "your_api_key_here"
|
|
52
37
|
}
|
|
53
38
|
}
|
|
54
39
|
}
|
|
55
40
|
}
|
|
56
41
|
```
|
|
57
42
|
|
|
58
|
-
###
|
|
59
|
-
|
|
60
|
-
The MCP server will be available in all chat sessions. Your AI can now remember!
|
|
61
|
-
|
|
62
|
-
## How It Works
|
|
63
|
-
|
|
64
|
-
Your AI agent can now access a 10-layer memory system that stores:
|
|
65
|
-
|
|
66
|
-
- **Patterns** - Proven solutions that worked
|
|
67
|
-
- **Conversations** - Past discussions and problem-solving sessions
|
|
68
|
-
- **Directives** - Rules your AI must follow (MUST/NEVER/PREFER/AVOID)
|
|
69
|
-
- **Codebase** - Semantic search across your project
|
|
70
|
-
- **And more** - Episodic memory, procedural workflows, collective knowledge
|
|
71
|
-
|
|
72
|
-
When you ask a question, your AI searches this memory first, finds relevant solutions, and applies them automatically.
|
|
73
|
-
|
|
74
|
-
## Core Tools
|
|
75
|
-
|
|
76
|
-
### `search_memory` 🔍
|
|
77
|
-
|
|
78
|
-
**What it does:** Searches all your memory layers to find relevant patterns, solutions, and past conversations.
|
|
79
|
-
|
|
80
|
-
**When to use:** Your AI calls this automatically before answering technical questions. It's the primary way your AI remembers.
|
|
81
|
-
|
|
82
|
-
**Example:**
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
You: "How did we fix the auth timeout issue?"
|
|
86
|
-
|
|
87
|
-
AI: [Searches memory automatically]
|
|
88
|
-
"Found it! We used the auth-timeout-mitigation pattern
|
|
89
|
-
from last week. Here's the solution..."
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**What you get back:**
|
|
93
|
-
|
|
94
|
-
- Relevant patterns with success rates
|
|
95
|
-
- Past conversations about similar problems
|
|
96
|
-
- Code examples that worked
|
|
97
|
-
- Solutions sorted by how well they worked
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
### `forge_pattern` 🔥
|
|
102
|
-
|
|
103
|
-
**What it does:** Saves a solution that worked as a reusable pattern. Future AI agents (including yourself) will find it automatically.
|
|
104
|
-
|
|
105
|
-
**When to use:** After you solve a problem, fix a bug, or discover a better approach. Your AI should call this automatically, but you can also trigger it.
|
|
106
|
-
|
|
107
|
-
**Example:**
|
|
108
|
-
|
|
109
|
-
```
|
|
110
|
-
AI: [After fixing a bug]
|
|
111
|
-
"I've saved this solution as a pattern. Next time we
|
|
112
|
-
encounter this issue, I'll remember the fix instantly."
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
**What happens:**
|
|
116
|
-
|
|
117
|
-
- Pattern is stored in memory
|
|
118
|
-
- Becomes searchable immediately
|
|
119
|
-
- Success rate tracked over time
|
|
120
|
-
- Automatically suggested for similar problems
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
### `forge_directive` 📜
|
|
125
|
-
|
|
126
|
-
**What it does:** Creates a rule your AI must follow. These are MUST/NEVER/PREFER/AVOID rules that guide behavior.
|
|
127
|
-
|
|
128
|
-
**When to use:** When you want to establish permanent rules for how your AI should behave.
|
|
129
|
-
|
|
130
|
-
**Example:**
|
|
131
|
-
|
|
132
|
-
```
|
|
133
|
-
You: "Always use TypeScript strict mode"
|
|
43
|
+
### Get Your API Key
|
|
134
44
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
**Types of rules:**
|
|
140
|
-
|
|
141
|
-
- **MUST** - Always do this (highest priority)
|
|
142
|
-
- **NEVER** - Never do this (high priority)
|
|
143
|
-
- **PREFER** - Prefer this approach (medium priority)
|
|
144
|
-
- **AVOID** - Try to avoid this (lower priority)
|
|
145
|
-
|
|
146
|
-
**What happens:**
|
|
147
|
-
|
|
148
|
-
- Rule is enforced in all future interactions
|
|
149
|
-
- AI checks against rules before taking actions
|
|
150
|
-
- Rules can be project-specific or global
|
|
151
|
-
|
|
152
|
-
---
|
|
153
|
-
|
|
154
|
-
### `recall_conversation` 💬
|
|
155
|
-
|
|
156
|
-
**What it does:** Finds past conversations about a topic, even from days or weeks ago.
|
|
157
|
-
|
|
158
|
-
**When to use:** When you want to remember what you discussed before, or check if you've already solved a problem.
|
|
159
|
-
|
|
160
|
-
**Example:**
|
|
161
|
-
|
|
162
|
-
```
|
|
163
|
-
You: "What did we decide about the database schema?"
|
|
164
|
-
|
|
165
|
-
AI: [Searches past conversations]
|
|
166
|
-
"We discussed this 2 weeks ago. You decided to use
|
|
167
|
-
PostgreSQL with JSONB for flexible fields..."
|
|
168
|
-
```
|
|
45
|
+
1. Go to [platform.ekkos.dev](https://platform.ekkos.dev)
|
|
46
|
+
2. Sign up or log in
|
|
47
|
+
3. Navigate to **Settings → API Keys**
|
|
48
|
+
4. Click **"Generate New Key"**
|
|
169
49
|
|
|
170
|
-
|
|
50
|
+
## Environment Variables
|
|
171
51
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
52
|
+
| Variable | Required | Description |
|
|
53
|
+
|----------|----------|-------------|
|
|
54
|
+
| `EKKOS_API_KEY` | Yes | Your ekkOS API key from platform.ekkos.dev |
|
|
55
|
+
| `EKKOS_USER_ID` | No | Your user ID (optional, for better tracking) |
|
|
56
|
+
| `EKKOS_MCP_URL` | No | Custom MCP gateway URL (default: https://mcp.ekkos.dev/api/v1/mcp/sse) |
|
|
57
|
+
| `EKKOS_DEBUG` | No | Set to `true` for debug logs |
|
|
176
58
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
### `check_conflict` ⚖️
|
|
180
|
-
|
|
181
|
-
**What it does:** Validates an action against your rules and patterns before executing it. Prevents your AI from doing something that violates your preferences.
|
|
182
|
-
|
|
183
|
-
**When to use:** Before executing destructive operations, deploying changes, or modifying critical configs.
|
|
184
|
-
|
|
185
|
-
**Example:**
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
AI: [Before deleting files]
|
|
189
|
-
"I want to delete /tmp files. Let me check if this
|
|
190
|
-
violates any rules..."
|
|
191
|
-
|
|
192
|
-
[Checks conflicts]
|
|
193
|
-
"⚠️ CONFLICT: This violates NEVER rule: 'Never delete
|
|
194
|
-
files without user confirmation'. I'll ask first."
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**What you get back:**
|
|
198
|
-
|
|
199
|
-
- List of violated rules (if any)
|
|
200
|
-
- Conflicting patterns
|
|
201
|
-
- Recommendations to proceed safely
|
|
202
|
-
- Clear explanation of why it conflicts
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
## How to Use It Day-to-Day
|
|
207
|
-
|
|
208
|
-
### When Starting Work
|
|
209
|
-
|
|
210
|
-
Your AI automatically searches memory when you ask questions. You don't need to do anything special - just ask:
|
|
211
|
-
|
|
212
|
-
```
|
|
213
|
-
You: "Fix the authentication bug"
|
|
214
|
-
AI: [Searches memory] "Found 3 solutions from past work..."
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### When Solving Problems
|
|
218
|
-
|
|
219
|
-
After your AI solves something, it should automatically save it as a pattern:
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
AI: [After fixing bug]
|
|
223
|
-
"Solution saved. Future agents will find this automatically."
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
If it doesn't, you can remind it:
|
|
227
|
-
|
|
228
|
-
```
|
|
229
|
-
You: "Save this solution as a pattern"
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
### When Setting Rules
|
|
233
|
-
|
|
234
|
-
Tell your AI what you want it to always/never do:
|
|
235
|
-
|
|
236
|
-
```
|
|
237
|
-
You: "Never use `any` type in TypeScript"
|
|
238
|
-
AI: [Creates directive] "Rule saved. I'll avoid `any` going forward."
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### When Checking Past Work
|
|
242
|
-
|
|
243
|
-
Ask about past conversations:
|
|
244
|
-
|
|
245
|
-
```
|
|
246
|
-
You: "What did we decide about the API structure?"
|
|
247
|
-
AI: [Searches conversations] "We discussed this last week..."
|
|
248
|
-
```
|
|
249
|
-
|
|
250
|
-
## The Golden Loop
|
|
251
|
-
|
|
252
|
-
ekkOS uses a continuous learning cycle that makes your AI smarter:
|
|
253
|
-
|
|
254
|
-
1. **Retrieve** - `search_memory` finds relevant patterns
|
|
255
|
-
2. **Apply** - AI uses patterns to solve problems
|
|
256
|
-
3. **Measure** - System tracks if solutions worked
|
|
257
|
-
4. **Learn** - `forge_pattern` saves new solutions
|
|
59
|
+
## How It Works
|
|
258
60
|
|
|
259
|
-
This creates a
|
|
61
|
+
This package creates a bridge between:
|
|
62
|
+
- **Stdio transport** (used by AI tools like Claude Code)
|
|
63
|
+
- **SSE transport** (used by ekkOS cloud memory substrate)
|
|
64
|
+
|
|
65
|
+
When your AI tool starts the MCP server, this bridge:
|
|
66
|
+
1. Connects to ekkOS cloud via SSE using your API key
|
|
67
|
+
2. Exposes a stdio interface for your AI tool
|
|
68
|
+
3. Forwards all MCP messages between stdio and SSE
|
|
69
|
+
4. Handles authentication, reconnection, and error handling
|
|
70
|
+
|
|
71
|
+
## 35 MCP Tools
|
|
72
|
+
|
|
73
|
+
Your AI gets access to **35 memory tools** across 8 categories:
|
|
74
|
+
|
|
75
|
+
### Core Memory (7)
|
|
76
|
+
| Tool | Description |
|
|
77
|
+
|------|-------------|
|
|
78
|
+
| `ekkOS_Search` | Search all 11 memory layers for patterns, solutions, and context |
|
|
79
|
+
| `ekkOS_Forge` | Create a new pattern from a learned solution |
|
|
80
|
+
| `ekkOS_Directive` | Create user rules (MUST/NEVER/PREFER/AVOID) |
|
|
81
|
+
| `ekkOS_Context` | Get relevant context for a task (episodes + patterns + plan) |
|
|
82
|
+
| `ekkOS_Capture` | Capture a memory event (code change, chat, command, etc.) |
|
|
83
|
+
| `ekkOS_Codebase` | Search project codebase embeddings |
|
|
84
|
+
| `ekkOS_Recall` | Recall past conversations by time |
|
|
85
|
+
|
|
86
|
+
### Pattern Tracking (4)
|
|
87
|
+
| Tool | Description |
|
|
88
|
+
|------|-------------|
|
|
89
|
+
| `ekkOS_Track` | Track when a memory/pattern is applied |
|
|
90
|
+
| `ekkOS_Outcome` | Record success/failure of applied patterns |
|
|
91
|
+
| `ekkOS_Detect` | Auto-detect which patterns were used in a response |
|
|
92
|
+
| `ekkOS_Reflect` | Analyze a response for improvement opportunities |
|
|
93
|
+
|
|
94
|
+
### Utility (3)
|
|
95
|
+
| Tool | Description |
|
|
96
|
+
|------|-------------|
|
|
97
|
+
| `ekkOS_Stats` | Get statistics for all memory layers |
|
|
98
|
+
| `ekkOS_Summary` | Get human-readable summary of recent ekkOS activity |
|
|
99
|
+
| `ekkOS_Conflict` | Check if proposed action conflicts with directives |
|
|
100
|
+
|
|
101
|
+
### Plan Management (8)
|
|
102
|
+
| Tool | Description |
|
|
103
|
+
|------|-------------|
|
|
104
|
+
| `ekkOS_Plan` | Create a new structured plan (steps for a task) |
|
|
105
|
+
| `ekkOS_Plans` | List agent plans for the current user |
|
|
106
|
+
| `ekkOS_PlanStatus` | Update plan status (draft/in_progress/completed/archived) |
|
|
107
|
+
| `ekkOS_PlanStep` | Mark a plan step as complete or incomplete |
|
|
108
|
+
| `ekkOS_Generate` | Generate a plan using LLM based on context |
|
|
109
|
+
| `ekkOS_SaveTemplate` | Save a plan as a reusable template |
|
|
110
|
+
| `ekkOS_Templates` | List available plan templates |
|
|
111
|
+
| `ekkOS_FromTemplate` | Create a new plan from a template |
|
|
112
|
+
|
|
113
|
+
### Secrets Management (5)
|
|
114
|
+
| Tool | Description |
|
|
115
|
+
|------|-------------|
|
|
116
|
+
| `ekkOS_StoreSecret` | Securely store sensitive data (API keys, passwords, tokens) |
|
|
117
|
+
| `ekkOS_GetSecret` | Retrieve and decrypt a stored secret |
|
|
118
|
+
| `ekkOS_ListSecrets` | List all stored secrets (metadata only, no values) |
|
|
119
|
+
| `ekkOS_DeleteSecret` | Permanently delete a stored secret |
|
|
120
|
+
| `ekkOS_RotateSecret` | Update a secret with a new value |
|
|
121
|
+
|
|
122
|
+
### Schema Awareness (2)
|
|
123
|
+
| Tool | Description |
|
|
124
|
+
|------|-------------|
|
|
125
|
+
| `ekkOS_IndexSchema` | Index database/type schemas for field name awareness |
|
|
126
|
+
| `ekkOS_GetSchema` | Get indexed schema for a specific table/type |
|
|
127
|
+
|
|
128
|
+
### Portability (4)
|
|
129
|
+
| Tool | Description |
|
|
130
|
+
|------|-------------|
|
|
131
|
+
| `ekkOS_Export` | Export all memory data as portable JSON backup |
|
|
132
|
+
| `ekkOS_Import` | Import memory data from backup (auto-deduplication) |
|
|
133
|
+
| `ekkOS_Snapshot` | Create point-in-time memory snapshot |
|
|
134
|
+
| `ekkOS_Sync` | Synchronize local memory with cloud |
|
|
135
|
+
|
|
136
|
+
### Project Setup (2)
|
|
137
|
+
| Tool | Description |
|
|
138
|
+
|------|-------------|
|
|
139
|
+
| `ekkOS_ProjectInit` | Initialize ekkOS for a new project |
|
|
140
|
+
| `ekkOS_Ingest` | Bulk ingest data into memory layers |
|
|
260
141
|
|
|
261
142
|
## Troubleshooting
|
|
262
143
|
|
|
263
|
-
###
|
|
264
|
-
|
|
265
|
-
- Make sure Node.js 18+ is installed
|
|
266
|
-
- Check your API key is correct in the config file
|
|
267
|
-
- Restart your IDE after adding the config
|
|
268
|
-
- Check IDE logs for connection errors
|
|
269
|
-
|
|
270
|
-
### No Patterns Found
|
|
271
|
-
|
|
272
|
-
- You need to forge some patterns first (solve problems and save them)
|
|
273
|
-
- Check your API key has access to your memory
|
|
274
|
-
- Make sure `EKKOS_USER_ID` is set for user-scoped patterns
|
|
144
|
+
### "EKKOS_API_KEY environment variable is required"
|
|
145
|
+
You need to set your API key in the MCP config. Get one at [platform.ekkos.dev](https://platform.ekkos.dev/dashboard/settings/api-keys).
|
|
275
146
|
|
|
276
|
-
###
|
|
147
|
+
### MCP server not loading
|
|
148
|
+
1. Check Node.js version: `node --version` (must be 18+)
|
|
149
|
+
2. Verify config JSON is valid
|
|
150
|
+
3. Try running manually: `EKKOS_API_KEY=xxx npx @ekkos/mcp-server`
|
|
151
|
+
4. Enable debug mode: `EKKOS_DEBUG=true` in env
|
|
277
152
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
153
|
+
### Connection errors
|
|
154
|
+
1. Check your internet connection
|
|
155
|
+
2. Verify API key is correct and active
|
|
156
|
+
3. Check https://ekkos.dev/status for service status
|
|
281
157
|
|
|
282
|
-
##
|
|
158
|
+
## Support
|
|
283
159
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
- **Directives** - Rules your AI follows (MUST/NEVER/PREFER/AVOID)
|
|
289
|
-
- **Codebase** - Semantic search across your project files
|
|
290
|
-
- **Episodic** - Problem-solving sessions and workflows
|
|
291
|
-
- **Procedural** - Step-by-step processes that worked
|
|
292
|
-
- **Collective** - Knowledge shared across AI agents
|
|
293
|
-
- **Code** - Code embeddings for finding similar code
|
|
294
|
-
|
|
295
|
-
All of this is searchable instantly when your AI needs it.
|
|
296
|
-
|
|
297
|
-
## Example Workflow
|
|
298
|
-
|
|
299
|
-
```
|
|
300
|
-
1. You: "Fix the login bug"
|
|
301
|
-
|
|
302
|
-
2. AI: [Calls search_memory("login bug fix")]
|
|
303
|
-
"Found 2 patterns from past work. Applying the
|
|
304
|
-
highest-success solution..."
|
|
305
|
-
|
|
306
|
-
3. AI: [Fixes bug using pattern]
|
|
307
|
-
"Fixed! This solution has worked 8 times before."
|
|
308
|
-
|
|
309
|
-
4. AI: [Calls forge_pattern automatically]
|
|
310
|
-
"Saved this fix as a pattern for next time."
|
|
311
|
-
|
|
312
|
-
5. Next time: AI remembers instantly and applies the fix
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
## Related
|
|
316
|
-
|
|
317
|
-
- **Platform Dashboard**: https://platform.ekkos.dev
|
|
318
|
-
- **Documentation**: https://docs.ekkos.dev
|
|
319
|
-
- **GitHub**: https://github.com/ekkos-ai/ekkos
|
|
160
|
+
- [Documentation](https://docs.ekkos.dev)
|
|
161
|
+
- [Discord Community](https://discord.gg/w2JGepq9qZ)
|
|
162
|
+
- [Report Issues](https://github.com/ekkos-ai/ekkos/issues)
|
|
163
|
+
- [Email Support](mailto:support@ekkos.dev)
|
|
320
164
|
|
|
321
165
|
## License
|
|
322
166
|
|
|
323
|
-
MIT
|
|
324
|
-
|
|
325
|
-
---
|
|
326
|
-
|
|
327
|
-
**ekkOS™** - The memory substrate for AI agents. Making AI smarter, one pattern at a time. 🧠♾️
|
|
167
|
+
MIT License - see [LICENSE](LICENSE) for details
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @ekkos/mcp-server
|
|
4
|
+
*
|
|
5
|
+
* Simple stdio proxy to ekkOS cloud MCP gateway.
|
|
6
|
+
* This creates a local MCP server that forwards all requests to https://mcp.ekkos.dev
|
|
7
|
+
*/
|
|
8
|
+
// Sentry must be imported and initialized before other imports
|
|
9
|
+
import * as Sentry from '@sentry/node';
|
|
10
|
+
// Only initialize Sentry if DSN is provided via env var
|
|
11
|
+
if (process.env.SENTRY_DSN) {
|
|
12
|
+
Sentry.init({
|
|
13
|
+
dsn: process.env.SENTRY_DSN,
|
|
14
|
+
environment: process.env.NODE_ENV || 'production',
|
|
15
|
+
tracesSampleRate: 1.0,
|
|
16
|
+
sendDefaultPii: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
20
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
21
|
+
import { ListToolsRequestSchema, CallToolRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
22
|
+
// Configuration
|
|
23
|
+
const EKKOS_API_KEY = process.env.EKKOS_API_KEY || '';
|
|
24
|
+
const EKKOS_USER_ID = process.env.EKKOS_USER_ID || '';
|
|
25
|
+
const EKKOS_MCP_URL = process.env.EKKOS_MCP_URL || 'https://mcp.ekkos.dev/api/v1/mcp';
|
|
26
|
+
const DEBUG = process.env.EKKOS_DEBUG === 'true';
|
|
27
|
+
if (!EKKOS_API_KEY) {
|
|
28
|
+
console.error('[ekkOS] ERROR: EKKOS_API_KEY environment variable is required');
|
|
29
|
+
console.error('[ekkOS] Get your API key at https://platform.ekkos.dev/dashboard/settings/api-keys');
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
// Simple HTTP client for MCP gateway
|
|
33
|
+
async function callGateway(endpoint, method, params) {
|
|
34
|
+
const url = `${EKKOS_MCP_URL}/${endpoint}`;
|
|
35
|
+
const headers = {
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
'Authorization': `Bearer ${EKKOS_API_KEY}`,
|
|
38
|
+
};
|
|
39
|
+
if (EKKOS_USER_ID) {
|
|
40
|
+
headers['X-User-ID'] = EKKOS_USER_ID;
|
|
41
|
+
}
|
|
42
|
+
if (DEBUG) {
|
|
43
|
+
console.error(`[ekkOS] → ${method} ${endpoint}`);
|
|
44
|
+
}
|
|
45
|
+
const response = await fetch(url, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
headers,
|
|
48
|
+
body: JSON.stringify({ method, params: params || {} }),
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
52
|
+
}
|
|
53
|
+
const data = await response.json();
|
|
54
|
+
if (DEBUG) {
|
|
55
|
+
console.error(`[ekkOS] ← ${method} OK`);
|
|
56
|
+
}
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
// Create MCP server
|
|
60
|
+
const server = new Server({
|
|
61
|
+
name: 'ekkos-memory',
|
|
62
|
+
version: '1.0.0',
|
|
63
|
+
}, {
|
|
64
|
+
capabilities: {
|
|
65
|
+
tools: {},
|
|
66
|
+
resources: {},
|
|
67
|
+
prompts: {},
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
// List tools - proxy to gateway
|
|
71
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
72
|
+
const result = await callGateway('tools/list', 'tools/list');
|
|
73
|
+
return result;
|
|
74
|
+
});
|
|
75
|
+
// Call tool - proxy to gateway
|
|
76
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
77
|
+
const result = await callGateway('tools/call', 'tools/call', {
|
|
78
|
+
name: request.params.name,
|
|
79
|
+
arguments: request.params.arguments,
|
|
80
|
+
});
|
|
81
|
+
return result;
|
|
82
|
+
});
|
|
83
|
+
// List resources - proxy to gateway
|
|
84
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
85
|
+
const result = await callGateway('resources/list', 'resources/list');
|
|
86
|
+
return result;
|
|
87
|
+
});
|
|
88
|
+
// Read resource - proxy to gateway
|
|
89
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
90
|
+
const result = await callGateway('resources/read', 'resources/read', {
|
|
91
|
+
uri: request.params.uri,
|
|
92
|
+
});
|
|
93
|
+
return result;
|
|
94
|
+
});
|
|
95
|
+
// List prompts - proxy to gateway
|
|
96
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
97
|
+
const result = await callGateway('prompts/list', 'prompts/list');
|
|
98
|
+
return result;
|
|
99
|
+
});
|
|
100
|
+
// Get prompt - proxy to gateway
|
|
101
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
102
|
+
const result = await callGateway('prompts/get', 'prompts/get', {
|
|
103
|
+
name: request.params.name,
|
|
104
|
+
arguments: request.params.arguments,
|
|
105
|
+
});
|
|
106
|
+
return result;
|
|
107
|
+
});
|
|
108
|
+
// Error handling
|
|
109
|
+
server.onerror = (error) => {
|
|
110
|
+
console.error('[ekkOS] Server error:', error);
|
|
111
|
+
Sentry.captureException(error);
|
|
112
|
+
};
|
|
113
|
+
process.on('SIGINT', async () => {
|
|
114
|
+
if (DEBUG) {
|
|
115
|
+
console.error('[ekkOS] Shutting down...');
|
|
116
|
+
}
|
|
117
|
+
await server.close();
|
|
118
|
+
process.exit(0);
|
|
119
|
+
});
|
|
120
|
+
// Start server
|
|
121
|
+
async function main() {
|
|
122
|
+
if (DEBUG) {
|
|
123
|
+
console.error('[ekkOS] Starting MCP proxy to ekkOS Memory...');
|
|
124
|
+
console.error(`[ekkOS] Gateway: ${EKKOS_MCP_URL}`);
|
|
125
|
+
console.error(`[ekkOS] User ID: ${EKKOS_USER_ID || '(not set)'}`);
|
|
126
|
+
}
|
|
127
|
+
const transport = new StdioServerTransport();
|
|
128
|
+
await server.connect(transport);
|
|
129
|
+
if (DEBUG) {
|
|
130
|
+
console.error('[ekkOS] ✓ Ready! Your AI can now access ekkOS memory.');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
main().catch((error) => {
|
|
134
|
+
console.error('[ekkOS] Fatal error:', error);
|
|
135
|
+
Sentry.captureException(error);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ekkos/mcp-server",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "ekkOS Memory MCP Server -
|
|
3
|
+
"version": "2.0.1",
|
|
4
|
+
"description": "ekkOS Memory MCP Server - stdio bridge to cloud memory substrate",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
6
7
|
"bin": {
|
|
7
|
-
"ekkos-mcp": "
|
|
8
|
+
"ekkos-mcp-server": "dist/index.js"
|
|
8
9
|
},
|
|
9
10
|
"scripts": {
|
|
10
|
-
"build": "tsc
|
|
11
|
-
"
|
|
12
|
-
"
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"dev": "tsc --watch",
|
|
13
|
+
"prepublishOnly": "npm run build"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"ekkos",
|
|
17
|
+
"mcp",
|
|
18
|
+
"memory",
|
|
19
|
+
"ai",
|
|
20
|
+
"claude",
|
|
21
|
+
"anthropic",
|
|
22
|
+
"model-context-protocol"
|
|
23
|
+
],
|
|
24
|
+
"author": "ekkOS",
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "https://github.com/ekkos-ai/ekkos.git",
|
|
29
|
+
"directory": "packages/ekkos-mcp-server"
|
|
13
30
|
},
|
|
14
31
|
"dependencies": {
|
|
15
|
-
"@modelcontextprotocol/sdk": "^0.
|
|
16
|
-
"node
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
33
|
+
"@sentry/node": "^10.31.0"
|
|
17
34
|
},
|
|
18
35
|
"devDependencies": {
|
|
19
|
-
"@types/node": "^20.11.
|
|
36
|
+
"@types/node": "^20.11.5",
|
|
20
37
|
"typescript": "^5.3.3"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18.0.0"
|
|
21
41
|
}
|
|
22
42
|
}
|