@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.
- package/CHANGELOG.md +27 -0
- package/LICENSE +110 -0
- package/README.md +151 -0
- package/data/.gitkeep +0 -0
- package/data/database.db +0 -0
- package/data/seed/zw-access-information-privacy.json +1087 -0
- package/data/seed/zw-broadcasting-services.json +1150 -0
- package/data/seed/zw-companies-business-entities.json +4128 -0
- package/data/seed/zw-constitution-2013.json +2783 -0
- package/data/seed/zw-criminal-law-codification.json +2857 -0
- package/data/seed/zw-cyber-data-protection-2021.json +389 -0
- package/data/seed/zw-freedom-of-information-2020.json +382 -0
- package/data/seed/zw-interception-communications-2007.json +335 -0
- package/data/seed/zw-money-laundering-proceeds-crime.json +1432 -0
- package/data/seed/zw-postal-telecommunications.json +1361 -0
- package/dist/capabilities.d.ts +16 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +43 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/about.d.ts +37 -0
- package/dist/tools/about.d.ts.map +1 -0
- package/dist/tools/about.js +46 -0
- package/dist/tools/about.js.map +1 -0
- package/dist/tools/build-legal-stance.d.ts +21 -0
- package/dist/tools/build-legal-stance.d.ts.map +1 -0
- package/dist/tools/build-legal-stance.js +46 -0
- package/dist/tools/build-legal-stance.js.map +1 -0
- package/dist/tools/check-currency.d.ts +20 -0
- package/dist/tools/check-currency.d.ts.map +1 -0
- package/dist/tools/check-currency.js +41 -0
- package/dist/tools/check-currency.js.map +1 -0
- package/dist/tools/format-citation.d.ts +19 -0
- package/dist/tools/format-citation.d.ts.map +1 -0
- package/dist/tools/format-citation.js +33 -0
- package/dist/tools/format-citation.js.map +1 -0
- package/dist/tools/get-eu-basis.d.ts +25 -0
- package/dist/tools/get-eu-basis.d.ts.map +1 -0
- package/dist/tools/get-eu-basis.js +56 -0
- package/dist/tools/get-eu-basis.js.map +1 -0
- package/dist/tools/get-provision-eu-basis.d.ts +20 -0
- package/dist/tools/get-provision-eu-basis.d.ts.map +1 -0
- package/dist/tools/get-provision-eu-basis.js +45 -0
- package/dist/tools/get-provision-eu-basis.js.map +1 -0
- package/dist/tools/get-provision.d.ts +24 -0
- package/dist/tools/get-provision.d.ts.map +1 -0
- package/dist/tools/get-provision.js +80 -0
- package/dist/tools/get-provision.js.map +1 -0
- package/dist/tools/get-zimbabwean-implementations.d.ts +27 -0
- package/dist/tools/get-zimbabwean-implementations.d.ts.map +1 -0
- package/dist/tools/get-zimbabwean-implementations.js +48 -0
- package/dist/tools/get-zimbabwean-implementations.js.map +1 -0
- package/dist/tools/list-sources.d.ts +25 -0
- package/dist/tools/list-sources.d.ts.map +1 -0
- package/dist/tools/list-sources.js +44 -0
- package/dist/tools/list-sources.js.map +1 -0
- package/dist/tools/registry.d.ts +13 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +365 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/search-eu-implementations.d.ts +25 -0
- package/dist/tools/search-eu-implementations.d.ts.map +1 -0
- package/dist/tools/search-eu-implementations.js +59 -0
- package/dist/tools/search-eu-implementations.js.map +1 -0
- package/dist/tools/search-legislation.d.ts +24 -0
- package/dist/tools/search-legislation.d.ts.map +1 -0
- package/dist/tools/search-legislation.js +54 -0
- package/dist/tools/search-legislation.js.map +1 -0
- package/dist/tools/validate-citation.d.ts +26 -0
- package/dist/tools/validate-citation.d.ts.map +1 -0
- package/dist/tools/validate-citation.js +118 -0
- package/dist/tools/validate-citation.js.map +1 -0
- package/dist/tools/validate-eu-compliance.d.ts +20 -0
- package/dist/tools/validate-eu-compliance.d.ts.map +1 -0
- package/dist/tools/validate-eu-compliance.js +98 -0
- package/dist/tools/validate-eu-compliance.js.map +1 -0
- package/dist/utils/as-of-date.d.ts +9 -0
- package/dist/utils/as-of-date.d.ts.map +1 -0
- package/dist/utils/as-of-date.js +25 -0
- package/dist/utils/as-of-date.js.map +1 -0
- package/dist/utils/fts-query.d.ts +19 -0
- package/dist/utils/fts-query.d.ts.map +1 -0
- package/dist/utils/fts-query.js +47 -0
- package/dist/utils/fts-query.js.map +1 -0
- package/dist/utils/metadata.d.ts +16 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +23 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/statute-id.d.ts +15 -0
- package/dist/utils/statute-id.d.ts.map +1 -0
- package/dist/utils/statute-id.js +39 -0
- package/dist/utils/statute-id.js.map +1 -0
- package/fixtures/golden-hashes.json +56 -0
- package/fixtures/golden-tests.json +180 -0
- package/package.json +77 -0
- package/server.json +22 -0
- package/sources.yml +64 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime capability detection for Zimbabwe Law MCP.
|
|
3
|
+
* Detects which database tables are available to enable/disable features.
|
|
4
|
+
*/
|
|
5
|
+
import type Database from '@ansvar/mcp-sqlite';
|
|
6
|
+
export type Capability = 'core_legislation' | 'eu_references' | 'case_law' | 'preparatory_works';
|
|
7
|
+
export declare function detectCapabilities(db: InstanceType<typeof Database>): Set<Capability>;
|
|
8
|
+
export interface DbMetadata {
|
|
9
|
+
tier: string;
|
|
10
|
+
schema_version: string;
|
|
11
|
+
built_at?: string;
|
|
12
|
+
builder?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function readDbMetadata(db: InstanceType<typeof Database>): DbMetadata;
|
|
15
|
+
export declare function upgradeMessage(feature: string): string;
|
|
16
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAE/C,MAAM,MAAM,UAAU,GAClB,kBAAkB,GAClB,eAAe,GACf,UAAU,GACV,mBAAmB,CAAC;AASxB,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAcrF;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,UAAU,CAgB5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime capability detection for Zimbabwe Law MCP.
|
|
3
|
+
* Detects which database tables are available to enable/disable features.
|
|
4
|
+
*/
|
|
5
|
+
const TABLE_MAP = {
|
|
6
|
+
core_legislation: ['legal_documents', 'legal_provisions', 'provisions_fts'],
|
|
7
|
+
eu_references: ['eu_documents', 'eu_references'],
|
|
8
|
+
case_law: ['case_law'],
|
|
9
|
+
preparatory_works: ['preparatory_works'],
|
|
10
|
+
};
|
|
11
|
+
export function detectCapabilities(db) {
|
|
12
|
+
const caps = new Set();
|
|
13
|
+
const tables = new Set(db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all()
|
|
14
|
+
.map(r => r.name));
|
|
15
|
+
for (const [cap, required] of Object.entries(TABLE_MAP)) {
|
|
16
|
+
if (required.every(t => tables.has(t))) {
|
|
17
|
+
caps.add(cap);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return caps;
|
|
21
|
+
}
|
|
22
|
+
export function readDbMetadata(db) {
|
|
23
|
+
const meta = {};
|
|
24
|
+
try {
|
|
25
|
+
const rows = db.prepare('SELECT key, value FROM db_metadata').all();
|
|
26
|
+
for (const row of rows) {
|
|
27
|
+
meta[row.key] = row.value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// db_metadata table may not exist
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
tier: meta.tier ?? 'free',
|
|
35
|
+
schema_version: meta.schema_version ?? '1.0',
|
|
36
|
+
built_at: meta.built_at,
|
|
37
|
+
builder: meta.builder,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function upgradeMessage(feature) {
|
|
41
|
+
return `The "${feature}" feature requires a professional-tier database. Contact hello@ansvar.ai for access.`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,SAAS,GAAiC;IAC9C,gBAAgB,EAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;IAC3E,aAAa,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;IAChD,QAAQ,EAAE,CAAC,UAAU,CAAC;IACtB,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;CACzC,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,EAAiC;IAClE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAc,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,GAAG,CACnB,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,EAAyB;SAC1F,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CACpB,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACxD,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,GAAiB,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AASD,MAAM,UAAU,cAAc,CAAC,EAAiC;IAC9D,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAAsC,CAAC;QACxG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,KAAK;QAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,QAAQ,OAAO,sFAAsF,CAAC;AAC/G,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const SERVER_NAME = "zimbabwe-law-mcp";
|
|
2
|
+
export declare const SERVER_VERSION = "1.0.0";
|
|
3
|
+
export declare const SERVER_LABEL = "Zimbabwe Law MCP";
|
|
4
|
+
export declare const PACKAGE_NAME = "@ansvar/zimbabwe-law-mcp";
|
|
5
|
+
export declare const REPOSITORY_URL = "https://github.com/Ansvar-Systems/zimbabwe-law-mcp";
|
|
6
|
+
export declare const DB_ENV_VAR = "ZW_LAW_DB_PATH";
|
|
7
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,eAAO,MAAM,cAAc,UAAU,CAAC;AACtC,eAAO,MAAM,YAAY,qBAAqB,CAAC;AAC/C,eAAO,MAAM,YAAY,6BAA6B,CAAC;AACvD,eAAO,MAAM,cAAc,uDAAuD,CAAC;AACnF,eAAO,MAAM,UAAU,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const SERVER_NAME = 'zimbabwe-law-mcp';
|
|
2
|
+
export const SERVER_VERSION = '1.0.0';
|
|
3
|
+
export const SERVER_LABEL = 'Zimbabwe Law MCP';
|
|
4
|
+
export const PACKAGE_NAME = '@ansvar/zimbabwe-law-mcp';
|
|
5
|
+
export const REPOSITORY_URL = 'https://github.com/Ansvar-Systems/zimbabwe-law-mcp';
|
|
6
|
+
export const DB_ENV_VAR = 'ZW_LAW_DB_PATH';
|
|
7
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AACvD,MAAM,CAAC,MAAM,cAAc,GAAG,oDAAoD,CAAC;AACnF,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;GAIG"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Zimbabwe Law MCP Server -- stdio entry point.
|
|
4
|
+
*
|
|
5
|
+
* Provides Zimbabwean legislation search 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,37 @@
|
|
|
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
|
+
database: {
|
|
15
|
+
fingerprint: string;
|
|
16
|
+
built_at: string;
|
|
17
|
+
tier: string;
|
|
18
|
+
schema_version: string;
|
|
19
|
+
capabilities: import("../capabilities.js").Capability[];
|
|
20
|
+
};
|
|
21
|
+
statistics: {
|
|
22
|
+
documents: number;
|
|
23
|
+
provisions: number;
|
|
24
|
+
definitions: number;
|
|
25
|
+
eu_documents: number;
|
|
26
|
+
eu_references: number;
|
|
27
|
+
};
|
|
28
|
+
data_source: {
|
|
29
|
+
name: string;
|
|
30
|
+
authority: string;
|
|
31
|
+
url: string;
|
|
32
|
+
license: string;
|
|
33
|
+
jurisdiction: string;
|
|
34
|
+
languages: string[];
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BhF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
database: {
|
|
23
|
+
fingerprint: context.fingerprint,
|
|
24
|
+
built_at: context.dbBuilt,
|
|
25
|
+
tier: meta.tier,
|
|
26
|
+
schema_version: meta.schema_version,
|
|
27
|
+
capabilities: [...caps],
|
|
28
|
+
},
|
|
29
|
+
statistics: {
|
|
30
|
+
documents: safeCount(db, 'SELECT COUNT(*) as count FROM legal_documents'),
|
|
31
|
+
provisions: safeCount(db, 'SELECT COUNT(*) as count FROM legal_provisions'),
|
|
32
|
+
definitions: safeCount(db, 'SELECT COUNT(*) as count FROM definitions'),
|
|
33
|
+
eu_documents: safeCount(db, 'SELECT COUNT(*) as count FROM eu_documents'),
|
|
34
|
+
eu_references: safeCount(db, 'SELECT COUNT(*) as count FROM eu_references'),
|
|
35
|
+
},
|
|
36
|
+
data_source: {
|
|
37
|
+
name: 'ZimLII',
|
|
38
|
+
authority: 'Zimbabwe Legal Information Institute, hosted by AfricanLII / University of Cape Town',
|
|
39
|
+
url: 'https://zimlii.org',
|
|
40
|
+
license: 'Free Access (AfricanLII)',
|
|
41
|
+
jurisdiction: 'ZW',
|
|
42
|
+
languages: ['en'],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# 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,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,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,sFAAsF;YACjG,GAAG,EAAE,oBAAoB;YACzB,OAAO,EAAE,0BAA0B;YACnC,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,CAAC,IAAI,CAAC;SAClB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* build_legal_stance — Build a comprehensive set of citations for a legal question.
|
|
3
|
+
*/
|
|
4
|
+
import type Database from '@ansvar/mcp-sqlite';
|
|
5
|
+
import { type ToolResponse } from '../utils/metadata.js';
|
|
6
|
+
export interface BuildLegalStanceInput {
|
|
7
|
+
query: string;
|
|
8
|
+
document_id?: string;
|
|
9
|
+
limit?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface LegalStanceResult {
|
|
12
|
+
document_id: string;
|
|
13
|
+
document_title: string;
|
|
14
|
+
provision_ref: string;
|
|
15
|
+
section: string;
|
|
16
|
+
title: string | null;
|
|
17
|
+
snippet: string;
|
|
18
|
+
relevance: number;
|
|
19
|
+
}
|
|
20
|
+
export declare function buildLegalStance(db: InstanceType<typeof Database>, input: BuildLegalStanceInput): Promise<ToolResponse<LegalStanceResult[]>>;
|
|
21
|
+
//# 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;;GAEG;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,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;CACnB;AAED,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,EACjC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC,CAAC,CA4C5C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* build_legal_stance — Build a comprehensive set of citations for a legal question.
|
|
3
|
+
*/
|
|
4
|
+
import { buildFtsQueryVariants, sanitizeFtsInput } from '../utils/fts-query.js';
|
|
5
|
+
import { generateResponseMetadata } from '../utils/metadata.js';
|
|
6
|
+
export async function buildLegalStance(db, input) {
|
|
7
|
+
if (!input.query || input.query.trim().length === 0) {
|
|
8
|
+
return { results: [], _metadata: generateResponseMetadata(db) };
|
|
9
|
+
}
|
|
10
|
+
const limit = Math.min(Math.max(input.limit ?? 5, 1), 20);
|
|
11
|
+
const queryVariants = buildFtsQueryVariants(sanitizeFtsInput(input.query));
|
|
12
|
+
for (const ftsQuery of queryVariants) {
|
|
13
|
+
let sql = `
|
|
14
|
+
SELECT
|
|
15
|
+
lp.document_id,
|
|
16
|
+
ld.title as document_title,
|
|
17
|
+
lp.provision_ref,
|
|
18
|
+
lp.section,
|
|
19
|
+
lp.title,
|
|
20
|
+
snippet(provisions_fts, 0, '>>>', '<<<', '...', 48) as snippet,
|
|
21
|
+
bm25(provisions_fts) as relevance
|
|
22
|
+
FROM provisions_fts
|
|
23
|
+
JOIN legal_provisions lp ON lp.id = provisions_fts.rowid
|
|
24
|
+
JOIN legal_documents ld ON ld.id = lp.document_id
|
|
25
|
+
WHERE provisions_fts MATCH ?
|
|
26
|
+
`;
|
|
27
|
+
const params = [ftsQuery];
|
|
28
|
+
if (input.document_id) {
|
|
29
|
+
sql += ' AND lp.document_id = ?';
|
|
30
|
+
params.push(input.document_id);
|
|
31
|
+
}
|
|
32
|
+
sql += ' ORDER BY relevance LIMIT ?';
|
|
33
|
+
params.push(limit);
|
|
34
|
+
try {
|
|
35
|
+
const rows = db.prepare(sql).all(...params);
|
|
36
|
+
if (rows.length > 0) {
|
|
37
|
+
return { results: rows, _metadata: generateResponseMetadata(db) };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { results: [], _metadata: generateResponseMetadata(db) };
|
|
45
|
+
}
|
|
46
|
+
//# 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;;GAEG;AAGH,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAkBnF,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;;;;;;;;;;;;;KAaT,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,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,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check_currency — Check whether a Zimbabwean statute is currently in force.
|
|
3
|
+
*/
|
|
4
|
+
import type Database from '@ansvar/mcp-sqlite';
|
|
5
|
+
import { type ToolResponse } from '../utils/metadata.js';
|
|
6
|
+
export interface CheckCurrencyInput {
|
|
7
|
+
document_id: string;
|
|
8
|
+
provision_ref?: string;
|
|
9
|
+
as_of_date?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface CheckCurrencyResult {
|
|
12
|
+
document_id: string;
|
|
13
|
+
title: string;
|
|
14
|
+
status: string;
|
|
15
|
+
issued_date: string | null;
|
|
16
|
+
in_force_date: string | null;
|
|
17
|
+
warnings: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function checkCurrency(db: InstanceType<typeof Database>, input: CheckCurrencyInput): Promise<ToolResponse<CheckCurrencyResult>>;
|
|
20
|
+
//# 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;;GAEG;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,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,CA4C5C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* check_currency — Check whether a Zimbabwean statute is currently in force.
|
|
3
|
+
*/
|
|
4
|
+
import { resolveDocumentId } from '../utils/statute-id.js';
|
|
5
|
+
import { generateResponseMetadata } from '../utils/metadata.js';
|
|
6
|
+
export async function checkCurrency(db, input) {
|
|
7
|
+
const resolvedId = resolveDocumentId(db, input.document_id);
|
|
8
|
+
if (!resolvedId) {
|
|
9
|
+
return {
|
|
10
|
+
results: {
|
|
11
|
+
document_id: input.document_id,
|
|
12
|
+
title: 'Unknown',
|
|
13
|
+
status: 'not_found',
|
|
14
|
+
issued_date: null,
|
|
15
|
+
in_force_date: null,
|
|
16
|
+
warnings: [`Document not found: "${input.document_id}"`],
|
|
17
|
+
},
|
|
18
|
+
_metadata: generateResponseMetadata(db),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const doc = db.prepare('SELECT id, title, status, issued_date, in_force_date FROM legal_documents WHERE id = ?').get(resolvedId);
|
|
22
|
+
const warnings = [];
|
|
23
|
+
if (doc.status === 'repealed') {
|
|
24
|
+
warnings.push('This statute has been repealed and is no longer in force.');
|
|
25
|
+
}
|
|
26
|
+
else if (doc.status === 'not_yet_in_force') {
|
|
27
|
+
warnings.push('This statute has not yet entered into force.');
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
results: {
|
|
31
|
+
document_id: doc.id,
|
|
32
|
+
title: doc.title,
|
|
33
|
+
status: doc.status,
|
|
34
|
+
issued_date: doc.issued_date,
|
|
35
|
+
in_force_date: doc.in_force_date,
|
|
36
|
+
warnings,
|
|
37
|
+
},
|
|
38
|
+
_metadata: generateResponseMetadata(db),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# 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;;GAEG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAqB,MAAM,sBAAsB,CAAC;AAiBnF,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,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,wFAAwF,CACzF,CAAC,GAAG,CAAC,UAAU,CAMf,CAAC;IAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,GAAG,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAChE,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,QAAQ;SACT;QACD,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* format_citation — Format a Zimbabwean legal citation per standard conventions.
|
|
3
|
+
*
|
|
4
|
+
* Supports Zimbabwean citation styles:
|
|
5
|
+
* - "Section N, Act Title Year"
|
|
6
|
+
* - "s N Act Title"
|
|
7
|
+
* - "Chapter N:NN, Section N"
|
|
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;AAKH,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,CA2B/B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* format_citation — Format a Zimbabwean legal citation per standard conventions.
|
|
3
|
+
*
|
|
4
|
+
* Supports Zimbabwean citation styles:
|
|
5
|
+
* - "Section N, Act Title Year"
|
|
6
|
+
* - "s N Act Title"
|
|
7
|
+
* - "Chapter N:NN, Section N"
|
|
8
|
+
*/
|
|
9
|
+
export async function formatCitationTool(input) {
|
|
10
|
+
const format = input.format ?? 'full';
|
|
11
|
+
const trimmed = input.citation.trim();
|
|
12
|
+
// "Section N <law>" or "s N <law>"
|
|
13
|
+
const sectionFirst = trimmed.match(/^(?:Section|s\.?)\s+(\d+[A-Za-z]*)\s*[,;]?\s+(.+)$/i);
|
|
14
|
+
// "<law>, Section N" or "<law> Section N"
|
|
15
|
+
const sectionLast = trimmed.match(/^(.+?)[,;]?\s+(?:Section|s\.?)\s+(\d+[A-Za-z]*)$/i);
|
|
16
|
+
const section = sectionFirst?.[1] ?? sectionLast?.[2];
|
|
17
|
+
const law = sectionFirst?.[2] ?? sectionLast?.[1] ?? trimmed;
|
|
18
|
+
let formatted;
|
|
19
|
+
switch (format) {
|
|
20
|
+
case 'short':
|
|
21
|
+
formatted = section ? `s ${section}, ${law.split('(')[0].trim()}` : law;
|
|
22
|
+
break;
|
|
23
|
+
case 'pinpoint':
|
|
24
|
+
formatted = section ? `Section ${section}` : law;
|
|
25
|
+
break;
|
|
26
|
+
case 'full':
|
|
27
|
+
default:
|
|
28
|
+
formatted = section ? `Section ${section}, ${law}` : law;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
return { original: input.citation, formatted, format };
|
|
32
|
+
}
|
|
33
|
+
//# 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;AAgBH,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,mCAAmC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC1F,0CAA0C;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAEvF,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAE7D,IAAI,SAAiB,CAAC;IACtB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACxE,MAAM;QACR,KAAK,UAAU;YACb,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACjD,MAAM;QACR,KAAK,MAAM,CAAC;QACZ;YACE,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YACzD,MAAM;IACV,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_eu_basis — Get the international/EU legal basis for a Zimbabwean statute.
|
|
3
|
+
*
|
|
4
|
+
* Zimbabwe is not an EU member, but several Zimbabwean laws align with or
|
|
5
|
+
* were influenced by EU/international instruments (e.g., CDPA aligns with GDPR,
|
|
6
|
+
* cybercrime provisions align with Budapest Convention).
|
|
7
|
+
*/
|
|
8
|
+
import type Database from '@ansvar/mcp-sqlite';
|
|
9
|
+
import { type ToolResponse } from '../utils/metadata.js';
|
|
10
|
+
export interface GetEUBasisInput {
|
|
11
|
+
document_id: string;
|
|
12
|
+
include_articles?: boolean;
|
|
13
|
+
reference_types?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface EUBasisResult {
|
|
16
|
+
eu_document_id: string;
|
|
17
|
+
eu_document_type: string;
|
|
18
|
+
eu_document_title: string | null;
|
|
19
|
+
reference_type: string;
|
|
20
|
+
reference_count: number;
|
|
21
|
+
implementation_status: string | null;
|
|
22
|
+
articles?: string[];
|
|
23
|
+
}
|
|
24
|
+
export declare function getEUBasis(db: InstanceType<typeof Database>, input: GetEUBasisInput): Promise<ToolResponse<EUBasisResult[]>>;
|
|
25
|
+
//# 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;;;;;;GAMG;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,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_eu_basis — Get the international/EU legal basis for a Zimbabwean statute.
|
|
3
|
+
*
|
|
4
|
+
* Zimbabwe is not an EU member, but several Zimbabwean laws align with or
|
|
5
|
+
* were influenced by EU/international instruments (e.g., CDPA aligns with GDPR,
|
|
6
|
+
* cybercrime provisions align with Budapest Convention).
|
|
7
|
+
*/
|
|
8
|
+
import { resolveDocumentId } from '../utils/statute-id.js';
|
|
9
|
+
import { generateResponseMetadata } from '../utils/metadata.js';
|
|
10
|
+
export async function getEUBasis(db, input) {
|
|
11
|
+
const resolvedId = resolveDocumentId(db, input.document_id);
|
|
12
|
+
if (!resolvedId) {
|
|
13
|
+
return { results: [], _metadata: generateResponseMetadata(db) };
|
|
14
|
+
}
|
|
15
|
+
// Check if EU reference tables exist
|
|
16
|
+
try {
|
|
17
|
+
db.prepare('SELECT 1 FROM eu_references LIMIT 1').get();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return {
|
|
21
|
+
results: [],
|
|
22
|
+
_metadata: {
|
|
23
|
+
...generateResponseMetadata(db),
|
|
24
|
+
...{ note: 'EU/international references not available in this database tier' },
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
let sql = `
|
|
29
|
+
SELECT
|
|
30
|
+
er.eu_document_id,
|
|
31
|
+
ed.type as eu_document_type,
|
|
32
|
+
COALESCE(ed.title, ed.short_name) as eu_document_title,
|
|
33
|
+
er.reference_type,
|
|
34
|
+
COUNT(*) as reference_count,
|
|
35
|
+
MAX(er.implementation_status) as implementation_status
|
|
36
|
+
FROM eu_references er
|
|
37
|
+
LEFT JOIN eu_documents ed ON ed.id = er.eu_document_id
|
|
38
|
+
WHERE er.document_id = ?
|
|
39
|
+
`;
|
|
40
|
+
const params = [resolvedId];
|
|
41
|
+
if (input.reference_types && input.reference_types.length > 0) {
|
|
42
|
+
const placeholders = input.reference_types.map(() => '?').join(', ');
|
|
43
|
+
sql += ` AND er.reference_type IN (${placeholders})`;
|
|
44
|
+
params.push(...input.reference_types);
|
|
45
|
+
}
|
|
46
|
+
sql += ' GROUP BY er.eu_document_id, er.reference_type ORDER BY reference_count DESC';
|
|
47
|
+
const rows = db.prepare(sql).all(...params);
|
|
48
|
+
if (input.include_articles) {
|
|
49
|
+
for (const row of rows) {
|
|
50
|
+
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);
|
|
51
|
+
row.articles = articles.map(a => a.eu_article);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { results: rows, _metadata: generateResponseMetadata(db) };
|
|
55
|
+
}
|
|
56
|
+
//# 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;;;;;;GAMG;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,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* get_provision_eu_basis — Get international/EU legal basis for a specific provision.
|
|
3
|
+
*/
|
|
4
|
+
import type Database from '@ansvar/mcp-sqlite';
|
|
5
|
+
import { type ToolResponse } from '../utils/metadata.js';
|
|
6
|
+
export interface GetProvisionEUBasisInput {
|
|
7
|
+
document_id: string;
|
|
8
|
+
provision_ref: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ProvisionEUBasisResult {
|
|
11
|
+
eu_document_id: string;
|
|
12
|
+
eu_document_type: string;
|
|
13
|
+
eu_document_title: string | null;
|
|
14
|
+
eu_article: string | null;
|
|
15
|
+
reference_type: string;
|
|
16
|
+
reference_context: string | null;
|
|
17
|
+
full_citation: string | null;
|
|
18
|
+
}
|
|
19
|
+
export declare function getProvisionEUBasis(db: InstanceType<typeof Database>, input: GetProvisionEUBasisInput): Promise<ToolResponse<ProvisionEUBasisResult[]>>;
|
|
20
|
+
//# 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;;GAEG;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"}
|