@ansvar/rwandan-law-mcp 1.0.0

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 (124) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +83 -0
  3. package/dist/__tests__/contract/golden.test.d.ts +9 -0
  4. package/dist/__tests__/contract/golden.test.d.ts.map +1 -0
  5. package/dist/__tests__/contract/golden.test.js +76 -0
  6. package/dist/__tests__/contract/golden.test.js.map +1 -0
  7. package/dist/api/health.d.ts +3 -0
  8. package/dist/api/health.d.ts.map +1 -0
  9. package/dist/api/health.js +101 -0
  10. package/dist/api/health.js.map +1 -0
  11. package/dist/api/mcp.d.ts +3 -0
  12. package/dist/api/mcp.d.ts.map +1 -0
  13. package/dist/api/mcp.js +119 -0
  14. package/dist/api/mcp.js.map +1 -0
  15. package/dist/scripts/build-db.d.ts +11 -0
  16. package/dist/scripts/build-db.d.ts.map +1 -0
  17. package/dist/scripts/build-db.js +375 -0
  18. package/dist/scripts/build-db.js.map +1 -0
  19. package/dist/scripts/drift-detect.d.ts +9 -0
  20. package/dist/scripts/drift-detect.d.ts.map +1 -0
  21. package/dist/scripts/drift-detect.js +62 -0
  22. package/dist/scripts/drift-detect.js.map +1 -0
  23. package/dist/scripts/ingest.d.ts +10 -0
  24. package/dist/scripts/ingest.d.ts.map +1 -0
  25. package/dist/scripts/ingest.js +333 -0
  26. package/dist/scripts/ingest.js.map +1 -0
  27. package/dist/scripts/lib/fetcher.d.ts +26 -0
  28. package/dist/scripts/lib/fetcher.d.ts.map +1 -0
  29. package/dist/scripts/lib/fetcher.js +102 -0
  30. package/dist/scripts/lib/fetcher.js.map +1 -0
  31. package/dist/scripts/lib/parser.d.ts +60 -0
  32. package/dist/scripts/lib/parser.d.ts.map +1 -0
  33. package/dist/scripts/lib/parser.js +560 -0
  34. package/dist/scripts/lib/parser.js.map +1 -0
  35. package/dist/scripts/lib/pdf.d.ts +7 -0
  36. package/dist/scripts/lib/pdf.d.ts.map +1 -0
  37. package/dist/scripts/lib/pdf.js +124 -0
  38. package/dist/scripts/lib/pdf.js.map +1 -0
  39. package/dist/src/capabilities.d.ts +16 -0
  40. package/dist/src/capabilities.d.ts.map +1 -0
  41. package/dist/src/capabilities.js +43 -0
  42. package/dist/src/capabilities.js.map +1 -0
  43. package/dist/src/constants.d.ts +7 -0
  44. package/dist/src/constants.d.ts.map +1 -0
  45. package/dist/src/constants.js +7 -0
  46. package/dist/src/constants.js.map +1 -0
  47. package/dist/src/index.d.ts +8 -0
  48. package/dist/src/index.d.ts.map +1 -0
  49. package/dist/src/index.js +80 -0
  50. package/dist/src/index.js.map +1 -0
  51. package/dist/src/tools/about.d.ts +45 -0
  52. package/dist/src/tools/about.d.ts.map +1 -0
  53. package/dist/src/tools/about.js +54 -0
  54. package/dist/src/tools/about.js.map +1 -0
  55. package/dist/src/tools/build-legal-stance.d.ts +21 -0
  56. package/dist/src/tools/build-legal-stance.d.ts.map +1 -0
  57. package/dist/src/tools/build-legal-stance.js +46 -0
  58. package/dist/src/tools/build-legal-stance.js.map +1 -0
  59. package/dist/src/tools/check-currency.d.ts +20 -0
  60. package/dist/src/tools/check-currency.d.ts.map +1 -0
  61. package/dist/src/tools/check-currency.js +41 -0
  62. package/dist/src/tools/check-currency.js.map +1 -0
  63. package/dist/src/tools/format-citation.d.ts +14 -0
  64. package/dist/src/tools/format-citation.d.ts.map +1 -0
  65. package/dist/src/tools/format-citation.js +28 -0
  66. package/dist/src/tools/format-citation.js.map +1 -0
  67. package/dist/src/tools/get-eu-basis.d.ts +21 -0
  68. package/dist/src/tools/get-eu-basis.d.ts.map +1 -0
  69. package/dist/src/tools/get-eu-basis.js +52 -0
  70. package/dist/src/tools/get-eu-basis.js.map +1 -0
  71. package/dist/src/tools/get-provision-eu-basis.d.ts +20 -0
  72. package/dist/src/tools/get-provision-eu-basis.d.ts.map +1 -0
  73. package/dist/src/tools/get-provision-eu-basis.js +45 -0
  74. package/dist/src/tools/get-provision-eu-basis.js.map +1 -0
  75. package/dist/src/tools/get-provision.d.ts +24 -0
  76. package/dist/src/tools/get-provision.d.ts.map +1 -0
  77. package/dist/src/tools/get-provision.js +80 -0
  78. package/dist/src/tools/get-provision.js.map +1 -0
  79. package/dist/src/tools/get-rwandan-implementations.d.ts +21 -0
  80. package/dist/src/tools/get-rwandan-implementations.d.ts.map +1 -0
  81. package/dist/src/tools/get-rwandan-implementations.js +42 -0
  82. package/dist/src/tools/get-rwandan-implementations.js.map +1 -0
  83. package/dist/src/tools/list-sources.d.ts +25 -0
  84. package/dist/src/tools/list-sources.d.ts.map +1 -0
  85. package/dist/src/tools/list-sources.js +41 -0
  86. package/dist/src/tools/list-sources.js.map +1 -0
  87. package/dist/src/tools/registry.d.ts +13 -0
  88. package/dist/src/tools/registry.d.ts.map +1 -0
  89. package/dist/src/tools/registry.js +365 -0
  90. package/dist/src/tools/registry.js.map +1 -0
  91. package/dist/src/tools/search-eu-implementations.d.ts +24 -0
  92. package/dist/src/tools/search-eu-implementations.d.ts.map +1 -0
  93. package/dist/src/tools/search-eu-implementations.js +58 -0
  94. package/dist/src/tools/search-eu-implementations.js.map +1 -0
  95. package/dist/src/tools/search-legislation.d.ts +24 -0
  96. package/dist/src/tools/search-legislation.d.ts.map +1 -0
  97. package/dist/src/tools/search-legislation.js +54 -0
  98. package/dist/src/tools/search-legislation.js.map +1 -0
  99. package/dist/src/tools/validate-citation.d.ts +20 -0
  100. package/dist/src/tools/validate-citation.d.ts.map +1 -0
  101. package/dist/src/tools/validate-citation.js +107 -0
  102. package/dist/src/tools/validate-citation.js.map +1 -0
  103. package/dist/src/tools/validate-eu-compliance.d.ts +20 -0
  104. package/dist/src/tools/validate-eu-compliance.d.ts.map +1 -0
  105. package/dist/src/tools/validate-eu-compliance.js +98 -0
  106. package/dist/src/tools/validate-eu-compliance.js.map +1 -0
  107. package/dist/src/utils/as-of-date.d.ts +9 -0
  108. package/dist/src/utils/as-of-date.d.ts.map +1 -0
  109. package/dist/src/utils/as-of-date.js +25 -0
  110. package/dist/src/utils/as-of-date.js.map +1 -0
  111. package/dist/src/utils/fts-query.d.ts +19 -0
  112. package/dist/src/utils/fts-query.d.ts.map +1 -0
  113. package/dist/src/utils/fts-query.js +47 -0
  114. package/dist/src/utils/fts-query.js.map +1 -0
  115. package/dist/src/utils/metadata.d.ts +16 -0
  116. package/dist/src/utils/metadata.d.ts.map +1 -0
  117. package/dist/src/utils/metadata.js +22 -0
  118. package/dist/src/utils/metadata.js.map +1 -0
  119. package/dist/src/utils/statute-id.d.ts +18 -0
  120. package/dist/src/utils/statute-id.d.ts.map +1 -0
  121. package/dist/src/utils/statute-id.js +34 -0
  122. package/dist/src/utils/statute-id.js.map +1 -0
  123. package/package.json +74 -0
  124. package/server.json +30 -0
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Tool registry for Rwandan 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 { getRwandanImplementations } from './get-rwandan-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 the Official Gazette of the Republic of Rwanda. ' +
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 Rwandan legal data this server covers.',
32
+ inputSchema: { type: 'object', properties: {} },
33
+ };
34
+ export const TOOLS = [
35
+ {
36
+ name: 'search_legislation',
37
+ description: 'Search Rwandan 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
+ 'Results are in English. 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
+ '"personal information" for exact phrase, privacy* 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 Rwandan statute. ' +
71
+ 'Specify a document_id (Act title, abbreviation, 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., "Privacy Act 1988"), abbreviations, and full titles. ' +
75
+ 'Use this when you know WHICH provision you want. For discovery, use search_legislation instead.',
76
+ inputSchema: {
77
+ type: 'object',
78
+ properties: {
79
+ document_id: {
80
+ type: 'string',
81
+ description: 'Statute identifier: Act title (e.g., "Privacy Act 1988"), abbreviation, ' +
82
+ 'or internal document ID (e.g., "privacy-act-1988").',
83
+ },
84
+ section: {
85
+ type: 'string',
86
+ description: 'Section number (e.g., "13", "8"). Omit to get all provisions.',
87
+ },
88
+ provision_ref: {
89
+ type: 'string',
90
+ description: 'Direct provision reference (e.g., "s13"). Alternative to section parameter.',
91
+ },
92
+ },
93
+ required: ['document_id'],
94
+ },
95
+ },
96
+ {
97
+ name: 'validate_citation',
98
+ description: 'Validate a Rwandan legal citation against the database — zero-hallucination check. ' +
99
+ 'Parses the citation, checks that the document and provision exist, and returns warnings about status ' +
100
+ '(repealed, amended). Use this to verify any citation BEFORE including it in a legal analysis. ' +
101
+ 'Supports formats: "Section 13 Privacy Act 1988", "Privacy Act 1988 s 13", "s 13".',
102
+ inputSchema: {
103
+ type: 'object',
104
+ properties: {
105
+ citation: {
106
+ type: 'string',
107
+ description: 'Citation string to validate. Examples: "Section 13 Privacy Act 1988", "Privacy Act 1988 s 13".',
108
+ },
109
+ },
110
+ required: ['citation'],
111
+ },
112
+ },
113
+ {
114
+ name: 'build_legal_stance',
115
+ description: 'Build a comprehensive set of citations for a legal question by searching across all Rwandan statutes simultaneously. ' +
116
+ 'Returns aggregated results from multiple relevant provisions, useful for legal research on a topic. ' +
117
+ 'Use this for broad legal questions like "What are the penalties for data breaches in Rwandan?" ' +
118
+ 'rather than looking up a specific known provision.',
119
+ inputSchema: {
120
+ type: 'object',
121
+ properties: {
122
+ query: {
123
+ type: 'string',
124
+ description: 'Legal question or topic to research (e.g., "personal information", "critical infrastructure").',
125
+ },
126
+ document_id: {
127
+ type: 'string',
128
+ description: 'Optional: limit search to one statute by document ID.',
129
+ },
130
+ limit: {
131
+ type: 'number',
132
+ description: 'Max results per category (default: 5, max: 20).',
133
+ default: 5,
134
+ },
135
+ },
136
+ required: ['query'],
137
+ },
138
+ },
139
+ {
140
+ name: 'format_citation',
141
+ description: 'Format a Rwandan legal citation per standard conventions. ' +
142
+ 'Three formats: "full" (formal, e.g., "Section 13, Privacy Act 1988"), ' +
143
+ '"short" (abbreviated, e.g., "Privacy Act 1988 s 13"), "pinpoint" (section reference only, e.g., "s 13").',
144
+ inputSchema: {
145
+ type: 'object',
146
+ properties: {
147
+ citation: { type: 'string', description: 'Citation string to format.' },
148
+ format: {
149
+ type: 'string',
150
+ enum: ['full', 'short', 'pinpoint'],
151
+ description: 'Output format (default: "full").',
152
+ default: 'full',
153
+ },
154
+ },
155
+ required: ['citation'],
156
+ },
157
+ },
158
+ {
159
+ name: 'check_currency',
160
+ description: 'Check whether a Rwandan statute or provision is currently in force, amended, repealed, or not yet in force. ' +
161
+ 'Returns the document status, issued date, in-force date, and warnings. ' +
162
+ 'Essential before citing any provision — always verify currency.',
163
+ inputSchema: {
164
+ type: 'object',
165
+ properties: {
166
+ document_id: {
167
+ type: 'string',
168
+ description: 'Statute identifier (Act title, abbreviation, or ID).',
169
+ },
170
+ provision_ref: {
171
+ type: 'string',
172
+ description: 'Optional: provision reference to check a specific section.',
173
+ },
174
+ },
175
+ required: ['document_id'],
176
+ },
177
+ },
178
+ {
179
+ name: 'get_eu_basis',
180
+ description: 'Get international legal instruments that a Rwandan statute references or aligns with. ' +
181
+ 'Rwandan laws may reference international standards and conventions ' +
182
+ 'where applicable. ' +
183
+ 'Returns EU document identifiers, reference types, and implementation status.',
184
+ inputSchema: {
185
+ type: 'object',
186
+ properties: {
187
+ document_id: { type: 'string', description: 'Rwandan statute identifier.' },
188
+ include_articles: {
189
+ type: 'boolean',
190
+ description: 'Include specific EU article references (default: false).',
191
+ default: false,
192
+ },
193
+ },
194
+ required: ['document_id'],
195
+ },
196
+ },
197
+ {
198
+ name: 'get_rwandan_implementations',
199
+ description: 'Find all Rwandan statutes that reference or align with a specific EU directive or regulation. ' +
200
+ 'Given an EU document ID (e.g., "regulation:2016/679" for GDPR), returns matching Rwandan statutes. ' +
201
+ 'Rwandan may reference international legal instruments where relevant.',
202
+ inputSchema: {
203
+ type: 'object',
204
+ properties: {
205
+ eu_document_id: {
206
+ type: 'string',
207
+ description: 'EU document ID (e.g., "regulation:2016/679" for GDPR, "directive:2022/2555" for NIS2).',
208
+ },
209
+ primary_only: {
210
+ type: 'boolean',
211
+ description: 'Return only primary referencing statutes (default: false).',
212
+ default: false,
213
+ },
214
+ in_force_only: {
215
+ type: 'boolean',
216
+ description: 'Return only currently in-force statutes (default: false).',
217
+ default: false,
218
+ },
219
+ },
220
+ required: ['eu_document_id'],
221
+ },
222
+ },
223
+ {
224
+ name: 'search_eu_implementations',
225
+ description: 'Search for EU directives and regulations that are referenced by Rwandan legislation. ' +
226
+ 'Search by keyword, type (directive/regulation), or year range.',
227
+ inputSchema: {
228
+ type: 'object',
229
+ properties: {
230
+ query: { type: 'string', description: 'Keyword search across EU document titles.' },
231
+ type: { type: 'string', enum: ['directive', 'regulation'], description: 'Filter by EU document type.' },
232
+ year_from: { type: 'number', description: 'Filter by year (from).' },
233
+ year_to: { type: 'number', description: 'Filter by year (to).' },
234
+ has_rwandan_implementation: {
235
+ type: 'boolean',
236
+ description: 'If true, only return EU documents referenced by Rwandan legislation.',
237
+ },
238
+ limit: { type: 'number', description: 'Max results (default: 20, max: 100).', default: 20 },
239
+ },
240
+ },
241
+ },
242
+ {
243
+ name: 'get_provision_eu_basis',
244
+ description: 'Get the EU legal basis for a SPECIFIC provision within a Rwandan statute. ' +
245
+ 'More granular than get_eu_basis (which operates at the statute level). ' +
246
+ 'Use this for pinpoint EU alignment checks at the provision level.',
247
+ inputSchema: {
248
+ type: 'object',
249
+ properties: {
250
+ document_id: { type: 'string', description: 'Rwandan statute identifier.' },
251
+ provision_ref: { type: 'string', description: 'Provision reference (e.g., "s13" or "13").' },
252
+ },
253
+ required: ['document_id', 'provision_ref'],
254
+ },
255
+ },
256
+ {
257
+ name: 'validate_eu_compliance',
258
+ description: 'Check EU alignment status for a Rwandan statute or provision. ' +
259
+ 'Detects references to EU directives, alignment status, and cross-references. ' +
260
+ 'Returns compliance status (compliant, partial, unclear, not_applicable) with warnings. ' +
261
+ 'Rwanda is not an EU Member State; this tool only reports explicit EU references present in statute text.',
262
+ inputSchema: {
263
+ type: 'object',
264
+ properties: {
265
+ document_id: { type: 'string', description: 'Rwandan 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 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_rwandan_implementations':
321
+ result = await getRwandanImplementations(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,24 @@
1
+ /**
2
+ * search_eu_implementations — Search EU directives/regulations referenced by Rwandan legislation.
3
+ */
4
+ import type Database from '@ansvar/mcp-sqlite';
5
+ import { type ToolResponse } from '../utils/metadata.js';
6
+ export interface SearchEUImplementationsInput {
7
+ query?: string;
8
+ type?: 'directive' | 'regulation';
9
+ year_from?: number;
10
+ year_to?: number;
11
+ has_rwandan_implementation?: boolean;
12
+ limit?: number;
13
+ }
14
+ export interface EUImplementationSearchResult {
15
+ eu_document_id: string;
16
+ type: string;
17
+ year: number;
18
+ number: number;
19
+ title: string | null;
20
+ short_name: string | null;
21
+ rwandan_statute_count: number;
22
+ }
23
+ export declare function searchEUImplementations(db: InstanceType<typeof Database>, input: SearchEUImplementationsInput): Promise<ToolResponse<EUImplementationSearchResult[]>>;
24
+ //# 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;;GAEG;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,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,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,qBAAqB,EAAE,MAAM,CAAC;CAC/B;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,58 @@
1
+ /**
2
+ * search_eu_implementations — Search EU directives/regulations referenced by Rwandan legislation.
3
+ */
4
+ import { generateResponseMetadata } from '../utils/metadata.js';
5
+ export async function searchEUImplementations(db, input) {
6
+ try {
7
+ db.prepare('SELECT 1 FROM eu_documents LIMIT 1').get();
8
+ }
9
+ catch {
10
+ return {
11
+ results: [],
12
+ _metadata: {
13
+ ...generateResponseMetadata(db),
14
+ ...{ note: 'EU documents not available in this database tier' },
15
+ },
16
+ };
17
+ }
18
+ const limit = Math.min(Math.max(input.limit ?? 20, 1), 100);
19
+ let sql = `
20
+ SELECT
21
+ ed.id as eu_document_id,
22
+ ed.type,
23
+ ed.year,
24
+ ed.number,
25
+ ed.title,
26
+ ed.short_name,
27
+ COUNT(DISTINCT er.document_id) as rwandan_statute_count
28
+ FROM eu_documents ed
29
+ LEFT JOIN eu_references er ON er.eu_document_id = ed.id
30
+ WHERE 1=1
31
+ `;
32
+ const params = [];
33
+ if (input.query) {
34
+ sql += ' AND (ed.title LIKE ? OR ed.short_name LIKE ? OR ed.description LIKE ?)';
35
+ params.push(`%${input.query}%`, `%${input.query}%`, `%${input.query}%`);
36
+ }
37
+ if (input.type) {
38
+ sql += ' AND ed.type = ?';
39
+ params.push(input.type);
40
+ }
41
+ if (input.year_from) {
42
+ sql += ' AND ed.year >= ?';
43
+ params.push(input.year_from);
44
+ }
45
+ if (input.year_to) {
46
+ sql += ' AND ed.year <= ?';
47
+ params.push(input.year_to);
48
+ }
49
+ sql += ' GROUP BY ed.id';
50
+ if (input.has_rwandan_implementation) {
51
+ sql += ' HAVING rwandan_statute_count > 0';
52
+ }
53
+ sql += ' ORDER BY ed.year DESC, ed.number DESC LIMIT ?';
54
+ params.push(limit);
55
+ const rows = db.prepare(sql).all(...params);
56
+ return { results: rows, _metadata: generateResponseMetadata(db) };
57
+ }
58
+ //# 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;;GAEG;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,kDAAkD,EAAE;aAChE;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,0BAA0B,EAAE,CAAC;QACrC,GAAG,IAAI,mCAAmC,CAAC;IAC7C,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 Rwandan 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 Rwandan 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,20 @@
1
+ /**
2
+ * validate_citation — Validate an Rwandan legal citation against the database.
3
+ */
4
+ import type Database from '@ansvar/mcp-sqlite';
5
+ import { type ToolResponse } from '../utils/metadata.js';
6
+ export interface ValidateCitationInput {
7
+ citation: string;
8
+ }
9
+ export interface ValidateCitationResult {
10
+ valid: boolean;
11
+ citation: string;
12
+ normalized?: string;
13
+ document_id?: string;
14
+ document_title?: string;
15
+ provision_ref?: string;
16
+ status?: string;
17
+ warnings: string[];
18
+ }
19
+ export declare function validateCitationTool(db: InstanceType<typeof Database>, input: ValidateCitationInput): Promise<ToolResponse<ValidateCitationResult>>;
20
+ //# 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;;GAEG;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"}