@ansvar/zimbabwe-law-mcp 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +110 -0
  3. package/README.md +151 -0
  4. package/data/.gitkeep +0 -0
  5. package/data/database.db +0 -0
  6. package/data/seed/zw-access-information-privacy.json +1087 -0
  7. package/data/seed/zw-broadcasting-services.json +1150 -0
  8. package/data/seed/zw-companies-business-entities.json +4128 -0
  9. package/data/seed/zw-constitution-2013.json +2783 -0
  10. package/data/seed/zw-criminal-law-codification.json +2857 -0
  11. package/data/seed/zw-cyber-data-protection-2021.json +389 -0
  12. package/data/seed/zw-freedom-of-information-2020.json +382 -0
  13. package/data/seed/zw-interception-communications-2007.json +335 -0
  14. package/data/seed/zw-money-laundering-proceeds-crime.json +1432 -0
  15. package/data/seed/zw-postal-telecommunications.json +1361 -0
  16. package/dist/capabilities.d.ts +16 -0
  17. package/dist/capabilities.d.ts.map +1 -0
  18. package/dist/capabilities.js +43 -0
  19. package/dist/capabilities.js.map +1 -0
  20. package/dist/constants.d.ts +7 -0
  21. package/dist/constants.d.ts.map +1 -0
  22. package/dist/constants.js +7 -0
  23. package/dist/constants.js.map +1 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +80 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/tools/about.d.ts +37 -0
  29. package/dist/tools/about.d.ts.map +1 -0
  30. package/dist/tools/about.js +46 -0
  31. package/dist/tools/about.js.map +1 -0
  32. package/dist/tools/build-legal-stance.d.ts +21 -0
  33. package/dist/tools/build-legal-stance.d.ts.map +1 -0
  34. package/dist/tools/build-legal-stance.js +46 -0
  35. package/dist/tools/build-legal-stance.js.map +1 -0
  36. package/dist/tools/check-currency.d.ts +20 -0
  37. package/dist/tools/check-currency.d.ts.map +1 -0
  38. package/dist/tools/check-currency.js +41 -0
  39. package/dist/tools/check-currency.js.map +1 -0
  40. package/dist/tools/format-citation.d.ts +19 -0
  41. package/dist/tools/format-citation.d.ts.map +1 -0
  42. package/dist/tools/format-citation.js +33 -0
  43. package/dist/tools/format-citation.js.map +1 -0
  44. package/dist/tools/get-eu-basis.d.ts +25 -0
  45. package/dist/tools/get-eu-basis.d.ts.map +1 -0
  46. package/dist/tools/get-eu-basis.js +56 -0
  47. package/dist/tools/get-eu-basis.js.map +1 -0
  48. package/dist/tools/get-provision-eu-basis.d.ts +20 -0
  49. package/dist/tools/get-provision-eu-basis.d.ts.map +1 -0
  50. package/dist/tools/get-provision-eu-basis.js +45 -0
  51. package/dist/tools/get-provision-eu-basis.js.map +1 -0
  52. package/dist/tools/get-provision.d.ts +24 -0
  53. package/dist/tools/get-provision.d.ts.map +1 -0
  54. package/dist/tools/get-provision.js +80 -0
  55. package/dist/tools/get-provision.js.map +1 -0
  56. package/dist/tools/get-zimbabwean-implementations.d.ts +27 -0
  57. package/dist/tools/get-zimbabwean-implementations.d.ts.map +1 -0
  58. package/dist/tools/get-zimbabwean-implementations.js +48 -0
  59. package/dist/tools/get-zimbabwean-implementations.js.map +1 -0
  60. package/dist/tools/list-sources.d.ts +25 -0
  61. package/dist/tools/list-sources.d.ts.map +1 -0
  62. package/dist/tools/list-sources.js +44 -0
  63. package/dist/tools/list-sources.js.map +1 -0
  64. package/dist/tools/registry.d.ts +13 -0
  65. package/dist/tools/registry.d.ts.map +1 -0
  66. package/dist/tools/registry.js +365 -0
  67. package/dist/tools/registry.js.map +1 -0
  68. package/dist/tools/search-eu-implementations.d.ts +25 -0
  69. package/dist/tools/search-eu-implementations.d.ts.map +1 -0
  70. package/dist/tools/search-eu-implementations.js +59 -0
  71. package/dist/tools/search-eu-implementations.js.map +1 -0
  72. package/dist/tools/search-legislation.d.ts +24 -0
  73. package/dist/tools/search-legislation.d.ts.map +1 -0
  74. package/dist/tools/search-legislation.js +54 -0
  75. package/dist/tools/search-legislation.js.map +1 -0
  76. package/dist/tools/validate-citation.d.ts +26 -0
  77. package/dist/tools/validate-citation.d.ts.map +1 -0
  78. package/dist/tools/validate-citation.js +118 -0
  79. package/dist/tools/validate-citation.js.map +1 -0
  80. package/dist/tools/validate-eu-compliance.d.ts +20 -0
  81. package/dist/tools/validate-eu-compliance.d.ts.map +1 -0
  82. package/dist/tools/validate-eu-compliance.js +98 -0
  83. package/dist/tools/validate-eu-compliance.js.map +1 -0
  84. package/dist/utils/as-of-date.d.ts +9 -0
  85. package/dist/utils/as-of-date.d.ts.map +1 -0
  86. package/dist/utils/as-of-date.js +25 -0
  87. package/dist/utils/as-of-date.js.map +1 -0
  88. package/dist/utils/fts-query.d.ts +19 -0
  89. package/dist/utils/fts-query.d.ts.map +1 -0
  90. package/dist/utils/fts-query.js +47 -0
  91. package/dist/utils/fts-query.js.map +1 -0
  92. package/dist/utils/metadata.d.ts +16 -0
  93. package/dist/utils/metadata.d.ts.map +1 -0
  94. package/dist/utils/metadata.js +23 -0
  95. package/dist/utils/metadata.js.map +1 -0
  96. package/dist/utils/statute-id.d.ts +15 -0
  97. package/dist/utils/statute-id.d.ts.map +1 -0
  98. package/dist/utils/statute-id.js +39 -0
  99. package/dist/utils/statute-id.js.map +1 -0
  100. package/fixtures/golden-hashes.json +56 -0
  101. package/fixtures/golden-tests.json +180 -0
  102. package/package.json +77 -0
  103. package/server.json +22 -0
  104. package/sources.yml +64 -0
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Tool registry for Zimbabwe Law MCP Server.
3
+ * Shared between stdio (index.ts) and HTTP (api/mcp.ts) entry points.
4
+ */
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
6
+ import { searchLegislation } from './search-legislation.js';
7
+ import { getProvision } from './get-provision.js';
8
+ import { validateCitationTool } from './validate-citation.js';
9
+ import { buildLegalStance } from './build-legal-stance.js';
10
+ import { formatCitationTool } from './format-citation.js';
11
+ import { checkCurrency } from './check-currency.js';
12
+ import { getEUBasis } from './get-eu-basis.js';
13
+ import { getZimbabweanImplementations } from './get-zimbabwean-implementations.js';
14
+ import { searchEUImplementations } from './search-eu-implementations.js';
15
+ import { getProvisionEUBasis } from './get-provision-eu-basis.js';
16
+ import { validateEUCompliance } from './validate-eu-compliance.js';
17
+ import { listSources } from './list-sources.js';
18
+ import { getAbout } from './about.js';
19
+ const ABOUT_TOOL = {
20
+ name: 'about',
21
+ description: 'Server metadata, dataset statistics, freshness, and provenance. ' +
22
+ 'Call this to verify data coverage, currency, and content basis before relying on results.',
23
+ inputSchema: { type: 'object', properties: {} },
24
+ };
25
+ const LIST_SOURCES_TOOL = {
26
+ name: 'list_sources',
27
+ description: 'Returns detailed provenance metadata for all data sources used by this server, ' +
28
+ 'including ZimLII (Zimbabwe Legal Information Institute). ' +
29
+ 'Use this to understand what data is available, its authority, coverage scope, and known limitations. ' +
30
+ 'Also returns dataset statistics (document counts, provision counts) and database build timestamp. ' +
31
+ 'Call this FIRST when you need to understand what Zimbabwean legal data this server covers.',
32
+ inputSchema: { type: 'object', properties: {} },
33
+ };
34
+ export const TOOLS = [
35
+ {
36
+ name: 'search_legislation',
37
+ description: 'Search Zimbabwean statutes and regulations by keyword using full-text search (FTS5 with BM25 ranking). ' +
38
+ 'Returns matching provisions with document context, snippets with >>> <<< markers around matched terms, and relevance scores. ' +
39
+ 'Supports FTS5 syntax: quoted phrases ("exact match"), boolean operators (AND, OR, NOT), and prefix wildcards (term*). ' +
40
+ 'Default limit is 10 results. For broad topics, increase the limit. ' +
41
+ 'Do NOT use this for retrieving a known provision -- use get_provision instead.',
42
+ inputSchema: {
43
+ type: 'object',
44
+ properties: {
45
+ query: {
46
+ type: 'string',
47
+ description: 'Search query in English. Supports FTS5 syntax: ' +
48
+ '"data protection" for exact phrase, term* for prefix.',
49
+ },
50
+ document_id: {
51
+ type: 'string',
52
+ description: 'Optional: filter results to a specific statute by its document ID.',
53
+ },
54
+ status: {
55
+ type: 'string',
56
+ enum: ['in_force', 'amended', 'repealed'],
57
+ description: 'Optional: filter by legislative status.',
58
+ },
59
+ limit: {
60
+ type: 'number',
61
+ description: 'Maximum results to return (default: 10, max: 50).',
62
+ default: 10,
63
+ },
64
+ },
65
+ required: ['query'],
66
+ },
67
+ },
68
+ {
69
+ name: 'get_provision',
70
+ description: 'Retrieve the full text of a specific provision (section) from a Zimbabwean statute. ' +
71
+ 'Specify a document_id (Act title, chapter number, or internal ID) and optionally a section or provision_ref. ' +
72
+ 'Omit section/provision_ref to get ALL provisions in the statute (use sparingly -- can be large). ' +
73
+ 'Returns provision text, chapter, section number, and metadata. ' +
74
+ 'Supports Act title references (e.g., "Cyber and Data Protection Act 2021"), ' +
75
+ 'chapter numbers (e.g., "Chapter 9:23"), and short names. ' +
76
+ 'Use this when you know WHICH provision you want. For discovery, use search_legislation instead.',
77
+ inputSchema: {
78
+ type: 'object',
79
+ properties: {
80
+ document_id: {
81
+ type: 'string',
82
+ description: 'Statute identifier: Act title (e.g., "Cyber and Data Protection Act 2021"), ' +
83
+ 'chapter number (e.g., "Chapter 9:23"), short name, or internal document ID.',
84
+ },
85
+ section: {
86
+ type: 'string',
87
+ description: 'Section number (e.g., "1", "29"). Omit to get all provisions.',
88
+ },
89
+ provision_ref: {
90
+ type: 'string',
91
+ description: 'Direct provision reference (e.g., "s1"). Alternative to section parameter.',
92
+ },
93
+ },
94
+ required: ['document_id'],
95
+ },
96
+ },
97
+ {
98
+ name: 'validate_citation',
99
+ description: 'Validate a Zimbabwean legal citation against the database -- zero-hallucination check. ' +
100
+ 'Parses the citation, checks that the document and provision exist, and returns warnings about status ' +
101
+ '(repealed, amended). Use this to verify any citation BEFORE including it in a legal analysis. ' +
102
+ 'Supports formats: "Section 29, Cyber and Data Protection Act 2021", "s 29 CDPA", "Chapter 9:23, Section 1".',
103
+ inputSchema: {
104
+ type: 'object',
105
+ properties: {
106
+ citation: {
107
+ type: 'string',
108
+ description: 'Citation string to validate. Examples: "Section 29, Cyber and Data Protection Act 2021", "Chapter 9:23".',
109
+ },
110
+ },
111
+ required: ['citation'],
112
+ },
113
+ },
114
+ {
115
+ name: 'build_legal_stance',
116
+ description: 'Build a comprehensive set of citations for a legal question by searching across all Zimbabwean statutes simultaneously. ' +
117
+ 'Returns aggregated results from multiple relevant provisions, useful for legal research on a topic. ' +
118
+ 'Use this for broad legal questions like "What are the penalties for data breaches in Zimbabwe?" ' +
119
+ 'rather than looking up a specific known provision.',
120
+ inputSchema: {
121
+ type: 'object',
122
+ properties: {
123
+ query: {
124
+ type: 'string',
125
+ description: 'Legal question or topic to research (e.g., "data protection", "cybercrime penalties").',
126
+ },
127
+ document_id: {
128
+ type: 'string',
129
+ description: 'Optional: limit search to one statute by document ID.',
130
+ },
131
+ limit: {
132
+ type: 'number',
133
+ description: 'Max results per category (default: 5, max: 20).',
134
+ default: 5,
135
+ },
136
+ },
137
+ required: ['query'],
138
+ },
139
+ },
140
+ {
141
+ name: 'format_citation',
142
+ description: 'Format a Zimbabwean legal citation per standard conventions. ' +
143
+ 'Three formats: "full" (formal, e.g., "Section 29, Cyber and Data Protection Act 2021"), ' +
144
+ '"short" (abbreviated), "pinpoint" (section reference only).',
145
+ inputSchema: {
146
+ type: 'object',
147
+ properties: {
148
+ citation: { type: 'string', description: 'Citation string to format.' },
149
+ format: {
150
+ type: 'string',
151
+ enum: ['full', 'short', 'pinpoint'],
152
+ description: 'Output format (default: "full").',
153
+ default: 'full',
154
+ },
155
+ },
156
+ required: ['citation'],
157
+ },
158
+ },
159
+ {
160
+ name: 'check_currency',
161
+ description: 'Check whether a Zimbabwean statute or provision is currently in force, amended, repealed, or not yet in force. ' +
162
+ 'Returns the document status, issued date, in-force date, and warnings. ' +
163
+ 'Essential before citing any provision -- always verify currency.',
164
+ inputSchema: {
165
+ type: 'object',
166
+ properties: {
167
+ document_id: {
168
+ type: 'string',
169
+ description: 'Statute identifier (Act title, chapter number, or short name).',
170
+ },
171
+ provision_ref: {
172
+ type: 'string',
173
+ description: 'Optional: provision reference to check a specific section.',
174
+ },
175
+ },
176
+ required: ['document_id'],
177
+ },
178
+ },
179
+ {
180
+ name: 'get_eu_basis',
181
+ description: 'Get the international/EU legal basis that a Zimbabwean statute aligns with or references. ' +
182
+ 'Zimbabwe is not an EU member but several Zimbabwean laws align with international instruments ' +
183
+ '(e.g., CDPA aligns with GDPR, cybercrime provisions with Budapest Convention). ' +
184
+ 'Returns document identifiers, reference types, and implementation status.',
185
+ inputSchema: {
186
+ type: 'object',
187
+ properties: {
188
+ document_id: { type: 'string', description: 'Zimbabwean statute identifier.' },
189
+ include_articles: {
190
+ type: 'boolean',
191
+ description: 'Include specific article references (default: false).',
192
+ default: false,
193
+ },
194
+ },
195
+ required: ['document_id'],
196
+ },
197
+ },
198
+ {
199
+ name: 'get_zimbabwean_implementations',
200
+ description: 'Find all Zimbabwean statutes that align with or implement a specific EU directive/regulation or international convention. ' +
201
+ 'Given an EU/international document ID (e.g., "regulation:2016/679" for GDPR), returns matching Zimbabwean statutes. ' +
202
+ 'Note: Zimbabwe implements international standards through domestic legislation, not transposition.',
203
+ inputSchema: {
204
+ type: 'object',
205
+ properties: {
206
+ eu_document_id: {
207
+ type: 'string',
208
+ description: 'EU/international document ID (e.g., "regulation:2016/679" for GDPR).',
209
+ },
210
+ primary_only: {
211
+ type: 'boolean',
212
+ description: 'Return only primary implementing statutes (default: false).',
213
+ default: false,
214
+ },
215
+ in_force_only: {
216
+ type: 'boolean',
217
+ description: 'Return only currently in-force statutes (default: false).',
218
+ default: false,
219
+ },
220
+ },
221
+ required: ['eu_document_id'],
222
+ },
223
+ },
224
+ {
225
+ name: 'search_eu_implementations',
226
+ description: 'Search for EU directives and regulations that have Zimbabwean implementing/aligning legislation. ' +
227
+ 'Search by keyword, type (directive/regulation), or year range.',
228
+ inputSchema: {
229
+ type: 'object',
230
+ properties: {
231
+ query: { type: 'string', description: 'Keyword search across EU/international document titles.' },
232
+ type: { type: 'string', enum: ['directive', 'regulation'], description: 'Filter by document type.' },
233
+ year_from: { type: 'number', description: 'Filter by year (from).' },
234
+ year_to: { type: 'number', description: 'Filter by year (to).' },
235
+ has_zimbabwean_implementation: {
236
+ type: 'boolean',
237
+ description: 'If true, only return documents with Zimbabwean aligning legislation.',
238
+ },
239
+ limit: { type: 'number', description: 'Max results (default: 20, max: 100).', default: 20 },
240
+ },
241
+ },
242
+ },
243
+ {
244
+ name: 'get_provision_eu_basis',
245
+ description: 'Get the international/EU legal basis for a SPECIFIC provision within a Zimbabwean statute. ' +
246
+ 'More granular than get_eu_basis (which operates at the statute level). ' +
247
+ 'Use this for pinpoint international compliance checks at the provision level.',
248
+ inputSchema: {
249
+ type: 'object',
250
+ properties: {
251
+ document_id: { type: 'string', description: 'Zimbabwean statute identifier.' },
252
+ provision_ref: { type: 'string', description: 'Provision reference (e.g., "s1" or "1").' },
253
+ },
254
+ required: ['document_id', 'provision_ref'],
255
+ },
256
+ },
257
+ {
258
+ name: 'validate_eu_compliance',
259
+ description: 'Check international/EU alignment status for a Zimbabwean statute or provision. ' +
260
+ 'Detects references to repealed directives, missing alignment status, outdated references. ' +
261
+ 'Returns compliance status (compliant, partial, unclear, not_applicable) with warnings.',
262
+ inputSchema: {
263
+ type: 'object',
264
+ properties: {
265
+ document_id: { type: 'string', description: 'Zimbabwean statute identifier.' },
266
+ provision_ref: { type: 'string', description: 'Optional: check for a specific provision.' },
267
+ eu_document_id: { type: 'string', description: 'Optional: check against a specific EU/international document.' },
268
+ },
269
+ required: ['document_id'],
270
+ },
271
+ },
272
+ ];
273
+ export function buildTools(db, context) {
274
+ const tools = [...TOOLS, LIST_SOURCES_TOOL];
275
+ if (db) {
276
+ try {
277
+ db.prepare('SELECT 1 FROM definitions LIMIT 1').get();
278
+ // Could add a get_definitions tool here when definitions table exists
279
+ }
280
+ catch {
281
+ // definitions table doesn't exist
282
+ }
283
+ }
284
+ if (context) {
285
+ tools.push(ABOUT_TOOL);
286
+ }
287
+ return tools;
288
+ }
289
+ export function registerTools(server, db, context) {
290
+ const allTools = buildTools(db, context);
291
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
292
+ return { tools: allTools };
293
+ });
294
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
295
+ const { name, arguments: args } = request.params;
296
+ try {
297
+ let result;
298
+ switch (name) {
299
+ case 'search_legislation':
300
+ result = await searchLegislation(db, args);
301
+ break;
302
+ case 'get_provision':
303
+ result = await getProvision(db, args);
304
+ break;
305
+ case 'validate_citation':
306
+ result = await validateCitationTool(db, args);
307
+ break;
308
+ case 'build_legal_stance':
309
+ result = await buildLegalStance(db, args);
310
+ break;
311
+ case 'format_citation':
312
+ result = await formatCitationTool(args);
313
+ break;
314
+ case 'check_currency':
315
+ result = await checkCurrency(db, args);
316
+ break;
317
+ case 'get_eu_basis':
318
+ result = await getEUBasis(db, args);
319
+ break;
320
+ case 'get_zimbabwean_implementations':
321
+ result = await getZimbabweanImplementations(db, args);
322
+ break;
323
+ case 'search_eu_implementations':
324
+ result = await searchEUImplementations(db, args);
325
+ break;
326
+ case 'get_provision_eu_basis':
327
+ result = await getProvisionEUBasis(db, args);
328
+ break;
329
+ case 'validate_eu_compliance':
330
+ result = await validateEUCompliance(db, args);
331
+ break;
332
+ case 'list_sources':
333
+ result = await listSources(db);
334
+ break;
335
+ case 'about':
336
+ if (context) {
337
+ result = getAbout(db, context);
338
+ }
339
+ else {
340
+ return {
341
+ content: [{ type: 'text', text: 'About tool not configured.' }],
342
+ isError: true,
343
+ };
344
+ }
345
+ break;
346
+ default:
347
+ return {
348
+ content: [{ type: 'text', text: `Error: Unknown tool "${name}".` }],
349
+ isError: true,
350
+ };
351
+ }
352
+ return {
353
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
354
+ };
355
+ }
356
+ catch (error) {
357
+ const message = error instanceof Error ? error.message : String(error);
358
+ return {
359
+ content: [{ type: 'text', text: `Error: ${message}` }],
360
+ isError: true,
361
+ };
362
+ }
363
+ });
364
+ }
365
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * search_eu_implementations — Search for EU directives/regulations that have
3
+ * Zimbabwean implementing/aligning legislation.
4
+ */
5
+ import type Database from '@ansvar/mcp-sqlite';
6
+ import { type ToolResponse } from '../utils/metadata.js';
7
+ export interface SearchEUImplementationsInput {
8
+ query?: string;
9
+ type?: 'directive' | 'regulation';
10
+ year_from?: number;
11
+ year_to?: number;
12
+ has_zimbabwean_implementation?: boolean;
13
+ limit?: number;
14
+ }
15
+ export interface EUImplementationSearchResult {
16
+ eu_document_id: string;
17
+ type: string;
18
+ year: number;
19
+ number: number;
20
+ title: string | null;
21
+ short_name: string | null;
22
+ zimbabwean_statute_count: number;
23
+ }
24
+ export declare function searchEUImplementations(db: InstanceType<typeof Database>, input: SearchEUImplementationsInput): Promise<ToolResponse<EUImplementationSearchResult[]>>;
25
+ //# sourceMappingURL=search-eu-implementations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-eu-implementations.d.ts","sourceRoot":"","sources":["../../src/tools/search-eu-implementations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,4BAA4B;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,GAAG,YAAY,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,YAAY,CAAC,4BAA4B,EAAE,CAAC,CAAC,CA6DvD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * search_eu_implementations — Search for EU directives/regulations that have
3
+ * Zimbabwean implementing/aligning legislation.
4
+ */
5
+ import { generateResponseMetadata } from '../utils/metadata.js';
6
+ export async function searchEUImplementations(db, input) {
7
+ try {
8
+ db.prepare('SELECT 1 FROM eu_documents LIMIT 1').get();
9
+ }
10
+ catch {
11
+ return {
12
+ results: [],
13
+ _metadata: {
14
+ ...generateResponseMetadata(db),
15
+ ...{ note: 'EU/international documents not available in this database tier' },
16
+ },
17
+ };
18
+ }
19
+ const limit = Math.min(Math.max(input.limit ?? 20, 1), 100);
20
+ let sql = `
21
+ SELECT
22
+ ed.id as eu_document_id,
23
+ ed.type,
24
+ ed.year,
25
+ ed.number,
26
+ ed.title,
27
+ ed.short_name,
28
+ COUNT(DISTINCT er.document_id) as zimbabwean_statute_count
29
+ FROM eu_documents ed
30
+ LEFT JOIN eu_references er ON er.eu_document_id = ed.id
31
+ WHERE 1=1
32
+ `;
33
+ const params = [];
34
+ if (input.query) {
35
+ sql += ' AND (ed.title LIKE ? OR ed.short_name LIKE ? OR ed.description LIKE ?)';
36
+ params.push(`%${input.query}%`, `%${input.query}%`, `%${input.query}%`);
37
+ }
38
+ if (input.type) {
39
+ sql += ' AND ed.type = ?';
40
+ params.push(input.type);
41
+ }
42
+ if (input.year_from) {
43
+ sql += ' AND ed.year >= ?';
44
+ params.push(input.year_from);
45
+ }
46
+ if (input.year_to) {
47
+ sql += ' AND ed.year <= ?';
48
+ params.push(input.year_to);
49
+ }
50
+ sql += ' GROUP BY ed.id';
51
+ if (input.has_zimbabwean_implementation) {
52
+ sql += ' HAVING zimbabwean_statute_count > 0';
53
+ }
54
+ sql += ' ORDER BY ed.year DESC, ed.number DESC LIMIT ?';
55
+ params.push(limit);
56
+ const rows = db.prepare(sql).all(...params);
57
+ return { results: rows, _metadata: generateResponseMetadata(db) };
58
+ }
59
+ //# sourceMappingURL=search-eu-implementations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-eu-implementations.js","sourceRoot":"","sources":["../../src/tools/search-eu-implementations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAqBnF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAiC,EACjC,KAAmC;IAEnC,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAE,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,OAAO,EAAE,EAAE;YACX,SAAS,EAAE;gBACT,GAAG,wBAAwB,CAAC,EAAE,CAAC;gBAC/B,GAAG,EAAE,IAAI,EAAE,gEAAgE,EAAE;aAC9E;SACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE5D,IAAI,GAAG,GAAG;;;;;;;;;;;;GAYT,CAAC;IACF,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,GAAG,IAAI,yEAAyE,CAAC;QACjF,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,GAAG,IAAI,kBAAkB,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,GAAG,IAAI,mBAAmB,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,GAAG,IAAI,mBAAmB,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,IAAI,iBAAiB,CAAC;IAEzB,IAAI,KAAK,CAAC,6BAA6B,EAAE,CAAC;QACxC,GAAG,IAAI,sCAAsC,CAAC;IAChD,CAAC;IAED,GAAG,IAAI,gDAAgD,CAAC;IACxD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAmC,CAAC;IAC9E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * search_legislation — Full-text search across Zimbabwean statute provisions.
3
+ */
4
+ import type Database from '@ansvar/mcp-sqlite';
5
+ import { type ToolResponse } from '../utils/metadata.js';
6
+ export interface SearchLegislationInput {
7
+ query: string;
8
+ document_id?: string;
9
+ status?: string;
10
+ as_of_date?: string;
11
+ limit?: number;
12
+ }
13
+ export interface SearchLegislationResult {
14
+ document_id: string;
15
+ document_title: string;
16
+ provision_ref: string;
17
+ chapter: string | null;
18
+ section: string;
19
+ title: string | null;
20
+ snippet: string;
21
+ relevance: number;
22
+ }
23
+ export declare function searchLegislation(db: InstanceType<typeof Database>, input: SearchLegislationInput): Promise<ToolResponse<SearchLegislationResult[]>>;
24
+ //# sourceMappingURL=search-legislation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-legislation.d.ts","sourceRoot":"","sources":["../../src/tools/search-legislation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAG/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,YAAY,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAmDlD"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * search_legislation — Full-text search across Zimbabwean statute provisions.
3
+ */
4
+ import { buildFtsQueryVariants, sanitizeFtsInput } from '../utils/fts-query.js';
5
+ import { generateResponseMetadata } from '../utils/metadata.js';
6
+ const DEFAULT_LIMIT = 10;
7
+ const MAX_LIMIT = 50;
8
+ export async function searchLegislation(db, input) {
9
+ if (!input.query || input.query.trim().length === 0) {
10
+ return { results: [], _metadata: generateResponseMetadata(db) };
11
+ }
12
+ const limit = Math.min(Math.max(input.limit ?? DEFAULT_LIMIT, 1), MAX_LIMIT);
13
+ const queryVariants = buildFtsQueryVariants(sanitizeFtsInput(input.query));
14
+ for (const ftsQuery of queryVariants) {
15
+ let sql = `
16
+ SELECT
17
+ lp.document_id,
18
+ ld.title as document_title,
19
+ lp.provision_ref,
20
+ lp.chapter,
21
+ lp.section,
22
+ lp.title,
23
+ snippet(provisions_fts, 0, '>>>', '<<<', '...', 32) as snippet,
24
+ bm25(provisions_fts) as relevance
25
+ FROM provisions_fts
26
+ JOIN legal_provisions lp ON lp.id = provisions_fts.rowid
27
+ JOIN legal_documents ld ON ld.id = lp.document_id
28
+ WHERE provisions_fts MATCH ?
29
+ `;
30
+ const params = [ftsQuery];
31
+ if (input.document_id) {
32
+ sql += ' AND lp.document_id = ?';
33
+ params.push(input.document_id);
34
+ }
35
+ if (input.status) {
36
+ sql += ' AND ld.status = ?';
37
+ params.push(input.status);
38
+ }
39
+ sql += ' ORDER BY relevance LIMIT ?';
40
+ params.push(limit);
41
+ try {
42
+ const rows = db.prepare(sql).all(...params);
43
+ if (rows.length > 0) {
44
+ return { results: rows, _metadata: generateResponseMetadata(db) };
45
+ }
46
+ }
47
+ catch {
48
+ // FTS query syntax error — try next variant
49
+ continue;
50
+ }
51
+ }
52
+ return { results: [], _metadata: generateResponseMetadata(db) };
53
+ }
54
+ //# sourceMappingURL=search-legislation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-legislation.js","sourceRoot":"","sources":["../../src/tools/search-legislation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAqBnF,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAiC,EACjC,KAA6B;IAE7B,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7E,MAAM,aAAa,GAAG,qBAAqB,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3E,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,GAAG,GAAG;;;;;;;;;;;;;;KAcT,CAAC;QACF,MAAM,MAAM,GAAwB,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,GAAG,IAAI,yBAAyB,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,GAAG,IAAI,oBAAoB,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,GAAG,IAAI,6BAA6B,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA8B,CAAC;YACzE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;YACpE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4CAA4C;YAC5C,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * validate_citation — Validate a Zimbabwean legal citation against the database.
3
+ *
4
+ * Supports citation formats:
5
+ * - "Section N, [Act Title Year]" (e.g., "Section 29, Cyber and Data Protection Act 2021")
6
+ * - "s N" shorthand (e.g., "s 29 CDPA")
7
+ * - "Chapter N:NN" (e.g., "Chapter 9:23")
8
+ * - "[Act Title], Section N"
9
+ */
10
+ import type Database from '@ansvar/mcp-sqlite';
11
+ import { type ToolResponse } from '../utils/metadata.js';
12
+ export interface ValidateCitationInput {
13
+ citation: string;
14
+ }
15
+ export interface ValidateCitationResult {
16
+ valid: boolean;
17
+ citation: string;
18
+ normalized?: string;
19
+ document_id?: string;
20
+ document_title?: string;
21
+ provision_ref?: string;
22
+ status?: string;
23
+ warnings: string[];
24
+ }
25
+ export declare function validateCitationTool(db: InstanceType<typeof Database>, input: ValidateCitationInput): Promise<ToolResponse<ValidateCitationResult>>;
26
+ //# sourceMappingURL=validate-citation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-citation.d.ts","sourceRoot":"","sources":["../../src/tools/validate-citation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA0CD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAkF/C"}