@mseep/atlas-mcp-server
Version:
A Model Context Protocol (MCP) server for ATLAS, a Neo4j-powered task management system for LLM Agents - implementing a three-tier architecture (Projects, Tasks, Knowledge) to manage complex workflows.
170 lines (149 loc) • 5.87 kB
text/typescript
import { ResponseFormatter, createFormattedResponse } from "../../../utils/responseFormatter.js";
/**
* Interface for a single knowledge item response
*/
interface SingleKnowledgeResponse {
id: string;
projectId: string;
text: string;
tags?: string[];
domain: string;
citations?: string[];
createdAt: string;
updatedAt: string;
properties?: any;
identity?: number;
labels?: string[];
elementId?: string;
}
/**
* Interface for bulk knowledge addition response
*/
interface BulkKnowledgeResponse {
success: boolean;
message: string;
created: (SingleKnowledgeResponse & { properties?: any; identity?: number; labels?: string[]; elementId?: string; })[];
errors: {
index: number;
knowledge: any;
error: {
code: string;
message: string;
details?: any;
};
}[];
}
/**
* Formatter for single knowledge item addition responses
*/
export class SingleKnowledgeFormatter implements ResponseFormatter<SingleKnowledgeResponse> {
format(data: SingleKnowledgeResponse): string {
// Extract knowledge properties from Neo4j structure
const knowledgeData = data.properties || data;
const { id, projectId, domain, createdAt } = knowledgeData;
// Create a summary section
const summary = `Knowledge Item Added Successfully\n\n` +
`ID: ${id || 'Unknown ID'}\n` +
`Project ID: ${projectId || 'Unknown Project'}\n` +
`Domain: ${domain || 'Uncategorized'}\n` +
`Created: ${createdAt ? new Date(createdAt).toLocaleString() : 'Unknown Date'}\n`;
// Create a comprehensive details section with all knowledge properties
const fieldLabels = {
id: "ID",
projectId: "Project ID",
text: "Content",
tags: "Tags",
domain: "Domain",
citations: "Citations",
createdAt: "Created At",
updatedAt: "Updated At"
};
let details = `Knowledge Item Details\n\n`;
// Build details as key-value pairs
Object.entries(fieldLabels).forEach(([key, label]) => {
if (knowledgeData[key] !== undefined) {
let value = knowledgeData[key];
// Format arrays
if (Array.isArray(value)) {
value = value.length > 0 ? JSON.stringify(value) : "None";
}
// Format objects
else if (typeof value === "object" && value !== null) {
value = JSON.stringify(value);
}
// Format dates more readably if they look like ISO dates
else if (typeof value === "string" &&
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value)) {
try {
value = new Date(value).toLocaleString();
} catch (e) {
// Keep original if parsing fails
}
}
// For text, limit the length in display
if (key === 'text' && typeof value === 'string' && value.length > 100) {
value = value.substring(0, 100) + '... (truncated)';
}
details += `${label}: ${value}\n`;
}
});
return `${summary}\n\n${details}`;
}
}
/**
* Formatter for bulk knowledge addition responses
*/
export class BulkKnowledgeFormatter implements ResponseFormatter<BulkKnowledgeResponse> {
format(data: BulkKnowledgeResponse): string {
const { success, message, created, errors } = data;
// Create a summary section with operation results
const summary = `${success ? "Knowledge Items Added Successfully" : "Knowledge Addition Completed with Errors"}\n\n` +
`Status: ${success ? "✅ Success" : "⚠️ Partial Success"}\n` +
`Summary: ${message}\n` +
`Added: ${created.length} item(s)\n` +
`Errors: ${errors.length} error(s)\n`;
// List the successfully created knowledge items
let createdSection = "";
if (created.length > 0) {
createdSection = `Added Knowledge Items\n\n`;
createdSection += created.map((item, index) => {
// Extract knowledge properties from Neo4j structure
const itemData = item.properties || item;
return `${index + 1}. Knowledge Item (${itemData.domain || 'Uncategorized'})\n` +
`ID: ${itemData.id || 'Unknown ID'}\n` +
`Project ID: ${itemData.projectId || 'Unknown Project'}\n` +
`Tags: ${itemData.tags ? JSON.stringify(itemData.tags) : 'None'}\n` +
`Created: ${itemData.createdAt ? new Date(itemData.createdAt).toLocaleString() : 'Unknown Date'}\n`;
}).join("\n\n");
}
// List any errors that occurred
let errorsSection = "";
if (errors.length > 0) {
errorsSection = `Errors\n\n`;
errorsSection += errors.map((error, index) => {
const itemProject = error.knowledge?.projectId || 'Unknown Project';
return `${index + 1}. Error in Knowledge Item for Project "${itemProject}"\n\n` +
`Error Code: ${error.error.code}\n` +
`Message: ${error.error.message}\n` +
(error.error.details ? `Details: ${JSON.stringify(error.error.details)}\n` : "");
}).join("\n\n");
}
return `${summary}\n\n${createdSection}\n\n${errorsSection}`.trim();
}
}
/**
* Create a formatted, human-readable response for the atlas_knowledge_add tool
*
* @param data The raw knowledge addition response data
* @param isError Whether this response represents an error condition
* @returns Formatted MCP tool response with appropriate structure
*/
export function formatKnowledgeAddResponse(data: any, isError = false): any {
// Determine if this is a single or bulk knowledge response
const isBulkResponse = data.hasOwnProperty("success") && data.hasOwnProperty("created");
if (isBulkResponse) {
return createFormattedResponse(data, new BulkKnowledgeFormatter(), isError);
} else {
return createFormattedResponse(data, new SingleKnowledgeFormatter(), isError);
}
}