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

84 lines 3.78 kB
/** * get_provision — Retrieve specific provision(s) from a Singapore statute. */ import { resolveDocumentId } from '../utils/statute-id.js'; import { generateResponseMetadata } from '../utils/metadata.js'; export async function getProvision(db, input) { const resolvedId = resolveDocumentId(db, input.document_id); if (!resolvedId) { return { results: [], _metadata: { ...generateResponseMetadata(db), ...{ note: `No document found matching "${input.document_id}"` }, }, }; } const docRow = db.prepare('SELECT id, title, url FROM legal_documents WHERE id = ?').get(resolvedId); if (!docRow) { return { results: [], _metadata: generateResponseMetadata(db) }; } // Specific provision lookup const ref = input.provision_ref ?? input.section; if (ref) { const refTrimmed = ref.trim(); // Try direct provision_ref match let provision = db.prepare('SELECT * FROM legal_provisions WHERE document_id = ? AND provision_ref = ?').get(resolvedId, refTrimmed); // Try with "s" prefix (e.g., "2" -> "s2") — Singapore uses section numbering if (!provision) { provision = db.prepare('SELECT * FROM legal_provisions WHERE document_id = ? AND provision_ref = ?').get(resolvedId, `s${refTrimmed}`); } // Try with "art" prefix for compatibility if (!provision) { provision = db.prepare('SELECT * FROM legal_provisions WHERE document_id = ? AND provision_ref = ?').get(resolvedId, `art${refTrimmed}`); } // Try section column match if (!provision) { provision = db.prepare('SELECT * FROM legal_provisions WHERE document_id = ? AND section = ?').get(resolvedId, refTrimmed); } // Try LIKE match for flexible input if (!provision) { provision = db.prepare("SELECT * FROM legal_provisions WHERE document_id = ? AND (provision_ref LIKE ? OR section LIKE ?)").get(resolvedId, `%${refTrimmed}%`, `%${refTrimmed}%`); } if (provision) { return { results: [{ document_id: resolvedId, document_title: docRow.title, provision_ref: String(provision.provision_ref), chapter: provision.chapter, section: String(provision.section), title: provision.title, content: String(provision.content), article_number: String(provision.provision_ref).replace(/^(?:s|art)/, ''), url: docRow.url ?? undefined, }], _metadata: generateResponseMetadata(db), }; } return { results: [], _metadata: { ...generateResponseMetadata(db), ...{ note: `Provision "${ref}" not found in document "${resolvedId}"` }, }, }; } // Return all provisions for the document const provisions = db.prepare('SELECT * FROM legal_provisions WHERE document_id = ? ORDER BY id').all(resolvedId); return { results: provisions.map(p => ({ document_id: resolvedId, document_title: docRow.title, provision_ref: String(p.provision_ref), chapter: p.chapter, section: String(p.section), title: p.title, content: String(p.content), article_number: String(p.provision_ref).replace(/^(?:s|art)/, ''), url: docRow.url ?? undefined, })), _metadata: generateResponseMetadata(db), }; } //# sourceMappingURL=get-provision.js.map