claude-brain 0.15.2 → 0.16.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/README.md +191 -191
- package/VERSION +1 -1
- package/assets/CLAUDE-unified.md +11 -11
- package/assets/CLAUDE.md +29 -11
- package/bunfig.toml +8 -8
- package/package.json +82 -82
- package/packs/backend/node.json +173 -173
- package/packs/core/javascript.json +176 -176
- package/packs/core/typescript.json +222 -222
- package/packs/frontend/react.json +254 -254
- package/packs/meta/testing.json +172 -172
- package/scripts/postinstall.mjs +341 -341
- package/src/automation/auto-context.ts +240 -240
- package/src/automation/decision-detector.ts +452 -452
- package/src/automation/index.ts +11 -11
- package/src/automation/phase12-manager.ts +456 -456
- package/src/automation/proactive-recall.ts +373 -373
- package/src/automation/project-detector.ts +310 -310
- package/src/automation/repo-scanner.ts +205 -205
- package/src/cli/auto-setup.ts +82 -82
- package/src/cli/bin.ts +209 -202
- package/src/cli/commands/chroma.ts +573 -573
- package/src/cli/commands/git-hook.ts +189 -189
- package/src/cli/commands/hooks.ts +213 -213
- package/src/cli/commands/init.ts +122 -122
- package/src/cli/commands/install-mcp.ts +92 -92
- package/src/cli/commands/pack.ts +197 -197
- package/src/cli/commands/refresh.ts +323 -0
- package/src/cli/commands/serve.ts +167 -173
- package/src/cli/commands/start.ts +42 -42
- package/src/cli/commands/uninstall-mcp.ts +41 -41
- package/src/cli/commands/update.ts +124 -121
- package/src/cli/diagnose.ts +4 -4
- package/src/cli/health-check.ts +4 -4
- package/src/cli/migrate-chroma.ts +106 -106
- package/src/cli/setup.ts +4 -4
- package/src/cli/ui/animations.ts +80 -80
- package/src/cli/ui/components.ts +82 -82
- package/src/cli/ui/index.ts +4 -4
- package/src/cli/ui/logo.ts +36 -36
- package/src/cli/ui/theme.ts +55 -55
- package/src/config/defaults.ts +50 -50
- package/src/config/home.ts +55 -55
- package/src/config/index.ts +7 -7
- package/src/config/loader.ts +166 -166
- package/src/config/migration.ts +76 -76
- package/src/config/schema.ts +360 -360
- package/src/config/validator.ts +184 -184
- package/src/config/watcher.ts +86 -86
- package/src/context/assembler.ts +398 -398
- package/src/context/cache-manager.ts +101 -101
- package/src/context/formatter.ts +84 -84
- package/src/context/hierarchy.ts +85 -85
- package/src/context/index.ts +83 -83
- package/src/context/progress-tracker.ts +174 -174
- package/src/context/standards-manager.ts +287 -287
- package/src/context/types.ts +252 -252
- package/src/context/validator.ts +58 -58
- package/src/diagnostics/index.ts +123 -123
- package/src/health/index.ts +229 -229
- package/src/hooks/brain-hook.ts +128 -112
- package/src/hooks/capture.ts +168 -205
- package/src/hooks/deduplicator.ts +72 -72
- package/src/hooks/git-capture.ts +109 -109
- package/src/hooks/git-hook-installer.ts +207 -207
- package/src/hooks/index.ts +20 -20
- package/src/hooks/installer.ts +194 -194
- package/src/hooks/passive-classifier.ts +404 -723
- package/src/hooks/queue.ts +129 -129
- package/src/hooks/session-tracker.ts +312 -275
- package/src/hooks/types.ts +47 -47
- package/src/index.ts +7 -7
- package/src/intelligence/cross-project/affinity.ts +162 -162
- package/src/intelligence/cross-project/generalizer.ts +283 -283
- package/src/intelligence/cross-project/index.ts +13 -13
- package/src/intelligence/cross-project/transfer.ts +201 -201
- package/src/intelligence/index.ts +24 -24
- package/src/intelligence/optimization/index.ts +10 -10
- package/src/intelligence/optimization/precompute.ts +202 -202
- package/src/intelligence/optimization/semantic-cache.ts +207 -207
- package/src/intelligence/prediction/context-anticipator.ts +198 -198
- package/src/intelligence/prediction/decision-predictor.ts +184 -184
- package/src/intelligence/prediction/index.ts +13 -13
- package/src/intelligence/prediction/recommender.ts +268 -268
- package/src/intelligence/reasoning/chain-retrieval.ts +247 -247
- package/src/intelligence/reasoning/counterfactual.ts +248 -248
- package/src/intelligence/reasoning/index.ts +13 -13
- package/src/intelligence/reasoning/synthesizer.ts +169 -169
- package/src/intelligence/temporal/evolution.ts +197 -197
- package/src/intelligence/temporal/index.ts +16 -16
- package/src/intelligence/temporal/query-processor.ts +190 -190
- package/src/intelligence/temporal/timeline.ts +259 -259
- package/src/intelligence/temporal/trends.ts +263 -263
- package/src/knowledge/entity-extractor.ts +416 -416
- package/src/knowledge/graph/builder.ts +185 -185
- package/src/knowledge/graph/linker.ts +201 -201
- package/src/knowledge/graph/memory-graph.ts +359 -359
- package/src/knowledge/graph/schema.ts +99 -99
- package/src/knowledge/graph/search.ts +168 -168
- package/src/knowledge/relationship-extractor.ts +108 -108
- package/src/memory/chroma/client.ts +174 -174
- package/src/memory/chroma/collection-manager.ts +94 -94
- package/src/memory/chroma/config.ts +57 -57
- package/src/memory/chroma/embeddings.ts +155 -155
- package/src/memory/chroma/index.ts +82 -82
- package/src/memory/chroma/migration.ts +270 -270
- package/src/memory/chroma/schemas.ts +69 -69
- package/src/memory/chroma/search.ts +315 -315
- package/src/memory/chroma/store.ts +741 -741
- package/src/memory/consolidation/archiver.ts +164 -164
- package/src/memory/consolidation/merger.ts +186 -186
- package/src/memory/consolidation/scorer.ts +138 -138
- package/src/memory/context-builder.ts +236 -236
- package/src/memory/database.ts +169 -169
- package/src/memory/embedding-utils.ts +156 -156
- package/src/memory/embeddings.ts +226 -226
- package/src/memory/episodic/detector.ts +108 -108
- package/src/memory/episodic/manager.ts +351 -351
- package/src/memory/episodic/summarizer.ts +179 -179
- package/src/memory/episodic/types.ts +52 -52
- package/src/memory/index.ts +582 -582
- package/src/memory/knowledge-extractor.ts +455 -455
- package/src/memory/learning.ts +378 -378
- package/src/memory/patterns.ts +396 -396
- package/src/memory/schema.ts +88 -88
- package/src/memory/search.ts +309 -309
- package/src/memory/store.ts +787 -787
- package/src/memory/types.ts +121 -121
- package/src/orchestrator/coordinator.ts +272 -272
- package/src/orchestrator/decision-logger.ts +228 -228
- package/src/orchestrator/event-emitter.ts +198 -198
- package/src/orchestrator/event-queue.ts +184 -184
- package/src/orchestrator/handlers/base-handler.ts +70 -70
- package/src/orchestrator/handlers/context-handler.ts +73 -73
- package/src/orchestrator/handlers/decision-handler.ts +204 -204
- package/src/orchestrator/handlers/index.ts +10 -10
- package/src/orchestrator/handlers/status-handler.ts +131 -131
- package/src/orchestrator/handlers/task-handler.ts +171 -171
- package/src/orchestrator/index.ts +275 -275
- package/src/orchestrator/task-parser.ts +284 -284
- package/src/orchestrator/types.ts +98 -98
- package/src/packs/index.ts +9 -9
- package/src/packs/loader.ts +134 -134
- package/src/packs/manager.ts +204 -204
- package/src/packs/ranker.ts +78 -78
- package/src/packs/types.ts +81 -81
- package/src/phase12/index.ts +5 -5
- package/src/retrieval/bm25/index.ts +300 -300
- package/src/retrieval/bm25/tokenizer.ts +184 -184
- package/src/retrieval/feedback/adaptive.ts +223 -223
- package/src/retrieval/feedback/index.ts +16 -16
- package/src/retrieval/feedback/metrics.ts +223 -223
- package/src/retrieval/feedback/store.ts +283 -283
- package/src/retrieval/fusion/index.ts +194 -194
- package/src/retrieval/fusion/rrf.ts +163 -163
- package/src/retrieval/index.ts +12 -12
- package/src/retrieval/pipeline.ts +375 -375
- package/src/retrieval/query/expander.ts +198 -198
- package/src/retrieval/query/index.ts +27 -27
- package/src/retrieval/query/intent-classifier.ts +236 -236
- package/src/retrieval/query/temporal-parser.ts +295 -295
- package/src/retrieval/reranker/index.ts +188 -188
- package/src/retrieval/reranker/model.ts +95 -95
- package/src/retrieval/service.ts +125 -125
- package/src/retrieval/types.ts +162 -162
- package/src/routing/entity-extractor.ts +428 -428
- package/src/routing/intent-classifier.ts +450 -436
- package/src/routing/response-filter.ts +261 -258
- package/src/routing/router.ts +1441 -1322
- package/src/routing/search-engine.ts +515 -475
- package/src/routing/types.ts +94 -94
- package/src/scripts/health-check.ts +118 -118
- package/src/scripts/setup.ts +122 -122
- package/src/server/handlers/call-tool.ts +156 -156
- package/src/server/handlers/index.ts +9 -9
- package/src/server/handlers/list-tools.ts +35 -35
- package/src/server/handlers/tools/analyze-decision-evolution.ts +151 -151
- package/src/server/handlers/tools/auto-remember.ts +200 -200
- package/src/server/handlers/tools/brain.ts +85 -85
- package/src/server/handlers/tools/create-project.ts +135 -135
- package/src/server/handlers/tools/detect-trends.ts +144 -144
- package/src/server/handlers/tools/find-cross-project-patterns.ts +168 -168
- package/src/server/handlers/tools/get-activity-log.ts +194 -194
- package/src/server/handlers/tools/get-code-standards.ts +124 -124
- package/src/server/handlers/tools/get-corrections.ts +154 -154
- package/src/server/handlers/tools/get-decision-timeline.ts +172 -172
- package/src/server/handlers/tools/get-episode.ts +103 -103
- package/src/server/handlers/tools/get-patterns.ts +158 -158
- package/src/server/handlers/tools/get-phase12-status.ts +63 -63
- package/src/server/handlers/tools/get-project-context.ts +75 -75
- package/src/server/handlers/tools/get-recommendations.ts +145 -145
- package/src/server/handlers/tools/index.ts +31 -31
- package/src/server/handlers/tools/init-project.ts +757 -757
- package/src/server/handlers/tools/list-episodes.ts +90 -90
- package/src/server/handlers/tools/list-projects.ts +125 -125
- package/src/server/handlers/tools/rate-memory.ts +101 -101
- package/src/server/handlers/tools/recall-similar.ts +87 -87
- package/src/server/handlers/tools/recognize-pattern.ts +126 -126
- package/src/server/handlers/tools/record-correction.ts +125 -125
- package/src/server/handlers/tools/remember-decision.ts +153 -153
- package/src/server/handlers/tools/schemas.ts +253 -253
- package/src/server/handlers/tools/search-knowledge-graph.ts +102 -102
- package/src/server/handlers/tools/smart-context.ts +146 -146
- package/src/server/handlers/tools/update-progress.ts +131 -131
- package/src/server/handlers/tools/what-if-analysis.ts +135 -135
- package/src/server/http-api.ts +693 -693
- package/src/server/index.ts +40 -40
- package/src/server/mcp-server.ts +283 -283
- package/src/server/providers/index.ts +7 -7
- package/src/server/providers/prompts.ts +327 -327
- package/src/server/providers/resources.ts +622 -622
- package/src/server/services.ts +468 -468
- package/src/server/types.ts +39 -39
- package/src/server/utils/error-handler.ts +155 -155
- package/src/server/utils/index.ts +13 -13
- package/src/server/utils/memory-indicator.ts +83 -83
- package/src/server/utils/request-context.ts +122 -122
- package/src/server/utils/response-formatter.ts +129 -129
- package/src/server/utils/validators.ts +210 -210
- package/src/setup/index.ts +48 -48
- package/src/setup/wizard.ts +461 -461
- package/src/tools/index.ts +24 -24
- package/src/tools/registry.ts +115 -115
- package/src/tools/schemas.test.ts +30 -30
- package/src/tools/schemas.ts +617 -617
- package/src/tools/types.ts +412 -412
- package/src/utils/circuit-breaker.ts +130 -130
- package/src/utils/cleanup.ts +34 -34
- package/src/utils/error-handler.ts +132 -132
- package/src/utils/error-messages.ts +60 -60
- package/src/utils/fallback.ts +45 -45
- package/src/utils/index.ts +54 -54
- package/src/utils/logger-utils.ts +80 -80
- package/src/utils/logger.ts +88 -88
- package/src/utils/phase12-helper.ts +56 -56
- package/src/utils/retry.ts +94 -94
- package/src/utils/timing.ts +47 -47
- package/src/utils/transaction.ts +63 -63
- package/src/vault/frontmatter.ts +264 -264
- package/src/vault/index.ts +318 -318
- package/src/vault/paths.ts +106 -106
- package/src/vault/query.ts +422 -422
- package/src/vault/reader.ts +264 -264
- package/src/vault/templates.ts +186 -186
- package/src/vault/types.ts +73 -73
- package/src/vault/watcher.ts +277 -277
- package/src/vault/writer.ts +413 -413
- package/tsconfig.json +30 -30
- package/src/cli/auto-update.ts +0 -157
package/src/server/index.ts
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Server Module Exports
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export { ClaudeBrainMCPServer } from './mcp-server'
|
|
6
|
-
export type {
|
|
7
|
-
ConnectionState,
|
|
8
|
-
ServerStatus,
|
|
9
|
-
ServerEvents,
|
|
10
|
-
ServerOptions
|
|
11
|
-
} from './types'
|
|
12
|
-
|
|
13
|
-
// Re-export utilities
|
|
14
|
-
export {
|
|
15
|
-
ResponseFormatter,
|
|
16
|
-
ToolValidator,
|
|
17
|
-
ErrorHandler,
|
|
18
|
-
RequestContext,
|
|
19
|
-
Timer,
|
|
20
|
-
createTimer,
|
|
21
|
-
generateShortId,
|
|
22
|
-
type ErrorInfo
|
|
23
|
-
} from './utils'
|
|
24
|
-
|
|
25
|
-
// Re-export handlers
|
|
26
|
-
export { handleListTools, handleCallTool } from './handlers'
|
|
27
|
-
|
|
28
|
-
// Re-export services
|
|
29
|
-
export {
|
|
30
|
-
initializeServices,
|
|
31
|
-
shutdownServices,
|
|
32
|
-
getServices,
|
|
33
|
-
getMemoryService,
|
|
34
|
-
getVaultService,
|
|
35
|
-
isServicesInitialized,
|
|
36
|
-
type Services
|
|
37
|
-
} from './services'
|
|
38
|
-
|
|
39
|
-
// Phase 6.5: Re-export providers
|
|
40
|
-
export { PromptProvider, ResourceProvider } from './providers'
|
|
1
|
+
/**
|
|
2
|
+
* Server Module Exports
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export { ClaudeBrainMCPServer } from './mcp-server'
|
|
6
|
+
export type {
|
|
7
|
+
ConnectionState,
|
|
8
|
+
ServerStatus,
|
|
9
|
+
ServerEvents,
|
|
10
|
+
ServerOptions
|
|
11
|
+
} from './types'
|
|
12
|
+
|
|
13
|
+
// Re-export utilities
|
|
14
|
+
export {
|
|
15
|
+
ResponseFormatter,
|
|
16
|
+
ToolValidator,
|
|
17
|
+
ErrorHandler,
|
|
18
|
+
RequestContext,
|
|
19
|
+
Timer,
|
|
20
|
+
createTimer,
|
|
21
|
+
generateShortId,
|
|
22
|
+
type ErrorInfo
|
|
23
|
+
} from './utils'
|
|
24
|
+
|
|
25
|
+
// Re-export handlers
|
|
26
|
+
export { handleListTools, handleCallTool } from './handlers'
|
|
27
|
+
|
|
28
|
+
// Re-export services
|
|
29
|
+
export {
|
|
30
|
+
initializeServices,
|
|
31
|
+
shutdownServices,
|
|
32
|
+
getServices,
|
|
33
|
+
getMemoryService,
|
|
34
|
+
getVaultService,
|
|
35
|
+
isServicesInitialized,
|
|
36
|
+
type Services
|
|
37
|
+
} from './services'
|
|
38
|
+
|
|
39
|
+
// Phase 6.5: Re-export providers
|
|
40
|
+
export { PromptProvider, ResourceProvider } from './providers'
|
package/src/server/mcp-server.ts
CHANGED
|
@@ -1,283 +1,283 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Claude Brain MCP Server
|
|
3
|
-
* Main MCP server implementation using the Model Context Protocol SDK
|
|
4
|
-
* Phase 6.5: Enhanced with system prompts and resources
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
|
|
8
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
9
|
-
import {
|
|
10
|
-
CallToolRequestSchema,
|
|
11
|
-
ListToolsRequestSchema,
|
|
12
|
-
ListPromptsRequestSchema,
|
|
13
|
-
GetPromptRequestSchema,
|
|
14
|
-
ListResourcesRequestSchema,
|
|
15
|
-
ReadResourceRequestSchema
|
|
16
|
-
} from '@modelcontextprotocol/sdk/types.js'
|
|
17
|
-
import type { Logger } from 'pino'
|
|
18
|
-
import type { Config } from '@/config'
|
|
19
|
-
import type { ConnectionState, ServerStatus, ServerOptions, ServerEvents } from './types'
|
|
20
|
-
import { PromptProvider } from './providers/prompts'
|
|
21
|
-
import { ResourceProvider } from './providers/resources'
|
|
22
|
-
|
|
23
|
-
export class ClaudeBrainMCPServer {
|
|
24
|
-
private server: Server
|
|
25
|
-
private logger: Logger
|
|
26
|
-
private config: Config
|
|
27
|
-
private isRunning: boolean = false
|
|
28
|
-
private connectionState: ConnectionState = 'disconnected'
|
|
29
|
-
private startedAt?: Date
|
|
30
|
-
private requestCount: number = 0
|
|
31
|
-
private events: ServerEvents
|
|
32
|
-
|
|
33
|
-
// Phase 6.5: Prompt and Resource providers
|
|
34
|
-
private promptProvider: PromptProvider
|
|
35
|
-
private resourceProvider: ResourceProvider
|
|
36
|
-
|
|
37
|
-
constructor(config: Config, logger: Logger, options: ServerOptions = {}) {
|
|
38
|
-
this.config = config
|
|
39
|
-
this.logger = logger.child({ component: 'mcp-server' })
|
|
40
|
-
this.events = options.events || {}
|
|
41
|
-
|
|
42
|
-
// Phase 6.5: Initialize providers
|
|
43
|
-
this.promptProvider = new PromptProvider(logger)
|
|
44
|
-
this.resourceProvider = new ResourceProvider(logger)
|
|
45
|
-
|
|
46
|
-
// Initialize MCP Server with metadata and enhanced capabilities
|
|
47
|
-
this.server = new Server(
|
|
48
|
-
{
|
|
49
|
-
name: config.serverName,
|
|
50
|
-
version: config.serverVersion
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
capabilities: {
|
|
54
|
-
tools: {},
|
|
55
|
-
prompts: {}, // Phase 6.5: Enable prompts
|
|
56
|
-
resources: {} // Phase 6.5: Enable resources
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
// Setup request handlers
|
|
62
|
-
this.setupHandlers()
|
|
63
|
-
|
|
64
|
-
// Setup error handling
|
|
65
|
-
this.setupErrorHandling()
|
|
66
|
-
|
|
67
|
-
this.logger.debug('MCP server instance created with Phase 6.5 enhancements')
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Setup MCP request handlers for tools, prompts, and resources
|
|
72
|
-
*/
|
|
73
|
-
private setupHandlers(): void {
|
|
74
|
-
// Handle tools/list request
|
|
75
|
-
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
76
|
-
this.logger.debug('Handling tools/list request')
|
|
77
|
-
|
|
78
|
-
// Import dynamically to avoid circular dependencies
|
|
79
|
-
const { handleListTools } = await import('./handlers/list-tools')
|
|
80
|
-
return await handleListTools()
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
// Handle tools/call request
|
|
84
|
-
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
85
|
-
const toolName = request.params.name
|
|
86
|
-
const args = request.params.arguments || {}
|
|
87
|
-
|
|
88
|
-
this.requestCount++
|
|
89
|
-
const requestId = `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`
|
|
90
|
-
|
|
91
|
-
this.logger.debug({
|
|
92
|
-
tool: toolName,
|
|
93
|
-
args,
|
|
94
|
-
requestId
|
|
95
|
-
}, 'Handling tools/call request')
|
|
96
|
-
|
|
97
|
-
// Emit request event
|
|
98
|
-
this.events.onRequest?.(toolName, requestId)
|
|
99
|
-
|
|
100
|
-
const startTime = Date.now()
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
// Import dynamically to avoid circular dependencies
|
|
104
|
-
const { handleCallTool } = await import('./handlers/call-tool')
|
|
105
|
-
const result = await handleCallTool(toolName, args, this.logger)
|
|
106
|
-
|
|
107
|
-
const duration = Date.now() - startTime
|
|
108
|
-
this.logger.debug({
|
|
109
|
-
tool: toolName,
|
|
110
|
-
requestId,
|
|
111
|
-
durationMs: duration
|
|
112
|
-
}, 'Tool call completed')
|
|
113
|
-
|
|
114
|
-
// Emit response event
|
|
115
|
-
this.events.onResponse?.(toolName, requestId, duration)
|
|
116
|
-
|
|
117
|
-
return result
|
|
118
|
-
} catch (error) {
|
|
119
|
-
const duration = Date.now() - startTime
|
|
120
|
-
this.logger.error({
|
|
121
|
-
tool: toolName,
|
|
122
|
-
requestId,
|
|
123
|
-
durationMs: duration,
|
|
124
|
-
error: error instanceof Error ? error.message : String(error)
|
|
125
|
-
}, 'Tool call failed')
|
|
126
|
-
|
|
127
|
-
throw error
|
|
128
|
-
}
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
// Phase 6.5: Handle prompts/list request
|
|
132
|
-
this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
133
|
-
this.logger.debug('Handling prompts/list request')
|
|
134
|
-
return await this.promptProvider.listPrompts()
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
// Phase 6.5: Handle prompts/get request
|
|
138
|
-
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
139
|
-
this.logger.debug({ name: request.params.name }, 'Handling prompts/get request')
|
|
140
|
-
return await this.promptProvider.getPrompt(request.params.name)
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
// Phase 6.5: Handle resources/list request
|
|
144
|
-
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
145
|
-
this.logger.debug('Handling resources/list request')
|
|
146
|
-
return await this.resourceProvider.listResources()
|
|
147
|
-
})
|
|
148
|
-
|
|
149
|
-
// Phase 6.5: Handle resources/read request
|
|
150
|
-
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
151
|
-
this.logger.debug({ uri: request.params.uri }, 'Handling resources/read request')
|
|
152
|
-
return await this.resourceProvider.readResource(request.params.uri)
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
this.logger.debug('Request handlers configured (tools, prompts, resources)')
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Setup error handling for the server
|
|
160
|
-
*/
|
|
161
|
-
private setupErrorHandling(): void {
|
|
162
|
-
this.server.onerror = (error) => {
|
|
163
|
-
this.logger.error({
|
|
164
|
-
error: error instanceof Error ? {
|
|
165
|
-
message: error.message,
|
|
166
|
-
stack: error.stack,
|
|
167
|
-
name: error.name
|
|
168
|
-
} : error
|
|
169
|
-
}, 'MCP server error')
|
|
170
|
-
|
|
171
|
-
this.events.onError?.(error instanceof Error ? error : new Error(String(error)))
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Update connection state and emit events
|
|
177
|
-
*/
|
|
178
|
-
private setConnectionState(state: ConnectionState): void {
|
|
179
|
-
const previousState = this.connectionState
|
|
180
|
-
this.connectionState = state
|
|
181
|
-
|
|
182
|
-
if (previousState !== state) {
|
|
183
|
-
this.logger.info({
|
|
184
|
-
previousState,
|
|
185
|
-
newState: state
|
|
186
|
-
}, 'Connection state changed')
|
|
187
|
-
|
|
188
|
-
this.events.onConnectionStateChange?.(state)
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Start the MCP server and connect via stdio transport
|
|
194
|
-
*/
|
|
195
|
-
async start(): Promise<void> {
|
|
196
|
-
if (this.isRunning) {
|
|
197
|
-
this.logger.warn('Server already running')
|
|
198
|
-
return
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
try {
|
|
202
|
-
this.logger.info('Starting MCP server...')
|
|
203
|
-
this.setConnectionState('connecting')
|
|
204
|
-
|
|
205
|
-
const transport = new StdioServerTransport()
|
|
206
|
-
await this.server.connect(transport)
|
|
207
|
-
|
|
208
|
-
this.isRunning = true
|
|
209
|
-
this.startedAt = new Date()
|
|
210
|
-
this.setConnectionState('connected')
|
|
211
|
-
|
|
212
|
-
this.logger.info({
|
|
213
|
-
name: this.config.serverName,
|
|
214
|
-
version: this.config.serverVersion,
|
|
215
|
-
startedAt: this.startedAt.toISOString()
|
|
216
|
-
}, 'MCP server started successfully')
|
|
217
|
-
|
|
218
|
-
} catch (error) {
|
|
219
|
-
this.setConnectionState('disconnected')
|
|
220
|
-
this.logger.error({
|
|
221
|
-
error: error instanceof Error ? {
|
|
222
|
-
message: error.message,
|
|
223
|
-
stack: error.stack
|
|
224
|
-
} : error
|
|
225
|
-
}, 'Failed to start MCP server')
|
|
226
|
-
throw error
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Stop the MCP server gracefully
|
|
232
|
-
*/
|
|
233
|
-
async stop(): Promise<void> {
|
|
234
|
-
if (!this.isRunning) {
|
|
235
|
-
this.logger.debug('Server not running, skip stop')
|
|
236
|
-
return
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
try {
|
|
240
|
-
this.logger.info('Stopping MCP server...')
|
|
241
|
-
await this.server.close()
|
|
242
|
-
|
|
243
|
-
this.isRunning = false
|
|
244
|
-
this.setConnectionState('disconnected')
|
|
245
|
-
|
|
246
|
-
this.logger.info({
|
|
247
|
-
totalRequests: this.requestCount,
|
|
248
|
-
uptimeMs: this.startedAt ? Date.now() - this.startedAt.getTime() : 0
|
|
249
|
-
}, 'MCP server stopped')
|
|
250
|
-
|
|
251
|
-
} catch (error) {
|
|
252
|
-
this.logger.error({
|
|
253
|
-
error: error instanceof Error ? {
|
|
254
|
-
message: error.message,
|
|
255
|
-
stack: error.stack
|
|
256
|
-
} : error
|
|
257
|
-
}, 'Error stopping MCP server')
|
|
258
|
-
throw error
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Get current server status
|
|
264
|
-
*/
|
|
265
|
-
getStatus(): ServerStatus {
|
|
266
|
-
return {
|
|
267
|
-
running: this.isRunning,
|
|
268
|
-
name: this.config.serverName,
|
|
269
|
-
version: this.config.serverVersion,
|
|
270
|
-
connectionState: this.connectionState,
|
|
271
|
-
startedAt: this.startedAt,
|
|
272
|
-
requestCount: this.requestCount,
|
|
273
|
-
capabilities: ['tools', 'prompts', 'resources']
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Health check method
|
|
279
|
-
*/
|
|
280
|
-
isHealthy(): boolean {
|
|
281
|
-
return this.isRunning && this.connectionState === 'connected'
|
|
282
|
-
}
|
|
283
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Claude Brain MCP Server
|
|
3
|
+
* Main MCP server implementation using the Model Context Protocol SDK
|
|
4
|
+
* Phase 6.5: Enhanced with system prompts and resources
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
9
|
+
import {
|
|
10
|
+
CallToolRequestSchema,
|
|
11
|
+
ListToolsRequestSchema,
|
|
12
|
+
ListPromptsRequestSchema,
|
|
13
|
+
GetPromptRequestSchema,
|
|
14
|
+
ListResourcesRequestSchema,
|
|
15
|
+
ReadResourceRequestSchema
|
|
16
|
+
} from '@modelcontextprotocol/sdk/types.js'
|
|
17
|
+
import type { Logger } from 'pino'
|
|
18
|
+
import type { Config } from '@/config'
|
|
19
|
+
import type { ConnectionState, ServerStatus, ServerOptions, ServerEvents } from './types'
|
|
20
|
+
import { PromptProvider } from './providers/prompts'
|
|
21
|
+
import { ResourceProvider } from './providers/resources'
|
|
22
|
+
|
|
23
|
+
export class ClaudeBrainMCPServer {
|
|
24
|
+
private server: Server
|
|
25
|
+
private logger: Logger
|
|
26
|
+
private config: Config
|
|
27
|
+
private isRunning: boolean = false
|
|
28
|
+
private connectionState: ConnectionState = 'disconnected'
|
|
29
|
+
private startedAt?: Date
|
|
30
|
+
private requestCount: number = 0
|
|
31
|
+
private events: ServerEvents
|
|
32
|
+
|
|
33
|
+
// Phase 6.5: Prompt and Resource providers
|
|
34
|
+
private promptProvider: PromptProvider
|
|
35
|
+
private resourceProvider: ResourceProvider
|
|
36
|
+
|
|
37
|
+
constructor(config: Config, logger: Logger, options: ServerOptions = {}) {
|
|
38
|
+
this.config = config
|
|
39
|
+
this.logger = logger.child({ component: 'mcp-server' })
|
|
40
|
+
this.events = options.events || {}
|
|
41
|
+
|
|
42
|
+
// Phase 6.5: Initialize providers
|
|
43
|
+
this.promptProvider = new PromptProvider(logger)
|
|
44
|
+
this.resourceProvider = new ResourceProvider(logger)
|
|
45
|
+
|
|
46
|
+
// Initialize MCP Server with metadata and enhanced capabilities
|
|
47
|
+
this.server = new Server(
|
|
48
|
+
{
|
|
49
|
+
name: config.serverName,
|
|
50
|
+
version: config.serverVersion
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
capabilities: {
|
|
54
|
+
tools: {},
|
|
55
|
+
prompts: {}, // Phase 6.5: Enable prompts
|
|
56
|
+
resources: {} // Phase 6.5: Enable resources
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
// Setup request handlers
|
|
62
|
+
this.setupHandlers()
|
|
63
|
+
|
|
64
|
+
// Setup error handling
|
|
65
|
+
this.setupErrorHandling()
|
|
66
|
+
|
|
67
|
+
this.logger.debug('MCP server instance created with Phase 6.5 enhancements')
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Setup MCP request handlers for tools, prompts, and resources
|
|
72
|
+
*/
|
|
73
|
+
private setupHandlers(): void {
|
|
74
|
+
// Handle tools/list request
|
|
75
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
76
|
+
this.logger.debug('Handling tools/list request')
|
|
77
|
+
|
|
78
|
+
// Import dynamically to avoid circular dependencies
|
|
79
|
+
const { handleListTools } = await import('./handlers/list-tools')
|
|
80
|
+
return await handleListTools()
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
// Handle tools/call request
|
|
84
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
85
|
+
const toolName = request.params.name
|
|
86
|
+
const args = request.params.arguments || {}
|
|
87
|
+
|
|
88
|
+
this.requestCount++
|
|
89
|
+
const requestId = `req_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 9)}`
|
|
90
|
+
|
|
91
|
+
this.logger.debug({
|
|
92
|
+
tool: toolName,
|
|
93
|
+
args,
|
|
94
|
+
requestId
|
|
95
|
+
}, 'Handling tools/call request')
|
|
96
|
+
|
|
97
|
+
// Emit request event
|
|
98
|
+
this.events.onRequest?.(toolName, requestId)
|
|
99
|
+
|
|
100
|
+
const startTime = Date.now()
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
// Import dynamically to avoid circular dependencies
|
|
104
|
+
const { handleCallTool } = await import('./handlers/call-tool')
|
|
105
|
+
const result = await handleCallTool(toolName, args, this.logger)
|
|
106
|
+
|
|
107
|
+
const duration = Date.now() - startTime
|
|
108
|
+
this.logger.debug({
|
|
109
|
+
tool: toolName,
|
|
110
|
+
requestId,
|
|
111
|
+
durationMs: duration
|
|
112
|
+
}, 'Tool call completed')
|
|
113
|
+
|
|
114
|
+
// Emit response event
|
|
115
|
+
this.events.onResponse?.(toolName, requestId, duration)
|
|
116
|
+
|
|
117
|
+
return result
|
|
118
|
+
} catch (error) {
|
|
119
|
+
const duration = Date.now() - startTime
|
|
120
|
+
this.logger.error({
|
|
121
|
+
tool: toolName,
|
|
122
|
+
requestId,
|
|
123
|
+
durationMs: duration,
|
|
124
|
+
error: error instanceof Error ? error.message : String(error)
|
|
125
|
+
}, 'Tool call failed')
|
|
126
|
+
|
|
127
|
+
throw error
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// Phase 6.5: Handle prompts/list request
|
|
132
|
+
this.server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
133
|
+
this.logger.debug('Handling prompts/list request')
|
|
134
|
+
return await this.promptProvider.listPrompts()
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
// Phase 6.5: Handle prompts/get request
|
|
138
|
+
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
139
|
+
this.logger.debug({ name: request.params.name }, 'Handling prompts/get request')
|
|
140
|
+
return await this.promptProvider.getPrompt(request.params.name)
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
// Phase 6.5: Handle resources/list request
|
|
144
|
+
this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
145
|
+
this.logger.debug('Handling resources/list request')
|
|
146
|
+
return await this.resourceProvider.listResources()
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// Phase 6.5: Handle resources/read request
|
|
150
|
+
this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
151
|
+
this.logger.debug({ uri: request.params.uri }, 'Handling resources/read request')
|
|
152
|
+
return await this.resourceProvider.readResource(request.params.uri)
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
this.logger.debug('Request handlers configured (tools, prompts, resources)')
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Setup error handling for the server
|
|
160
|
+
*/
|
|
161
|
+
private setupErrorHandling(): void {
|
|
162
|
+
this.server.onerror = (error) => {
|
|
163
|
+
this.logger.error({
|
|
164
|
+
error: error instanceof Error ? {
|
|
165
|
+
message: error.message,
|
|
166
|
+
stack: error.stack,
|
|
167
|
+
name: error.name
|
|
168
|
+
} : error
|
|
169
|
+
}, 'MCP server error')
|
|
170
|
+
|
|
171
|
+
this.events.onError?.(error instanceof Error ? error : new Error(String(error)))
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Update connection state and emit events
|
|
177
|
+
*/
|
|
178
|
+
private setConnectionState(state: ConnectionState): void {
|
|
179
|
+
const previousState = this.connectionState
|
|
180
|
+
this.connectionState = state
|
|
181
|
+
|
|
182
|
+
if (previousState !== state) {
|
|
183
|
+
this.logger.info({
|
|
184
|
+
previousState,
|
|
185
|
+
newState: state
|
|
186
|
+
}, 'Connection state changed')
|
|
187
|
+
|
|
188
|
+
this.events.onConnectionStateChange?.(state)
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Start the MCP server and connect via stdio transport
|
|
194
|
+
*/
|
|
195
|
+
async start(): Promise<void> {
|
|
196
|
+
if (this.isRunning) {
|
|
197
|
+
this.logger.warn('Server already running')
|
|
198
|
+
return
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
try {
|
|
202
|
+
this.logger.info('Starting MCP server...')
|
|
203
|
+
this.setConnectionState('connecting')
|
|
204
|
+
|
|
205
|
+
const transport = new StdioServerTransport()
|
|
206
|
+
await this.server.connect(transport)
|
|
207
|
+
|
|
208
|
+
this.isRunning = true
|
|
209
|
+
this.startedAt = new Date()
|
|
210
|
+
this.setConnectionState('connected')
|
|
211
|
+
|
|
212
|
+
this.logger.info({
|
|
213
|
+
name: this.config.serverName,
|
|
214
|
+
version: this.config.serverVersion,
|
|
215
|
+
startedAt: this.startedAt.toISOString()
|
|
216
|
+
}, 'MCP server started successfully')
|
|
217
|
+
|
|
218
|
+
} catch (error) {
|
|
219
|
+
this.setConnectionState('disconnected')
|
|
220
|
+
this.logger.error({
|
|
221
|
+
error: error instanceof Error ? {
|
|
222
|
+
message: error.message,
|
|
223
|
+
stack: error.stack
|
|
224
|
+
} : error
|
|
225
|
+
}, 'Failed to start MCP server')
|
|
226
|
+
throw error
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Stop the MCP server gracefully
|
|
232
|
+
*/
|
|
233
|
+
async stop(): Promise<void> {
|
|
234
|
+
if (!this.isRunning) {
|
|
235
|
+
this.logger.debug('Server not running, skip stop')
|
|
236
|
+
return
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
try {
|
|
240
|
+
this.logger.info('Stopping MCP server...')
|
|
241
|
+
await this.server.close()
|
|
242
|
+
|
|
243
|
+
this.isRunning = false
|
|
244
|
+
this.setConnectionState('disconnected')
|
|
245
|
+
|
|
246
|
+
this.logger.info({
|
|
247
|
+
totalRequests: this.requestCount,
|
|
248
|
+
uptimeMs: this.startedAt ? Date.now() - this.startedAt.getTime() : 0
|
|
249
|
+
}, 'MCP server stopped')
|
|
250
|
+
|
|
251
|
+
} catch (error) {
|
|
252
|
+
this.logger.error({
|
|
253
|
+
error: error instanceof Error ? {
|
|
254
|
+
message: error.message,
|
|
255
|
+
stack: error.stack
|
|
256
|
+
} : error
|
|
257
|
+
}, 'Error stopping MCP server')
|
|
258
|
+
throw error
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Get current server status
|
|
264
|
+
*/
|
|
265
|
+
getStatus(): ServerStatus {
|
|
266
|
+
return {
|
|
267
|
+
running: this.isRunning,
|
|
268
|
+
name: this.config.serverName,
|
|
269
|
+
version: this.config.serverVersion,
|
|
270
|
+
connectionState: this.connectionState,
|
|
271
|
+
startedAt: this.startedAt,
|
|
272
|
+
requestCount: this.requestCount,
|
|
273
|
+
capabilities: ['tools', 'prompts', 'resources']
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Health check method
|
|
279
|
+
*/
|
|
280
|
+
isHealthy(): boolean {
|
|
281
|
+
return this.isRunning && this.connectionState === 'connected'
|
|
282
|
+
}
|
|
283
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Server Providers Exports
|
|
3
|
-
* Phase 6.5: System prompts and resources
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export { PromptProvider } from './prompts'
|
|
7
|
-
export { ResourceProvider } from './resources'
|
|
1
|
+
/**
|
|
2
|
+
* Server Providers Exports
|
|
3
|
+
* Phase 6.5: System prompts and resources
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { PromptProvider } from './prompts'
|
|
7
|
+
export { ResourceProvider } from './resources'
|