@sanderkooger/mcp-server-ragdocs
Version:
An MCP server for semantic documentation search and retrieval using vector databases to augment LLM capabilities.
57 lines (56 loc) • 2.4 kB
JavaScript
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
import { BaseHandler } from './base-handler.js';
const COLLECTION_NAME = 'documentation';
export class RemoveDocumentationHandler extends BaseHandler {
async handle(args) {
if (!args.urls || !Array.isArray(args.urls) || args.urls.length === 0) {
throw new McpError(ErrorCode.InvalidParams, 'urls must be a non-empty array');
}
if (!args.urls.every((url) => typeof url === 'string')) {
throw new McpError(ErrorCode.InvalidParams, 'All URLs must be strings');
}
try {
// Delete using filter to match any of the provided URLs
const result = await this.apiClient.qdrantClient.delete(COLLECTION_NAME, {
filter: {
should: args.urls.map((url) => ({
key: 'url',
match: { value: url }
}))
},
wait: true // Ensure deletion is complete before responding
});
if (!['acknowledged', 'completed'].includes(result.status)) {
throw new Error('Delete operation failed');
}
return {
content: [
{
type: 'text',
text: `Successfully removed documentation from ${args.urls.length} source${args.urls.length > 1 ? 's' : ''}: ${args.urls.join(', ')}`
}
]
};
}
catch (error) {
if (error instanceof Error) {
if (error.message.includes('unauthorized')) {
throw new McpError(ErrorCode.InvalidRequest, 'Failed to authenticate with Qdrant cloud while removing documentation');
}
else if (error.message.includes('ECONNREFUSED') ||
error.message.includes('ETIMEDOUT')) {
throw new McpError(ErrorCode.InternalError, 'Connection to Qdrant cloud failed while removing documentation');
}
}
return {
content: [
{
type: 'text',
text: `Failed to remove documentation: ${error}`
}
],
isError: true
};
}
}
}