UNPKG

@ansvar/singapore-law-mcp

Version:

Complete Singapore law database — 523 Acts, 28K+ provisions from Singapore Statutes Online (sso.agc.gov.sg) with full-text search, definitions, and citation support

54 lines 1.96 kB
/** * search_legislation — Full-text search across Singapore statute provisions. */ import { buildFtsQueryVariants, sanitizeFtsInput } from '../utils/fts-query.js'; import { generateResponseMetadata } from '../utils/metadata.js'; const DEFAULT_LIMIT = 10; const MAX_LIMIT = 50; export async function searchLegislation(db, input) { if (!input.query || input.query.trim().length === 0) { return { results: [], _metadata: generateResponseMetadata(db) }; } const limit = Math.min(Math.max(input.limit ?? DEFAULT_LIMIT, 1), MAX_LIMIT); const queryVariants = buildFtsQueryVariants(sanitizeFtsInput(input.query)); for (const ftsQuery of queryVariants) { let sql = ` SELECT lp.document_id, ld.title as document_title, lp.provision_ref, lp.chapter, lp.section, lp.title, snippet(provisions_fts, 0, '>>>', '<<<', '...', 32) as snippet, bm25(provisions_fts) as relevance FROM provisions_fts JOIN legal_provisions lp ON lp.id = provisions_fts.rowid JOIN legal_documents ld ON ld.id = lp.document_id WHERE provisions_fts MATCH ? `; const params = [ftsQuery]; if (input.document_id) { sql += ' AND lp.document_id = ?'; params.push(input.document_id); } if (input.status) { sql += ' AND ld.status = ?'; params.push(input.status); } sql += ' ORDER BY relevance LIMIT ?'; params.push(limit); try { const rows = db.prepare(sql).all(...params); if (rows.length > 0) { return { results: rows, _metadata: generateResponseMetadata(db) }; } } catch { // FTS query syntax error — try next variant continue; } } return { results: [], _metadata: generateResponseMetadata(db) }; } //# sourceMappingURL=search-legislation.js.map