Skip to main content
Glama
filter.ts1.63 kB
import { FilteredTool, ToolFilterResult } from './types.js'; import { validateRegexPatterns } from './utils/regex-validator.js'; export class RegexFilter { public readonly patterns: RegExp[]; public readonly rawPatterns: string[]; constructor(patterns: string[]) { const validation = validateRegexPatterns(patterns); if (!validation.valid || !validation.safe) { throw new Error(validation.error || 'Invalid regex patterns'); } this.rawPatterns = patterns; this.patterns = patterns.map((p) => new RegExp(p)); } matches(toolName: string): boolean { return this.patterns.some((pattern) => pattern.test(toolName)); } } export function applyFilters( tools: FilteredTool[], denyPatterns: string[] ): ToolFilterResult { if (denyPatterns.length === 0) { return { allowed: tools, denied: [], invalidPatterns: [], }; } const filter = new RegexFilter(denyPatterns); const allowed: FilteredTool[] = []; const denied: string[] = []; const matchedPatterns = new Set<number>(); for (const tool of tools) { let matched = false; for (let i = 0; i < filter.patterns.length; i++) { if (filter.patterns[i].test(tool.name)) { matchedPatterns.add(i); matched = true; } } if (matched) { denied.push(tool.name); } else { allowed.push(tool); } } const invalidPatterns: string[] = []; for (let i = 0; i < denyPatterns.length; i++) { if (!matchedPatterns.has(i)) { invalidPatterns.push(denyPatterns[i]); } } return { allowed, denied, invalidPatterns, }; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/respawn-app/tool-filter-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server