brainy/dist/mcp/brainyMCPAdapter.js
David Snelling f8c45f2d8d Initial commit: Brainy - Multi-Dimensional AI Database
Open source vector database with HNSW indexing, graph relationships,
and metadata facets. Features CLI with professional augmentation registry
integration for discovering extensions and capabilities.
2025-08-18 17:35:06 -07:00

142 lines
No EOL
4.9 KiB
JavaScript

/**
* BrainyMCPAdapter
*
* This class provides an adapter for accessing Brainy data through the Model Control Protocol (MCP).
* It wraps a BrainyData instance and exposes methods for getting vectors, searching similar items,
* and getting relationships.
*/
import { v4 as uuidv4 } from '../universal/uuid.js';
import { MCP_VERSION } from '../types/mcpTypes.js';
export class BrainyMCPAdapter {
/**
* Creates a new BrainyMCPAdapter
* @param brainyData The BrainyData instance to wrap
*/
constructor(brainyData) {
this.brainyData = brainyData;
}
/**
* Handles an MCP data access request
* @param request The MCP request
* @returns An MCP response
*/
async handleRequest(request) {
try {
switch (request.operation) {
case 'get':
return await this.handleGetRequest(request);
case 'search':
return await this.handleSearchRequest(request);
case 'add':
return await this.handleAddRequest(request);
case 'getRelationships':
return await this.handleGetRelationshipsRequest(request);
default:
return this.createErrorResponse(request.requestId, 'UNSUPPORTED_OPERATION', `Operation ${request.operation} is not supported`);
}
}
catch (error) {
return this.createErrorResponse(request.requestId, 'INTERNAL_ERROR', error instanceof Error ? error.message : String(error));
}
}
/**
* Handles a get request
* @param request The MCP request
* @returns An MCP response
*/
async handleGetRequest(request) {
const { id } = request.parameters;
if (!id) {
return this.createErrorResponse(request.requestId, 'MISSING_PARAMETER', 'Parameter "id" is required');
}
const noun = await this.brainyData.get(id);
if (!noun) {
return this.createErrorResponse(request.requestId, 'NOT_FOUND', `No noun found with id ${id}`);
}
return this.createSuccessResponse(request.requestId, noun);
}
/**
* Handles a search request
* @param request The MCP request
* @returns An MCP response
*/
async handleSearchRequest(request) {
const { query, k = 10 } = request.parameters;
if (!query) {
return this.createErrorResponse(request.requestId, 'MISSING_PARAMETER', 'Parameter "query" is required');
}
const results = await this.brainyData.searchText(query, k);
return this.createSuccessResponse(request.requestId, results);
}
/**
* Handles an add request
* @param request The MCP request
* @returns An MCP response
*/
async handleAddRequest(request) {
const { text, metadata } = request.parameters;
if (!text) {
return this.createErrorResponse(request.requestId, 'MISSING_PARAMETER', 'Parameter "text" is required');
}
const id = await this.brainyData.add(text, metadata);
return this.createSuccessResponse(request.requestId, { id });
}
/**
* Handles a getRelationships request
* @param request The MCP request
* @returns An MCP response
*/
async handleGetRelationshipsRequest(request) {
const { id } = request.parameters;
if (!id) {
return this.createErrorResponse(request.requestId, 'MISSING_PARAMETER', 'Parameter "id" is required');
}
// This is a simplified implementation - in a real implementation, we would
// need to check if these methods exist on the BrainyDataInterface
const outgoing = await this.brainyData.getVerbsBySource?.(id) || [];
const incoming = await this.brainyData.getVerbsByTarget?.(id) || [];
return this.createSuccessResponse(request.requestId, { outgoing, incoming });
}
/**
* Creates a success response
* @param requestId The request ID
* @param data The response data
* @returns An MCP response
*/
createSuccessResponse(requestId, data) {
return {
success: true,
requestId,
version: MCP_VERSION,
data
};
}
/**
* Creates an error response
* @param requestId The request ID
* @param code The error code
* @param message The error message
* @param details Optional error details
* @returns An MCP response
*/
createErrorResponse(requestId, code, message, details) {
return {
success: false,
requestId,
version: MCP_VERSION,
error: {
code,
message,
details
}
};
}
/**
* Creates a new request ID
* @returns A new UUID
*/
generateRequestId() {
return uuidv4();
}
}
//# sourceMappingURL=brainyMCPAdapter.js.map