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