atlas-mcp-server
Version:
ATLAS (Adaptive Task & Logic Automation System): An MCP server enabling LLM agents to manage projects, tasks, and knowledge via a Neo4j-backed, three-tier architecture. Facilitates complex workflow automation and project management through LLM Agents.
110 lines (109 loc) • 6.22 kB
JavaScript
import { createToolResponse } from "../../../types/mcp.js"; // Import createToolResponse
/**
* Base response formatter for the `atlas_deep_research` tool.
* This formatter provides a basic structure for the output, primarily using
* the data returned by the core `deepResearch` function.
* It's designed to be used within `formatDeepResearchResponse` which adds
* contextual information from the original tool input.
*/
export const DeepResearchBaseFormatter = {
format: (data) => {
// This base format method only uses the 'data' part of the result.
// Context from the 'input' is added by the calling function below.
if (!data.success) {
// Basic error formatting if the operation failed
return `Error initiating deep research: ${data.message}`;
}
// Start building the Markdown output
const lines = [
`## Deep Research Plan Initiated`,
`**Status:** ${data.message}`, // Display the success message from the core logic
`**Plan Node ID:** \`${data.planNodeId}\``, // Show the ID of the created root node
];
// Add details about the created sub-topic nodes
if (data.subTopicNodes && data.subTopicNodes.length > 0) {
lines.push(`\n### Sub-Topics Created (${data.subTopicNodes.length})${data.tasksCreated ? " (with Tasks)" : ""}:`);
data.subTopicNodes.forEach((node) => {
const taskInfo = node.taskId
? `\n - **Task ID:** \`${node.taskId}\``
: "";
// Basic info available directly from the result data
lines.push(`- **Question:** ${node.question}\n - **Node ID:** \`${node.nodeId}\`${taskInfo}`);
});
}
else {
lines.push("\nNo sub-topics were specified or created.");
}
return lines.join("\n"); // Combine lines into a single Markdown string
},
};
/**
* Creates the final formatted `McpToolResponse` for the `atlas_deep_research` tool.
* This function takes the raw result from the core logic (`deepResearch`) and the
* original tool input, then uses a *contextual* formatter to generate the final
* Markdown output. The contextual formatter enhances the base format by including
* details from the input (like topic, goal, scope, tags, and search queries).
*
* @param rawData - The `DeepResearchResult` object returned by the `deepResearch` function.
* @param input - The original `AtlasDeepResearchInput` provided to the tool.
* @returns The final `McpToolResponse` object ready to be sent back to the client.
*/
export function formatDeepResearchResponse(rawData, input) {
// Define a contextual formatter *inside* this function.
// This allows the formatter's `format` method to access the `input` variable via closure.
const contextualFormatter = {
format: (data) => {
// Handle error case first
if (!data.success) {
return `Error initiating deep research: ${data.message}`;
}
// Start building the Markdown output, including details from the input
const lines = [
`## Deep Research Plan Initiated`,
`**Topic:** ${input.researchTopic}`, // Include Topic from input
`**Goal:** ${input.researchGoal}`, // Include Goal from input
];
if (input.scopeDefinition) {
lines.push(`**Scope:** ${input.scopeDefinition}`); // Include Scope if provided
}
lines.push(`**Project ID:** \`${input.projectId}\``); // Include Project ID
if (input.researchDomain) {
lines.push(`**Domain:** ${input.researchDomain}`); // Include Domain if provided
}
lines.push(`**Status:** ${data.message}`); // Status message from result
lines.push(`**Plan Node ID:** \`${data.planNodeId}\``); // Root node ID from result
if (input.initialTags && input.initialTags.length > 0) {
lines.push(`**Initial Tags:** ${input.initialTags.join(", ")}`); // Include initial tags
}
// Add details about sub-topic nodes, including search queries from input
if (data.subTopicNodes && data.subTopicNodes.length > 0) {
lines.push(`\n### Sub-Topics Created (${data.subTopicNodes.length}):`);
data.subTopicNodes.forEach((node) => {
// Find the corresponding sub-topic in the input to retrieve initial search queries
// Find the corresponding sub-topic in the input to retrieve initial search queries and task details
const inputSubTopic = input.subTopics.find((st) => st.question === node.question);
const searchQueries = inputSubTopic?.initialSearchQueries?.join(", ") || "N/A"; // Format queries or show N/A
const taskInfo = node.taskId
? `\n - **Task ID:** \`${node.taskId}\``
: ""; // Add Task ID if present
const priorityInfo = inputSubTopic?.priority
? `\n - **Task Priority:** ${inputSubTopic.priority}`
: "";
const assigneeInfo = inputSubTopic?.assignedTo
? `\n - **Task Assignee:** ${inputSubTopic.assignedTo}`
: "";
const statusInfo = inputSubTopic?.initialStatus
? `\n - **Task Status:** ${inputSubTopic.initialStatus}`
: "";
lines.push(`- **Question:** ${node.question}\n - **Node ID:** \`${node.nodeId}\`${taskInfo}${priorityInfo}${assigneeInfo}${statusInfo}\n - **Initial Search Queries:** ${searchQueries}`);
});
}
else {
lines.push("\nNo sub-topics were specified or created.");
}
return lines.join("\n"); // Combine all lines into the final Markdown string
},
};
const formattedText = contextualFormatter.format(rawData);
return createToolResponse(formattedText, !rawData.success);
}