@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
JavaScript
/**
* 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