@ansvar/uae-law-mcp 1.1.2

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 (91) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +359 -0
  3. package/data/database.db +0 -0
  4. package/dist/capabilities.d.ts +16 -0
  5. package/dist/capabilities.d.ts.map +1 -0
  6. package/dist/capabilities.js +43 -0
  7. package/dist/capabilities.js.map +1 -0
  8. package/dist/constants.d.ts +7 -0
  9. package/dist/constants.d.ts.map +1 -0
  10. package/dist/constants.js +7 -0
  11. package/dist/constants.js.map +1 -0
  12. package/dist/index.d.ts +8 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +80 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/tools/about.d.ts +40 -0
  17. package/dist/tools/about.d.ts.map +1 -0
  18. package/dist/tools/about.js +72 -0
  19. package/dist/tools/about.js.map +1 -0
  20. package/dist/tools/build-legal-stance.d.ts +24 -0
  21. package/dist/tools/build-legal-stance.d.ts.map +1 -0
  22. package/dist/tools/build-legal-stance.js +52 -0
  23. package/dist/tools/build-legal-stance.js.map +1 -0
  24. package/dist/tools/check-currency.d.ts +22 -0
  25. package/dist/tools/check-currency.d.ts.map +1 -0
  26. package/dist/tools/check-currency.js +44 -0
  27. package/dist/tools/check-currency.js.map +1 -0
  28. package/dist/tools/format-citation.d.ts +19 -0
  29. package/dist/tools/format-citation.d.ts.map +1 -0
  30. package/dist/tools/format-citation.js +38 -0
  31. package/dist/tools/format-citation.js.map +1 -0
  32. package/dist/tools/get-eu-basis.d.ts +26 -0
  33. package/dist/tools/get-eu-basis.d.ts.map +1 -0
  34. package/dist/tools/get-eu-basis.js +57 -0
  35. package/dist/tools/get-eu-basis.js.map +1 -0
  36. package/dist/tools/get-provision-eu-basis.d.ts +21 -0
  37. package/dist/tools/get-provision-eu-basis.d.ts.map +1 -0
  38. package/dist/tools/get-provision-eu-basis.js +46 -0
  39. package/dist/tools/get-provision-eu-basis.js.map +1 -0
  40. package/dist/tools/get-provision.d.ts +27 -0
  41. package/dist/tools/get-provision.d.ts.map +1 -0
  42. package/dist/tools/get-provision.js +88 -0
  43. package/dist/tools/get-provision.js.map +1 -0
  44. package/dist/tools/get-uae-implementations.d.ts +29 -0
  45. package/dist/tools/get-uae-implementations.d.ts.map +1 -0
  46. package/dist/tools/get-uae-implementations.js +50 -0
  47. package/dist/tools/get-uae-implementations.js.map +1 -0
  48. package/dist/tools/list-sources.d.ts +26 -0
  49. package/dist/tools/list-sources.d.ts.map +1 -0
  50. package/dist/tools/list-sources.js +63 -0
  51. package/dist/tools/list-sources.js.map +1 -0
  52. package/dist/tools/registry.d.ts +13 -0
  53. package/dist/tools/registry.d.ts.map +1 -0
  54. package/dist/tools/registry.js +387 -0
  55. package/dist/tools/registry.js.map +1 -0
  56. package/dist/tools/search-eu-implementations.d.ts +25 -0
  57. package/dist/tools/search-eu-implementations.d.ts.map +1 -0
  58. package/dist/tools/search-eu-implementations.js +59 -0
  59. package/dist/tools/search-eu-implementations.js.map +1 -0
  60. package/dist/tools/search-legislation.d.ts +27 -0
  61. package/dist/tools/search-legislation.d.ts.map +1 -0
  62. package/dist/tools/search-legislation.js +60 -0
  63. package/dist/tools/search-legislation.js.map +1 -0
  64. package/dist/tools/validate-citation.d.ts +29 -0
  65. package/dist/tools/validate-citation.d.ts.map +1 -0
  66. package/dist/tools/validate-citation.js +129 -0
  67. package/dist/tools/validate-citation.js.map +1 -0
  68. package/dist/tools/validate-eu-compliance.d.ts +22 -0
  69. package/dist/tools/validate-eu-compliance.d.ts.map +1 -0
  70. package/dist/tools/validate-eu-compliance.js +103 -0
  71. package/dist/tools/validate-eu-compliance.js.map +1 -0
  72. package/dist/utils/as-of-date.d.ts +9 -0
  73. package/dist/utils/as-of-date.d.ts.map +1 -0
  74. package/dist/utils/as-of-date.js +25 -0
  75. package/dist/utils/as-of-date.js.map +1 -0
  76. package/dist/utils/fts-query.d.ts +21 -0
  77. package/dist/utils/fts-query.d.ts.map +1 -0
  78. package/dist/utils/fts-query.js +49 -0
  79. package/dist/utils/fts-query.js.map +1 -0
  80. package/dist/utils/metadata.d.ts +16 -0
  81. package/dist/utils/metadata.d.ts.map +1 -0
  82. package/dist/utils/metadata.js +25 -0
  83. package/dist/utils/metadata.js.map +1 -0
  84. package/dist/utils/statute-id.d.ts +21 -0
  85. package/dist/utils/statute-id.d.ts.map +1 -0
  86. package/dist/utils/statute-id.js +51 -0
  87. package/dist/utils/statute-id.js.map +1 -0
  88. package/fixtures/golden-hashes.json +56 -0
  89. package/fixtures/golden-tests.json +180 -0
  90. package/package.json +80 -0
  91. package/sources.yml +100 -0
package/dist/index.js ADDED
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * UAE Law MCP Server — stdio entry point.
4
+ *
5
+ * Provides UAE legislation search (federal + DIFC + ADGM) via Model Context Protocol.
6
+ */
7
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
+ import Database from '@ansvar/mcp-sqlite';
10
+ import { join, dirname } from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ import { createHash } from 'crypto';
13
+ import { readFileSync } from 'fs';
14
+ import { registerTools } from './tools/registry.js';
15
+ import { detectCapabilities, readDbMetadata } from './capabilities.js';
16
+ import { DB_ENV_VAR, SERVER_NAME, SERVER_VERSION, } from './constants.js';
17
+ const __dirname = dirname(fileURLToPath(import.meta.url));
18
+ function resolveDbPath() {
19
+ if (process.env[DB_ENV_VAR]) {
20
+ return process.env[DB_ENV_VAR];
21
+ }
22
+ return join(__dirname, '..', 'data', 'database.db');
23
+ }
24
+ let db = null;
25
+ function getDb() {
26
+ if (!db) {
27
+ const dbPath = resolveDbPath();
28
+ db = new Database(dbPath, { readonly: true });
29
+ db.pragma('foreign_keys = ON');
30
+ const caps = detectCapabilities(db);
31
+ const meta = readDbMetadata(db);
32
+ console.error(`[${SERVER_NAME}] DB opened: tier=${meta.tier}, caps=[${[...caps].join(',')}]`);
33
+ }
34
+ return db;
35
+ }
36
+ function computeAboutContext() {
37
+ const dbPath = resolveDbPath();
38
+ let fingerprint = 'unknown';
39
+ let dbBuilt = 'unknown';
40
+ try {
41
+ const buf = readFileSync(dbPath);
42
+ fingerprint = createHash('sha256').update(buf).digest('hex').slice(0, 12);
43
+ }
44
+ catch {
45
+ // DB might not exist in dev
46
+ }
47
+ try {
48
+ const database = getDb();
49
+ const row = database.prepare("SELECT value FROM db_metadata WHERE key = 'built_at'").get();
50
+ if (row)
51
+ dbBuilt = row.value;
52
+ }
53
+ catch {
54
+ // Ignore
55
+ }
56
+ return { version: SERVER_VERSION, fingerprint, dbBuilt };
57
+ }
58
+ async function main() {
59
+ const database = getDb();
60
+ const aboutContext = computeAboutContext();
61
+ const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {} } });
62
+ registerTools(server, database, aboutContext);
63
+ const transport = new StdioServerTransport();
64
+ await server.connect(transport);
65
+ console.error(`[${SERVER_NAME}] Server running on stdio`);
66
+ const cleanup = () => {
67
+ if (db) {
68
+ db.close();
69
+ db = null;
70
+ }
71
+ process.exit(0);
72
+ };
73
+ process.on('SIGINT', cleanup);
74
+ process.on('SIGTERM', cleanup);
75
+ }
76
+ main().catch((err) => {
77
+ console.error(`[${SERVER_NAME}] Fatal error:`, err);
78
+ process.exit(1);
79
+ });
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * about — Server metadata, dataset statistics, and provenance.
3
+ */
4
+ import type Database from '@ansvar/mcp-sqlite';
5
+ export interface AboutContext {
6
+ version: string;
7
+ fingerprint: string;
8
+ dbBuilt: string;
9
+ }
10
+ export declare function getAbout(db: InstanceType<typeof Database>, context: AboutContext): {
11
+ server: string;
12
+ version: string;
13
+ repository: string;
14
+ jurisdiction: string;
15
+ legal_system_note: string;
16
+ database: {
17
+ fingerprint: string;
18
+ built_at: string;
19
+ tier: string;
20
+ schema_version: string;
21
+ capabilities: import("../capabilities.js").Capability[];
22
+ };
23
+ statistics: {
24
+ documents: number;
25
+ provisions: number;
26
+ definitions: number;
27
+ eu_documents: number;
28
+ eu_references: number;
29
+ };
30
+ data_sources: {
31
+ name: string;
32
+ authority: string;
33
+ url: string;
34
+ license: string;
35
+ jurisdiction: string;
36
+ languages: string[];
37
+ legal_zone: string;
38
+ }[];
39
+ };
40
+ //# sourceMappingURL=about.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.d.ts","sourceRoot":"","sources":["../../src/tools/about.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAI/C,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAWD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0DhF"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * about — Server metadata, dataset statistics, and provenance.
3
+ */
4
+ import { detectCapabilities, readDbMetadata } from '../capabilities.js';
5
+ import { SERVER_NAME, REPOSITORY_URL } from '../constants.js';
6
+ function safeCount(db, sql) {
7
+ try {
8
+ const row = db.prepare(sql).get();
9
+ return row ? Number(row.count) : 0;
10
+ }
11
+ catch {
12
+ return 0;
13
+ }
14
+ }
15
+ export function getAbout(db, context) {
16
+ const caps = detectCapabilities(db);
17
+ const meta = readDbMetadata(db);
18
+ return {
19
+ server: SERVER_NAME,
20
+ version: context.version,
21
+ repository: REPOSITORY_URL,
22
+ jurisdiction: 'United Arab Emirates (AE)',
23
+ legal_system_note: 'The UAE has a THREE-LAYER legal system: (1) Federal law applies across all emirates, ' +
24
+ '(2) DIFC (Dubai International Financial Centre) is an independent common-law jurisdiction within Dubai, ' +
25
+ '(3) ADGM (Abu Dhabi Global Market) is an independent common-law jurisdiction within Abu Dhabi. ' +
26
+ 'Federal law uses Arabic as the authoritative language; DIFC and ADGM laws are drafted natively in English.',
27
+ database: {
28
+ fingerprint: context.fingerprint,
29
+ built_at: context.dbBuilt,
30
+ tier: meta.tier,
31
+ schema_version: meta.schema_version,
32
+ capabilities: [...caps],
33
+ },
34
+ statistics: {
35
+ documents: safeCount(db, 'SELECT COUNT(*) as count FROM legal_documents'),
36
+ provisions: safeCount(db, 'SELECT COUNT(*) as count FROM legal_provisions'),
37
+ definitions: safeCount(db, 'SELECT COUNT(*) as count FROM definitions'),
38
+ eu_documents: safeCount(db, 'SELECT COUNT(*) as count FROM eu_documents'),
39
+ eu_references: safeCount(db, 'SELECT COUNT(*) as count FROM eu_references'),
40
+ },
41
+ data_sources: [
42
+ {
43
+ name: 'UAE Ministry of Justice',
44
+ authority: 'Ministry of Justice, United Arab Emirates',
45
+ url: 'https://moj.gov.ae',
46
+ license: 'Government Open Data',
47
+ jurisdiction: 'AE (Federal)',
48
+ languages: ['ar', 'en'],
49
+ legal_zone: 'federal',
50
+ },
51
+ {
52
+ name: 'DIFC Laws and Regulations',
53
+ authority: 'Dubai International Financial Centre (DIFC)',
54
+ url: 'https://difclaws.com',
55
+ license: 'Government Open Data',
56
+ jurisdiction: 'AE-DU (DIFC)',
57
+ languages: ['en'],
58
+ legal_zone: 'difc',
59
+ },
60
+ {
61
+ name: 'ADGM Legal Framework',
62
+ authority: 'Abu Dhabi Global Market (ADGM)',
63
+ url: 'https://adgm.com/legal-framework',
64
+ license: 'Government Open Data',
65
+ jurisdiction: 'AE-AZ (ADGM)',
66
+ languages: ['en'],
67
+ legal_zone: 'adgm',
68
+ },
69
+ ],
70
+ };
71
+ }
72
+ //# sourceMappingURL=about.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/tools/about.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAkB,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAQ9E,SAAS,SAAS,CAAC,EAAiC,EAAE,GAAW;IAC/D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAmC,CAAC;QACnE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAiC,EAAE,OAAqB;IAC/E,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IAEhC,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,2BAA2B;QACzC,iBAAiB,EACf,uFAAuF;YACvF,0GAA0G;YAC1G,iGAAiG;YACjG,4GAA4G;QAC9G,QAAQ,EAAE;YACR,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC;SACxB;QACD,UAAU,EAAE;YACV,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,+CAA+C,CAAC;YACzE,UAAU,EAAE,SAAS,CAAC,EAAE,EAAE,gDAAgD,CAAC;YAC3E,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,2CAA2C,CAAC;YACvE,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,4CAA4C,CAAC;YACzE,aAAa,EAAE,SAAS,CAAC,EAAE,EAAE,6CAA6C,CAAC;SAC5E;QACD,YAAY,EAAE;YACZ;gBACE,IAAI,EAAE,yBAAyB;gBAC/B,SAAS,EAAE,2CAA2C;gBACtD,GAAG,EAAE,oBAAoB;gBACzB,OAAO,EAAE,sBAAsB;gBAC/B,YAAY,EAAE,cAAc;gBAC5B,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;gBACvB,UAAU,EAAE,SAAS;aACtB;YACD;gBACE,IAAI,EAAE,2BAA2B;gBACjC,SAAS,EAAE,6CAA6C;gBACxD,GAAG,EAAE,sBAAsB;gBAC3B,OAAO,EAAE,sBAAsB;gBAC/B,YAAY,EAAE,cAAc;gBAC5B,SAAS,EAAE,CAAC,IAAI,CAAC;gBACjB,UAAU,EAAE,MAAM;aACnB;YACD;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,SAAS,EAAE,gCAAgC;gBAC3C,GAAG,EAAE,kCAAkC;gBACvC,OAAO,EAAE,sBAAsB;gBAC/B,YAAY,EAAE,cAAc;gBAC5B,SAAS,EAAE,CAAC,IAAI,CAAC;gBACjB,UAAU,EAAE,MAAM;aACnB;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * build_legal_stance — Build a comprehensive set of citations for a legal question
3
+ * across UAE federal, DIFC, and ADGM legislation.
4
+ */
5
+ import type Database from '@ansvar/mcp-sqlite';
6
+ import { type ToolResponse } from '../utils/metadata.js';
7
+ export interface BuildLegalStanceInput {
8
+ query: string;
9
+ document_id?: string;
10
+ legal_zone?: string;
11
+ limit?: number;
12
+ }
13
+ export interface LegalStanceResult {
14
+ document_id: string;
15
+ document_title: string;
16
+ provision_ref: string;
17
+ section: string;
18
+ title: string | null;
19
+ snippet: string;
20
+ relevance: number;
21
+ legal_zone?: string;
22
+ }
23
+ export declare function buildLegalStance(db: InstanceType<typeof Database>, input: BuildLegalStanceInput): Promise<ToolResponse<LegalStanceResult[]>>;
24
+ //# sourceMappingURL=build-legal-stance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-legal-stance.d.ts","sourceRoot":"","sources":["../../src/tools/build-legal-stance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAkD5C"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * build_legal_stance — Build a comprehensive set of citations for a legal question
3
+ * across UAE federal, DIFC, and ADGM legislation.
4
+ */
5
+ import { buildFtsQueryVariants, sanitizeFtsInput } from '../utils/fts-query.js';
6
+ import { generateResponseMetadata } from '../utils/metadata.js';
7
+ export async function buildLegalStance(db, input) {
8
+ if (!input.query || input.query.trim().length === 0) {
9
+ return { results: [], _metadata: generateResponseMetadata(db) };
10
+ }
11
+ const limit = Math.min(Math.max(input.limit ?? 5, 1), 20);
12
+ const queryVariants = buildFtsQueryVariants(sanitizeFtsInput(input.query));
13
+ for (const ftsQuery of queryVariants) {
14
+ let sql = `
15
+ SELECT
16
+ lp.document_id,
17
+ ld.title as document_title,
18
+ lp.provision_ref,
19
+ lp.section,
20
+ lp.title,
21
+ snippet(provisions_fts, 0, '>>>', '<<<', '...', 48) as snippet,
22
+ bm25(provisions_fts) as relevance,
23
+ ld.legal_zone
24
+ FROM provisions_fts
25
+ JOIN legal_provisions lp ON lp.id = provisions_fts.rowid
26
+ JOIN legal_documents ld ON ld.id = lp.document_id
27
+ WHERE provisions_fts MATCH ?
28
+ `;
29
+ const params = [ftsQuery];
30
+ if (input.document_id) {
31
+ sql += ' AND lp.document_id = ?';
32
+ params.push(input.document_id);
33
+ }
34
+ if (input.legal_zone) {
35
+ sql += ' AND ld.legal_zone = ?';
36
+ params.push(input.legal_zone);
37
+ }
38
+ sql += ' ORDER BY relevance LIMIT ?';
39
+ params.push(limit);
40
+ try {
41
+ const rows = db.prepare(sql).all(...params);
42
+ if (rows.length > 0) {
43
+ return { results: rows, _metadata: generateResponseMetadata(db) };
44
+ }
45
+ }
46
+ catch {
47
+ continue;
48
+ }
49
+ }
50
+ return { results: [], _metadata: generateResponseMetadata(db) };
51
+ }
52
+ //# sourceMappingURL=build-legal-stance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-legal-stance.js","sourceRoot":"","sources":["../../src/tools/build-legal-stance.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAoBnF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAiC,EACjC,KAA4B;IAE5B,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,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1D,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,UAAU,EAAE,CAAC;YACrB,GAAG,IAAI,wBAAwB,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAChC,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,CAAwB,CAAC;YACnE,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,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,22 @@
1
+ /**
2
+ * check_currency — Check whether a UAE law, DIFC law, or ADGM regulation
3
+ * is currently in force.
4
+ */
5
+ import type Database from '@ansvar/mcp-sqlite';
6
+ import { type ToolResponse } from '../utils/metadata.js';
7
+ export interface CheckCurrencyInput {
8
+ document_id: string;
9
+ provision_ref?: string;
10
+ as_of_date?: string;
11
+ }
12
+ export interface CheckCurrencyResult {
13
+ document_id: string;
14
+ title: string;
15
+ status: string;
16
+ issued_date: string | null;
17
+ in_force_date: string | null;
18
+ legal_zone: string | null;
19
+ warnings: string[];
20
+ }
21
+ export declare function checkCurrency(db: InstanceType<typeof Database>, input: CheckCurrencyInput): Promise<ToolResponse<CheckCurrencyResult>>;
22
+ //# sourceMappingURL=check-currency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-currency.d.ts","sourceRoot":"","sources":["../../src/tools/check-currency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CA+C5C"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * check_currency — Check whether a UAE law, DIFC law, or ADGM regulation
3
+ * is currently in force.
4
+ */
5
+ import { resolveDocumentId } from '../utils/statute-id.js';
6
+ import { generateResponseMetadata } from '../utils/metadata.js';
7
+ export async function checkCurrency(db, input) {
8
+ const resolvedId = resolveDocumentId(db, input.document_id);
9
+ if (!resolvedId) {
10
+ return {
11
+ results: {
12
+ document_id: input.document_id,
13
+ title: 'Unknown',
14
+ status: 'not_found',
15
+ issued_date: null,
16
+ in_force_date: null,
17
+ legal_zone: null,
18
+ warnings: [`Document not found: "${input.document_id}"`],
19
+ },
20
+ _metadata: generateResponseMetadata(db),
21
+ };
22
+ }
23
+ const doc = db.prepare('SELECT id, title, status, issued_date, in_force_date, legal_zone FROM legal_documents WHERE id = ?').get(resolvedId);
24
+ const warnings = [];
25
+ if (doc.status === 'repealed') {
26
+ warnings.push('This law has been repealed and is no longer in force.');
27
+ }
28
+ else if (doc.status === 'not_yet_in_force') {
29
+ warnings.push('This law has not yet entered into force.');
30
+ }
31
+ return {
32
+ results: {
33
+ document_id: doc.id,
34
+ title: doc.title,
35
+ status: doc.status,
36
+ issued_date: doc.issued_date,
37
+ in_force_date: doc.in_force_date,
38
+ legal_zone: doc.legal_zone,
39
+ warnings,
40
+ },
41
+ _metadata: generateResponseMetadata(db),
42
+ };
43
+ }
44
+ //# sourceMappingURL=check-currency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-currency.js","sourceRoot":"","sources":["../../src/tools/check-currency.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAkBnF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,EAAiC,EACjC,KAAyB;IAEzB,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE;gBACP,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,WAAW;gBACnB,WAAW,EAAE,IAAI;gBACjB,aAAa,EAAE,IAAI;gBACnB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,CAAC,wBAAwB,KAAK,CAAC,WAAW,GAAG,CAAC;aACzD;YACD,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC;SACxC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,oGAAoG,CACrG,CAAC,GAAG,CAAC,UAAU,CAOf,CAAC;IAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IACzE,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP,WAAW,EAAE,GAAG,CAAC,EAAE;YACnB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,QAAQ;SACT;QACD,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * format_citation — Format a UAE legal citation per standard conventions.
3
+ *
4
+ * Supports three formats for all three legal zones:
5
+ * - Federal: "Article N, Federal Decree-Law No. X of Year on Title"
6
+ * - DIFC: "Article N, DIFC Law No. X of Year (Title)"
7
+ * - ADGM: "Section N, ADGM [Title] Regulations Year"
8
+ */
9
+ export interface FormatCitationInput {
10
+ citation: string;
11
+ format?: 'full' | 'short' | 'pinpoint';
12
+ }
13
+ export interface FormatCitationResult {
14
+ original: string;
15
+ formatted: string;
16
+ format: string;
17
+ }
18
+ export declare function formatCitationTool(input: FormatCitationInput): Promise<FormatCitationResult>;
19
+ //# sourceMappingURL=format-citation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-citation.d.ts","sourceRoot":"","sources":["../../src/tools/format-citation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;CACxC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CAiC/B"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * format_citation — Format a UAE legal citation per standard conventions.
3
+ *
4
+ * Supports three formats for all three legal zones:
5
+ * - Federal: "Article N, Federal Decree-Law No. X of Year on Title"
6
+ * - DIFC: "Article N, DIFC Law No. X of Year (Title)"
7
+ * - ADGM: "Section N, ADGM [Title] Regulations Year"
8
+ */
9
+ export async function formatCitationTool(input) {
10
+ const format = input.format ?? 'full';
11
+ const trimmed = input.citation.trim();
12
+ // Parse "Article N <law>" or "Art. N <law>" or "<law>, Article N"
13
+ const artFirst = trimmed.match(/^(?:Article|Art\.?|المادة)\s*(\d+[A-Za-z]*)\s*[,;]?\s+(.+)$/i);
14
+ const artLast = trimmed.match(/^(.+?)[,;]\s*(?:Article|Art\.?|المادة)\s*(\d+[A-Za-z]*)$/i);
15
+ const secFirst = trimmed.match(/^(?:Section|s\.?)\s*(\d+[A-Za-z]*)\s*[,;]?\s+(.+)$/i);
16
+ const secLast = trimmed.match(/^(.+?)[,;]\s*(?:Section|s\.?)\s*(\d+[A-Za-z]*)$/i);
17
+ const article = artFirst?.[1] ?? artLast?.[2] ?? secFirst?.[1] ?? secLast?.[2];
18
+ const law = artFirst?.[2] ?? artLast?.[1] ?? secFirst?.[2] ?? secLast?.[1] ?? trimmed;
19
+ // Detect if this is DIFC/ADGM (uses Section) or Federal (uses Article)
20
+ const isDifcAdgm = /\b(?:DIFC|ADGM)\b/i.test(law);
21
+ const provisionWord = isDifcAdgm ? 'Section' : 'Article';
22
+ const provisionAbbrev = isDifcAdgm ? 's' : 'Art.';
23
+ let formatted;
24
+ switch (format) {
25
+ case 'short':
26
+ formatted = article ? `${provisionAbbrev} ${article}, ${law.split('(')[0].trim()}` : law;
27
+ break;
28
+ case 'pinpoint':
29
+ formatted = article ? `${provisionAbbrev} ${article}` : law;
30
+ break;
31
+ case 'full':
32
+ default:
33
+ formatted = article ? `${provisionWord} ${article}, ${law}` : law;
34
+ break;
35
+ }
36
+ return { original: input.citation, formatted, format };
37
+ }
38
+ //# sourceMappingURL=format-citation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-citation.js","sourceRoot":"","sources":["../../src/tools/format-citation.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA0B;IAE1B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IACtC,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEtC,kEAAkE;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAElF,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAEtF,uEAAuE;IACvE,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IAElD,IAAI,SAAiB,CAAC;IACtB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,IAAI,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACzF,MAAM;QACR,KAAK,UAAU;YACb,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5D,MAAM;QACR,KAAK,MAAM,CAAC;QACZ;YACE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAClE,MAAM;IACV,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * get_eu_basis — Get EU/international legal basis for a UAE statute.
3
+ *
4
+ * UAE is not an EU member but many UAE laws align with EU regulations:
5
+ * - PDPL (45/2021) aligns with GDPR
6
+ * - DIFC DPL (Law 5/2020) closely modeled on GDPR
7
+ * - ETA (46/2021) aligns with eIDAS
8
+ */
9
+ import type Database from '@ansvar/mcp-sqlite';
10
+ import { type ToolResponse } from '../utils/metadata.js';
11
+ export interface GetEUBasisInput {
12
+ document_id: string;
13
+ include_articles?: boolean;
14
+ reference_types?: string[];
15
+ }
16
+ export interface EUBasisResult {
17
+ eu_document_id: string;
18
+ eu_document_type: string;
19
+ eu_document_title: string | null;
20
+ reference_type: string;
21
+ reference_count: number;
22
+ implementation_status: string | null;
23
+ articles?: string[];
24
+ }
25
+ export declare function getEUBasis(db: InstanceType<typeof Database>, input: GetEUBasisInput): Promise<ToolResponse<EUBasisResult[]>>;
26
+ //# sourceMappingURL=get-eu-basis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-eu-basis.d.ts","sourceRoot":"","sources":["../../src/tools/get-eu-basis.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wBAAsB,UAAU,CAC9B,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC,CAqDxC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * get_eu_basis — Get EU/international legal basis for a UAE statute.
3
+ *
4
+ * UAE is not an EU member but many UAE laws align with EU regulations:
5
+ * - PDPL (45/2021) aligns with GDPR
6
+ * - DIFC DPL (Law 5/2020) closely modeled on GDPR
7
+ * - ETA (46/2021) aligns with eIDAS
8
+ */
9
+ import { resolveDocumentId } from '../utils/statute-id.js';
10
+ import { generateResponseMetadata } from '../utils/metadata.js';
11
+ export async function getEUBasis(db, input) {
12
+ const resolvedId = resolveDocumentId(db, input.document_id);
13
+ if (!resolvedId) {
14
+ return { results: [], _metadata: generateResponseMetadata(db) };
15
+ }
16
+ // Check if EU reference tables exist
17
+ try {
18
+ db.prepare('SELECT 1 FROM eu_references LIMIT 1').get();
19
+ }
20
+ catch {
21
+ return {
22
+ results: [],
23
+ _metadata: {
24
+ ...generateResponseMetadata(db),
25
+ ...{ note: 'EU/international references not available in this database tier' },
26
+ },
27
+ };
28
+ }
29
+ let sql = `
30
+ SELECT
31
+ er.eu_document_id,
32
+ ed.type as eu_document_type,
33
+ COALESCE(ed.title, ed.short_name) as eu_document_title,
34
+ er.reference_type,
35
+ COUNT(*) as reference_count,
36
+ MAX(er.implementation_status) as implementation_status
37
+ FROM eu_references er
38
+ LEFT JOIN eu_documents ed ON ed.id = er.eu_document_id
39
+ WHERE er.document_id = ?
40
+ `;
41
+ const params = [resolvedId];
42
+ if (input.reference_types && input.reference_types.length > 0) {
43
+ const placeholders = input.reference_types.map(() => '?').join(', ');
44
+ sql += ` AND er.reference_type IN (${placeholders})`;
45
+ params.push(...input.reference_types);
46
+ }
47
+ sql += ' GROUP BY er.eu_document_id, er.reference_type ORDER BY reference_count DESC';
48
+ const rows = db.prepare(sql).all(...params);
49
+ if (input.include_articles) {
50
+ for (const row of rows) {
51
+ const articles = db.prepare('SELECT DISTINCT eu_article FROM eu_references WHERE document_id = ? AND eu_document_id = ? AND eu_article IS NOT NULL').all(resolvedId, row.eu_document_id);
52
+ row.articles = articles.map(a => a.eu_article);
53
+ }
54
+ }
55
+ return { results: rows, _metadata: generateResponseMetadata(db) };
56
+ }
57
+ //# sourceMappingURL=get-eu-basis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-eu-basis.js","sourceRoot":"","sources":["../../src/tools/get-eu-basis.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAkBnF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,EAAiC,EACjC,KAAsB;IAEtB,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1D,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,iEAAiE,EAAE;aAC/E;SACF,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,GAAG;;;;;;;;;;;GAWT,CAAC;IACF,MAAM,MAAM,GAAa,CAAC,UAAU,CAAC,CAAC;IAEtC,IAAI,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,GAAG,IAAI,8BAA8B,YAAY,GAAG,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;IACxC,CAAC;IAED,GAAG,IAAI,8EAA8E,CAAC;IAEtF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAoB,CAAC;IAE/D,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,uHAAuH,CACxH,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,cAAc,CAA6B,CAAC;YAClE,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * get_provision_eu_basis — Get EU/international legal basis for a specific
3
+ * provision within a UAE statute, DIFC law, or ADGM regulation.
4
+ */
5
+ import type Database from '@ansvar/mcp-sqlite';
6
+ import { type ToolResponse } from '../utils/metadata.js';
7
+ export interface GetProvisionEUBasisInput {
8
+ document_id: string;
9
+ provision_ref: string;
10
+ }
11
+ export interface ProvisionEUBasisResult {
12
+ eu_document_id: string;
13
+ eu_document_type: string;
14
+ eu_document_title: string | null;
15
+ eu_article: string | null;
16
+ reference_type: string;
17
+ reference_context: string | null;
18
+ full_citation: string | null;
19
+ }
20
+ export declare function getProvisionEUBasis(db: InstanceType<typeof Database>, input: GetProvisionEUBasisInput): Promise<ToolResponse<ProvisionEUBasisResult[]>>;
21
+ //# sourceMappingURL=get-provision-eu-basis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-provision-eu-basis.d.ts","sourceRoot":"","sources":["../../src/tools/get-provision-eu-basis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAA4B,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,sBAAsB,EAAE,CAAC,CAAC,CA4CjD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * get_provision_eu_basis — Get EU/international legal basis for a specific
3
+ * provision within a UAE statute, DIFC law, or ADGM regulation.
4
+ */
5
+ import { resolveDocumentId } from '../utils/statute-id.js';
6
+ import { generateResponseMetadata } from '../utils/metadata.js';
7
+ export async function getProvisionEUBasis(db, input) {
8
+ const resolvedId = resolveDocumentId(db, input.document_id);
9
+ if (!resolvedId) {
10
+ return { results: [], _metadata: generateResponseMetadata(db) };
11
+ }
12
+ try {
13
+ db.prepare('SELECT 1 FROM eu_references LIMIT 1').get();
14
+ }
15
+ catch {
16
+ return {
17
+ results: [],
18
+ _metadata: {
19
+ ...generateResponseMetadata(db),
20
+ ...{ note: 'EU/international references not available in this database tier' },
21
+ },
22
+ };
23
+ }
24
+ // Find the provision
25
+ const ref = input.provision_ref.trim();
26
+ const provision = db.prepare("SELECT id FROM legal_provisions WHERE document_id = ? AND (provision_ref = ? OR provision_ref = ? OR provision_ref = ? OR section = ?)").get(resolvedId, ref, `art${ref}`, `s${ref}`, ref);
27
+ if (!provision) {
28
+ return { results: [], _metadata: generateResponseMetadata(db) };
29
+ }
30
+ const rows = db.prepare(`
31
+ SELECT
32
+ er.eu_document_id,
33
+ ed.type as eu_document_type,
34
+ COALESCE(ed.title, ed.short_name) as eu_document_title,
35
+ er.eu_article,
36
+ er.reference_type,
37
+ er.reference_context,
38
+ er.full_citation
39
+ FROM eu_references er
40
+ LEFT JOIN eu_documents ed ON ed.id = er.eu_document_id
41
+ WHERE er.provision_id = ?
42
+ ORDER BY er.reference_type, er.eu_document_id
43
+ `).all(provision.id);
44
+ return { results: rows, _metadata: generateResponseMetadata(db) };
45
+ }
46
+ //# sourceMappingURL=get-provision-eu-basis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-provision-eu-basis.js","sourceRoot":"","sources":["../../src/tools/get-provision-eu-basis.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAiBnF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAiC,EACjC,KAA+B;IAE/B,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1D,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,iEAAiE,EAAE;aAC/E;SACF,CAAC;IACJ,CAAC;IAED,qBAAqB;IACrB,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,wIAAwI,CACzI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,GAAG,CAA+B,CAAC;IAElF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;GAavB,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAA6B,CAAC;IAEjD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC;AACpE,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * get_provision — Retrieve specific provision(s) from a UAE federal law, DIFC law, or ADGM regulation.
3
+ */
4
+ import type Database from '@ansvar/mcp-sqlite';
5
+ import { type ToolResponse } from '../utils/metadata.js';
6
+ export interface GetProvisionInput {
7
+ document_id: string;
8
+ section?: string;
9
+ provision_ref?: string;
10
+ article?: string;
11
+ as_of_date?: string;
12
+ }
13
+ export interface ProvisionResult {
14
+ document_id: string;
15
+ document_title: string;
16
+ provision_ref: string;
17
+ chapter: string | null;
18
+ section: string;
19
+ title: string | null;
20
+ content: string;
21
+ article_number?: string;
22
+ url?: string;
23
+ legal_zone?: string;
24
+ language?: string;
25
+ }
26
+ export declare function getProvision(db: InstanceType<typeof Database>, input: GetProvisionInput): Promise<ToolResponse<ProvisionResult[]>>;
27
+ //# sourceMappingURL=get-provision.d.ts.map