@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
101 lines • 3.75 kB
JavaScript
/**
* validate_citation — Validate a Singapore legal citation against the database.
*/
import { resolveDocumentId } from '../utils/statute-id.js';
import { generateResponseMetadata } from '../utils/metadata.js';
/**
* Parse a Singapore legal citation.
* Supports:
* - "Section 2 PDPA" / "s 2 PDPA"
* - "Section 2 Personal Data Protection Act 2012"
* - "PDPA s 2"
* - Document title with section reference
*/
function parseCitation(citation) {
const trimmed = citation.trim();
// "Section N <act>" or "s N <act>"
const secFirst = trimmed.match(/^(?:Section|s\.?)\s*(\d+[A-Za-z]*)\s+(.+)$/i);
if (secFirst) {
return { documentRef: secFirst[2].trim(), sectionRef: secFirst[1] };
}
// "<act> Section N" or "<act>, s N"
const secLast = trimmed.match(/^(.+?)[,;]?\s*(?:Section|s\.?)\s*(\d+[A-Za-z]*)$/i);
if (secLast) {
return { documentRef: secLast[1].trim(), sectionRef: secLast[2] };
}
// Just a document reference
return { documentRef: trimmed };
}
export async function validateCitationTool(db, input) {
const warnings = [];
const parsed = parseCitation(input.citation);
if (!parsed) {
return {
results: {
valid: false,
citation: input.citation,
warnings: ['Could not parse citation format'],
},
_metadata: generateResponseMetadata(db),
};
}
const docId = resolveDocumentId(db, parsed.documentRef);
if (!docId) {
return {
results: {
valid: false,
citation: input.citation,
warnings: [`Document not found: "${parsed.documentRef}"`],
},
_metadata: generateResponseMetadata(db),
};
}
const doc = db.prepare('SELECT id, title, status FROM legal_documents WHERE id = ?').get(docId);
if (doc.status === 'repealed') {
warnings.push(`WARNING: This statute has been repealed.`);
}
else if (doc.status === 'amended') {
warnings.push(`Note: This statute has been amended. Verify you are referencing the current version.`);
}
if (parsed.sectionRef) {
const provision = db.prepare("SELECT provision_ref FROM legal_provisions WHERE document_id = ? AND (provision_ref = ? OR provision_ref = ? OR provision_ref = ? OR section = ?)").get(docId, parsed.sectionRef, `s${parsed.sectionRef}`, `art${parsed.sectionRef}`, parsed.sectionRef);
if (!provision) {
return {
results: {
valid: false,
citation: input.citation,
document_id: docId,
document_title: doc.title,
warnings: [...warnings, `Provision "${parsed.sectionRef}" not found in ${doc.title}`],
},
_metadata: generateResponseMetadata(db),
};
}
return {
results: {
valid: true,
citation: input.citation,
normalized: `Section ${parsed.sectionRef} ${doc.title}`,
document_id: docId,
document_title: doc.title,
provision_ref: provision.provision_ref,
status: doc.status,
warnings,
},
_metadata: generateResponseMetadata(db),
};
}
return {
results: {
valid: true,
citation: input.citation,
normalized: doc.title,
document_id: docId,
document_title: doc.title,
status: doc.status,
warnings,
},
_metadata: generateResponseMetadata(db),
};
}
//# sourceMappingURL=validate-citation.js.map