mcp-adr-analysis-server
Version:
MCP server for analyzing Architectural Decision Records and project architecture
104 lines • 4.25 kB
JavaScript
/**
* Server Context Resource - Current server state and capabilities
* URI Pattern: adr://server/context
*/
import { McpAdrError } from '../types/index.js';
import { resourceCache, generateETag } from './resource-cache.js';
import { resourceRouter } from './resource-router.js';
/**
* Generate server context resource showing current state, memory, and capabilities.
*
* Returns a comprehensive markdown-formatted context that includes:
* - Server configuration and status
* - Validated deployment patterns
* - MCP resources catalog
* - Memory and knowledge graph status
* - Recent deployment activity
* - Usage recommendations
*
* **URI Pattern:** `adr://server/context`
*
* **Query Parameters:**
* - `includeDetailed`: Include detailed information (default: true)
* - `maxRecentItems`: Maximum number of recent items to show (default: 5)
* - `projectPath`: Override project root path (default: process.cwd())
*
* @param params - URL path parameters (none for this resource)
* @param searchParams - URL query parameters for customization
*
* @returns Promise resolving to resource generation result containing:
* - data: Server context data with markdown content
* - contentType: "application/json"
* - lastModified: ISO timestamp of generation
* - cacheKey: Unique identifier "server-context"
* - ttl: Cache duration (60 seconds / 1 minute)
* - etag: Entity tag for cache validation
*
* @throws {McpAdrError} When context generation fails
*
* @example
* ```typescript
* // Get server context with defaults
* const context = await generateServerContextResource(
* {},
* new URLSearchParams()
* );
*
* console.log(context.data.context); // Markdown-formatted context
*
* // Get abbreviated context
* const brief = await generateServerContextResource(
* {},
* new URLSearchParams('includeDetailed=false&maxRecentItems=3')
* );
* ```
*
* @since v2.2.0
* @see {@link ServerContextGenerator} for context generation logic
*/
export async function generateServerContextResource(_params, searchParams, kgManager, memoryManager, conversationManager) {
const cacheKey = 'server-context';
// Check cache
const cached = await resourceCache.get(cacheKey);
if (cached) {
return cached;
}
try {
const includeDetailed = searchParams.get('includeDetailed') !== 'false';
const maxRecentItems = parseInt(searchParams.get('maxRecentItems') || '5', 10);
const projectPath = searchParams.get('projectPath') || process.cwd();
// If managers are not provided, we'll generate basic context
// In practice, these should be injected from the MCP server
if (!kgManager || !memoryManager || !conversationManager) {
throw new McpAdrError('Server context requires initialized managers. Access this resource through the MCP server.', 'RESOURCE_GENERATION_ERROR');
}
// Generate context using ServerContextGenerator
const { ServerContextGenerator: Generator } = await import('../utils/server-context-generator.js');
const generator = new Generator();
const contextContent = await generator.generateContext(kgManager, memoryManager, conversationManager, { includeDetailed, maxRecentItems });
const contextData = {
context: contextContent,
timestamp: new Date().toISOString(),
projectPath,
includeDetailed,
maxRecentItems,
};
const result = {
data: contextData,
contentType: 'application/json',
lastModified: new Date().toISOString(),
cacheKey,
ttl: 60, // 1 minute cache (context changes frequently)
etag: generateETag(contextData),
};
// Cache result
resourceCache.set(cacheKey, result, result.ttl);
return result;
}
catch (error) {
throw new McpAdrError(`Failed to generate server context: ${error instanceof Error ? error.message : String(error)}`, 'RESOURCE_GENERATION_ERROR');
}
}
// Register route
resourceRouter.register('/server/context', generateServerContextResource, 'Current server state and capabilities');
//# sourceMappingURL=server-context-resource.js.map