@ansvar/eu-regulations-mcp 1.0.0 → 1.1.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 (58) hide show
  1. package/README.md +60 -22
  2. package/data/regulations.db +0 -0
  3. package/dist/database/sqlite-adapter.d.ts +2 -2
  4. package/dist/database/sqlite-adapter.d.ts.map +1 -1
  5. package/dist/database/sqlite-adapter.js.map +1 -1
  6. package/dist/http-server.js +27 -5
  7. package/dist/http-server.js.map +1 -1
  8. package/dist/index.js +27 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/tools/about.d.ts +40 -0
  11. package/dist/tools/about.d.ts.map +1 -0
  12. package/dist/tools/about.js +61 -0
  13. package/dist/tools/about.js.map +1 -0
  14. package/dist/tools/list.d.ts +7 -0
  15. package/dist/tools/list.d.ts.map +1 -1
  16. package/dist/tools/list.js +73 -8
  17. package/dist/tools/list.js.map +1 -1
  18. package/dist/tools/registry.d.ts +11 -1
  19. package/dist/tools/registry.d.ts.map +1 -1
  20. package/dist/tools/registry.js +56 -4
  21. package/dist/tools/registry.js.map +1 -1
  22. package/dist/worker.d.ts.map +1 -1
  23. package/dist/worker.js +17 -5
  24. package/dist/worker.js.map +1 -1
  25. package/package.json +6 -5
  26. package/scripts/add-cross-references.sql +0 -200
  27. package/scripts/analyze-survey-responses.ts +0 -285
  28. package/scripts/build-db.ts +0 -421
  29. package/scripts/bulk-reingest-all.ts +0 -331
  30. package/scripts/check-updates.ts +0 -294
  31. package/scripts/extract-eprivacy-recitals.ts +0 -98
  32. package/scripts/ingest-eurlex-browser.ts +0 -113
  33. package/scripts/ingest-eurlex.ts +0 -349
  34. package/scripts/ingest-unece.ts +0 -382
  35. package/scripts/migrate-postgres.ts +0 -445
  36. package/scripts/migrate-to-postgres.ts +0 -353
  37. package/scripts/reingest-all-with-recitals.sh +0 -81
  38. package/scripts/sync-versions.ts +0 -206
  39. package/scripts/test-cross-refs.js +0 -26
  40. package/scripts/test-postgres-adapter.ts +0 -146
  41. package/scripts/update-dora-rts-metadata.ts +0 -112
  42. package/src/database/postgres-adapter.ts +0 -84
  43. package/src/database/sqlite-adapter.ts +0 -44
  44. package/src/database/types.ts +0 -10
  45. package/src/http-server.ts +0 -149
  46. package/src/index.ts +0 -61
  47. package/src/middleware/rate-limit.ts +0 -104
  48. package/src/tools/applicability.ts +0 -167
  49. package/src/tools/article.ts +0 -81
  50. package/src/tools/compare.ts +0 -217
  51. package/src/tools/definitions.ts +0 -49
  52. package/src/tools/evidence.ts +0 -84
  53. package/src/tools/list.ts +0 -124
  54. package/src/tools/map.ts +0 -86
  55. package/src/tools/recital.ts +0 -60
  56. package/src/tools/registry.ts +0 -311
  57. package/src/tools/search.ts +0 -297
  58. package/src/worker.ts +0 -708
package/README.md CHANGED
@@ -34,40 +34,59 @@ This MCP server makes EU regulations **searchable, cross-referenceable, and AI-r
34
34
 
35
35
  ## Quick Start
36
36
 
37
- ### Installation
37
+ ### Use Remotely (No Install Needed)
38
38
 
39
- **Option 1: Claude Desktop (Recommended)**
39
+ > Connect directly to the hosted version — zero dependencies, nothing to install.
40
40
 
41
- Add to your `claude_desktop_config.json`:
41
+ **Endpoint:** `https://eu-regulations-mcp.vercel.app/mcp`
42
42
 
43
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
44
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
43
+ | Client | How to Connect |
44
+ |--------|---------------|
45
+ | **Claude.ai** | Settings > Connectors > Add Integration > paste URL |
46
+ | **Claude Code** | `claude mcp add eu-regulations --transport http https://eu-regulations-mcp.vercel.app/mcp` |
47
+ | **Claude Desktop** | Add to config (see below) |
48
+ | **GitHub Copilot** | Add to VS Code settings (see below) |
49
+
50
+ **Claude Desktop** — add to `claude_desktop_config.json`:
45
51
 
46
52
  ```json
47
53
  {
48
54
  "mcpServers": {
49
55
  "eu-regulations": {
50
- "command": "npx",
51
- "args": ["-y", "@ansvar/eu-regulations-mcp"]
56
+ "type": "url",
57
+ "url": "https://eu-regulations-mcp.vercel.app/mcp"
52
58
  }
53
59
  }
54
60
  }
55
61
  ```
56
62
 
57
- Restart Claude Desktop. Done!
63
+ **GitHub Copilot** — add to VS Code `settings.json`:
58
64
 
59
- **Option 2: MCP Registry**
65
+ ```json
66
+ {
67
+ "github.copilot.chat.mcp.servers": {
68
+ "eu-regulations": {
69
+ "type": "http",
70
+ "url": "https://eu-regulations-mcp.vercel.app/mcp"
71
+ }
72
+ }
73
+ }
74
+ ```
75
+
76
+ ### Use Locally (npm)
60
77
 
61
- Browse and install from the [official MCP registry](https://registry.modelcontextprotocol.io/):
62
- - Search for "EU Regulations" or view directly: [`eu.ansvar/eu-regulations-mcp`](https://registry.modelcontextprotocol.io/eu.ansvar/eu-regulations-mcp)
63
- - One-click install (when registry integration is live in Claude Desktop)
64
- - Automatic updates when new versions are released
78
+ ```bash
79
+ npx @ansvar/eu-regulations-mcp
80
+ ```
65
81
 
66
- **Option 3: Cursor / VS Code**
82
+ **Claude Desktop** add to `claude_desktop_config.json`:
83
+
84
+ **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
85
+ **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
67
86
 
68
87
  ```json
69
88
  {
70
- "mcp.servers": {
89
+ "mcpServers": {
71
90
  "eu-regulations": {
72
91
  "command": "npx",
73
92
  "args": ["-y", "@ansvar/eu-regulations-mcp"]
@@ -76,16 +95,19 @@ Browse and install from the [official MCP registry](https://registry.modelcontex
76
95
  }
77
96
  ```
78
97
 
79
- **Option 4: Global npm Install**
98
+ **Cursor / VS Code:**
80
99
 
81
- ```bash
82
- npm install -g @ansvar/eu-regulations-mcp
100
+ ```json
101
+ {
102
+ "mcp.servers": {
103
+ "eu-regulations": {
104
+ "command": "npx",
105
+ "args": ["-y", "@ansvar/eu-regulations-mcp"]
106
+ }
107
+ }
108
+ }
83
109
  ```
84
110
 
85
- Then use `"command": "eu-regulations-mcp"` in your config (without npx).
86
-
87
- ---
88
-
89
111
  ## Example Queries
90
112
 
91
113
  Once connected, just ask naturally:
@@ -166,9 +188,25 @@ EUR-Lex HTML → Parse → SQLite → FTS5 snippet() → MCP response
166
188
  - **[Security Policy](SECURITY.md)** - Vulnerability reporting and security best practices
167
189
  - **[Coverage Gaps](docs/COVERAGE_GAPS.md)** - Known missing content from EUR-Lex
168
190
  - **[GitHub Actions Setup](docs/GITHUB_ACTIONS_SETUP.md)** - CI/CD workflow configuration
191
+ - **[Privacy Policy](PRIVACY.md)** - Data handling and retention notes
169
192
 
170
193
  ---
171
194
 
195
+ ## Directory Review Notes
196
+
197
+ ### Testing Account and Sample Data
198
+
199
+ This server is read-only and does not require a login account for functional review.
200
+ For directory review, use the bundled dataset and these sample prompts:
201
+ - *"What does NIS2 Article 21 require?"*
202
+ - *"Compare DORA and NIS2 incident reporting obligations."*
203
+ - *"Map ISO 27001 controls to DORA requirements."*
204
+
205
+ ### Remote Authentication (OAuth 2.0)
206
+
207
+ The default server runtime is read-only and can be deployed without authentication.
208
+ If you deploy a remote authenticated endpoint, use OAuth 2.0 over TLS with certificates from recognized authorities.
209
+
172
210
  ## ⚠️ Important Disclaimers
173
211
 
174
212
  ### Legal Advice
Binary file
@@ -1,8 +1,8 @@
1
- import type Database from 'better-sqlite3';
1
+ import type Database from '@ansvar/mcp-sqlite';
2
2
  import type { DatabaseAdapter } from './types.js';
3
3
  /**
4
4
  * Adapter that wraps better-sqlite3 Database to match DatabaseAdapter interface.
5
5
  * Allows existing SQLite-based entry points (stdio) to work with the new adapter interface.
6
6
  */
7
- export declare function createSqliteAdapter(db: Database.Database): DatabaseAdapter;
7
+ export declare function createSqliteAdapter(db: InstanceType<typeof Database>): DatabaseAdapter;
8
8
  //# sourceMappingURL=sqlite-adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/database/sqlite-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,YAAY,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAoC1E"}
1
+ {"version":3,"file":"sqlite-adapter.d.ts","sourceRoot":"","sources":["../../src/database/sqlite-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,oBAAoB,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAe,MAAM,YAAY,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,eAAe,CAoCtF"}
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/database/sqlite-adapter.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAqB;IACvD,OAAO;QACL,IAAI,EAAE,QAAiB;QAEvB,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,MAAc;YAC9C,IAAI,CAAC;gBACH,6CAA6C;gBAC7C,IAAI,SAAS,GAAG,GAAG;oBACjB,mCAAmC;qBAClC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;oBACvB,0EAA0E;qBACzE,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC;oBACjC,mDAAmD;qBAClD,OAAO,CAAC,cAAc,EAAE,kBAAkB,CAAC;qBAC3C,OAAO,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;oBAClD,4CAA4C;oBAC5C,gFAAgF;oBAChF,2EAA2E;qBAC1E,OAAO,CAAC,sCAAsC,EAAE,QAAQ,CAAC,CAAC;gBAE7D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvD,OAAO;oBACL,IAAI,EAAE,IAAW;oBACjB,QAAQ,EAAE,IAAI,CAAC,MAAM;iBACtB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC1D,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/database/sqlite-adapter.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAiC;IACnE,OAAO;QACL,IAAI,EAAE,QAAiB;QAEvB,KAAK,CAAC,KAAK,CAAU,GAAW,EAAE,MAAc;YAC9C,IAAI,CAAC;gBACH,6CAA6C;gBAC7C,IAAI,SAAS,GAAG,GAAG;oBACjB,mCAAmC;qBAClC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;oBACvB,0EAA0E;qBACzE,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC;oBACjC,mDAAmD;qBAClD,OAAO,CAAC,cAAc,EAAE,kBAAkB,CAAC;qBAC3C,OAAO,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;oBAClD,4CAA4C;oBAC5C,gFAAgF;oBAChF,2EAA2E;qBAC1E,OAAO,CAAC,sCAAsC,EAAE,QAAQ,CAAC,CAAC;gBAE7D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvD,OAAO;oBACL,IAAI,EAAE,IAAW;oBACjB,QAAQ,EAAE,IAAI,CAAC,MAAM;iBACtB,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAC1D,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,KAAK,CAAC,KAAK;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -8,10 +8,11 @@
8
8
  import { createServer } from 'node:http';
9
9
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
10
10
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
11
- import Database from 'better-sqlite3';
11
+ import Database from '@ansvar/mcp-sqlite';
12
12
  import { fileURLToPath } from 'url';
13
13
  import { dirname, join } from 'path';
14
- import { randomUUID } from 'crypto';
14
+ import { createHash, randomUUID } from 'crypto';
15
+ import { readFileSync, statSync } from 'fs';
15
16
  import { registerTools } from './tools/registry.js';
16
17
  import { createSqliteAdapter } from './database/sqlite-adapter.js';
17
18
  const __filename = fileURLToPath(import.meta.url);
@@ -20,6 +21,9 @@ const __dirname = dirname(__filename);
20
21
  const DB_PATH = process.env.EU_COMPLIANCE_DB_PATH || join(__dirname, '..', 'data', 'regulations.db');
21
22
  // HTTP server port
22
23
  const PORT = parseInt(process.env.PORT || '3000', 10);
24
+ // Read package version
25
+ const PKG_PATH = join(__dirname, '..', 'package.json');
26
+ const pkgVersion = JSON.parse(readFileSync(PKG_PATH, 'utf-8')).version;
23
27
  let db;
24
28
  function getDatabase() {
25
29
  if (!db) {
@@ -33,19 +37,37 @@ function getDatabase() {
33
37
  }
34
38
  return db;
35
39
  }
40
+ /**
41
+ * Compute about context at startup: version, DB fingerprint, build date.
42
+ */
43
+ function computeAboutContext() {
44
+ let fingerprint = 'unknown';
45
+ let dbBuilt = new Date().toISOString();
46
+ try {
47
+ const dbBuffer = readFileSync(DB_PATH);
48
+ fingerprint = createHash('sha256').update(dbBuffer).digest('hex').slice(0, 12);
49
+ const dbStat = statSync(DB_PATH);
50
+ dbBuilt = dbStat.mtime.toISOString();
51
+ }
52
+ catch {
53
+ // Non-fatal: fingerprint stays 'unknown' if DB can't be read for hashing
54
+ }
55
+ return { version: pkgVersion, fingerprint, dbBuilt };
56
+ }
57
+ const aboutContext = computeAboutContext();
36
58
  // Create MCP server instance
37
59
  function createMcpServer() {
38
60
  const db = getDatabase();
39
61
  const server = new Server({
40
62
  name: 'eu-regulations-mcp',
41
- version: '0.1.0',
63
+ version: pkgVersion,
42
64
  }, {
43
65
  capabilities: {
44
66
  tools: {},
45
67
  },
46
68
  });
47
- // Register all tools using shared registry
48
- registerTools(server, db);
69
+ // Register all tools using shared registry (with about context)
70
+ registerTools(server, db, aboutContext);
49
71
  return server;
50
72
  }
51
73
  // Start HTTP server with Streamable HTTP transport
@@ -1 +1 @@
1
- {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,15 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
- import Database from 'better-sqlite3';
4
+ import Database from '@ansvar/mcp-sqlite';
5
5
  import { fileURLToPath } from 'url';
6
6
  import { dirname, join } from 'path';
7
+ import { createHash } from 'crypto';
8
+ import { readFileSync, statSync } from 'fs';
7
9
  import { registerTools } from './tools/registry.js';
8
10
  import { createSqliteAdapter } from './database/sqlite-adapter.js';
9
11
  const __filename = fileURLToPath(import.meta.url);
10
12
  const __dirname = dirname(__filename);
11
13
  // Database path - look for regulations.db in data folder
12
14
  const DB_PATH = process.env.EU_COMPLIANCE_DB_PATH || join(__dirname, '..', 'data', 'regulations.db');
15
+ // Read package version
16
+ const PKG_PATH = join(__dirname, '..', 'package.json');
17
+ const pkgVersion = JSON.parse(readFileSync(PKG_PATH, 'utf-8')).version;
13
18
  let db;
14
19
  function getDatabase() {
15
20
  if (!db) {
@@ -23,16 +28,34 @@ function getDatabase() {
23
28
  }
24
29
  return db;
25
30
  }
31
+ /**
32
+ * Compute about context at startup: version, DB fingerprint, build date.
33
+ */
34
+ function computeAboutContext() {
35
+ let fingerprint = 'unknown';
36
+ let dbBuilt = new Date().toISOString();
37
+ try {
38
+ const dbBuffer = readFileSync(DB_PATH);
39
+ fingerprint = createHash('sha256').update(dbBuffer).digest('hex').slice(0, 12);
40
+ const dbStat = statSync(DB_PATH);
41
+ dbBuilt = dbStat.mtime.toISOString();
42
+ }
43
+ catch {
44
+ // Non-fatal: fingerprint stays 'unknown' if DB can't be read for hashing
45
+ }
46
+ return { version: pkgVersion, fingerprint, dbBuilt };
47
+ }
48
+ const aboutContext = computeAboutContext();
26
49
  const server = new Server({
27
50
  name: 'eu-regulations-mcp',
28
- version: '0.1.0',
51
+ version: pkgVersion,
29
52
  }, {
30
53
  capabilities: {
31
54
  tools: {},
32
55
  },
33
56
  });
34
- // Register all tools using shared registry
35
- registerTools(server, getDatabase());
57
+ // Register all tools using shared registry (with about context)
58
+ registerTools(server, getDatabase(), aboutContext);
36
59
  // Start the server
37
60
  async function main() {
38
61
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAKjF,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAGnE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,yDAAyD;AACzD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAErG,IAAI,EAAmB,CAAC;AAExB,SAAS,WAAW;IAClB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,EAAE,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AACD,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,oBAAoB;IAC1B,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAC;AAEF,2CAA2C;AAC3C,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AAErC,mBAAmB;AACnB,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACrD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { DatabaseAdapter } from '../database/types.js';
2
+ export interface AboutContext {
3
+ version: string;
4
+ fingerprint: string;
5
+ dbBuilt: string;
6
+ }
7
+ export interface AboutResult {
8
+ server: {
9
+ name: string;
10
+ package: string;
11
+ version: string;
12
+ suite: string;
13
+ repository: string;
14
+ };
15
+ dataset: {
16
+ fingerprint: string;
17
+ built: string;
18
+ jurisdiction: string;
19
+ content_basis: string;
20
+ counts: Record<string, number>;
21
+ freshness: {
22
+ last_checked: string | null;
23
+ check_method: string;
24
+ source_registry_entries: number;
25
+ };
26
+ };
27
+ provenance: {
28
+ sources: string[];
29
+ license: string;
30
+ authenticity_note: string;
31
+ };
32
+ security: {
33
+ access_model: string;
34
+ network_access: boolean;
35
+ filesystem_access: boolean;
36
+ arbitrary_execution: boolean;
37
+ };
38
+ }
39
+ export declare function getAbout(db: DatabaseAdapter, context: AboutContext): Promise<AboutResult>;
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,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,OAAO,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,SAAS,EAAE;YACT,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;YAC5B,YAAY,EAAE,MAAM,CAAC;YACrB,uBAAuB,EAAE,MAAM,CAAC;SACjC,CAAC;KACH,CAAC;IACF,UAAU,EAAE;QACV,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,OAAO,CAAC;QACxB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;CACH;AAED,wBAAsB,QAAQ,CAC5B,EAAE,EAAE,eAAe,EACnB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC,CA0EtB"}
@@ -0,0 +1,61 @@
1
+ export async function getAbout(db, context) {
2
+ // Run all count queries in parallel
3
+ const [regulationsResult, articlesResult, recitalsResult, definitionsResult, controlMappingsResult, applicabilityResult, evidenceResult, freshnessResult,] = await Promise.all([
4
+ db.query('SELECT COUNT(*) as count FROM regulations'),
5
+ db.query('SELECT COUNT(*) as count FROM articles'),
6
+ db.query('SELECT COUNT(*) as count FROM recitals'),
7
+ db.query('SELECT COUNT(*) as count FROM definitions'),
8
+ db.query('SELECT COUNT(*) as count FROM control_mappings'),
9
+ db.query('SELECT COUNT(*) as count FROM applicability_rules'),
10
+ db.query('SELECT COUNT(*) as count FROM evidence_requirements').catch(() => ({ rows: [{ count: 0 }] })),
11
+ db.query('SELECT COUNT(*) as entry_count, MAX(last_fetched) as last_checked FROM source_registry').catch(() => ({ rows: [{ entry_count: 0, last_checked: null }] })),
12
+ ]);
13
+ const counts = {
14
+ regulations: Number(regulationsResult.rows[0].count),
15
+ articles: Number(articlesResult.rows[0].count),
16
+ recitals: Number(recitalsResult.rows[0].count),
17
+ definitions: Number(definitionsResult.rows[0].count),
18
+ control_mappings: Number(controlMappingsResult.rows[0].count),
19
+ applicability_rules: Number(applicabilityResult.rows[0].count),
20
+ evidence_requirements: Number(evidenceResult.rows[0].count),
21
+ };
22
+ const freshnessRow = freshnessResult.rows[0];
23
+ return {
24
+ server: {
25
+ name: 'EU Regulations MCP',
26
+ package: '@ansvar/eu-regulations-mcp',
27
+ version: context.version,
28
+ suite: 'Ansvar Compliance Suite',
29
+ repository: 'https://github.com/Ansvar-Systems/EU_compliance_MCP',
30
+ },
31
+ dataset: {
32
+ fingerprint: context.fingerprint,
33
+ built: context.dbBuilt,
34
+ jurisdiction: 'EU',
35
+ content_basis: 'EUR-Lex consolidated texts with amendments applied as of build date. ' +
36
+ 'Original OJ text used where no consolidation exists (e.g., DORA RTS/ITS). ' +
37
+ 'Not an official legal publication.',
38
+ counts,
39
+ freshness: {
40
+ last_checked: freshnessRow.last_checked,
41
+ check_method: 'Daily EUR-Lex RSS + version comparison',
42
+ source_registry_entries: Number(freshnessRow.entry_count),
43
+ },
44
+ },
45
+ provenance: {
46
+ sources: ['EUR-Lex', 'UNECE'],
47
+ license: 'Apache-2.0 (server code). EU legal documents reusable under EUR-Lex reuse policy; ' +
48
+ 'editorial content under CC BY 4.0.',
49
+ authenticity_note: 'Only documents published in the Official Journal of the EU are deemed authentic ' +
50
+ '(Article 297 TFEU). This dataset is derived from EUR-Lex and should be verified ' +
51
+ 'against official publications for legal purposes.',
52
+ },
53
+ security: {
54
+ access_model: 'read-only',
55
+ network_access: false,
56
+ filesystem_access: false,
57
+ arbitrary_execution: false,
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=about.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about.js","sourceRoot":"","sources":["../../src/tools/about.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { DatabaseAdapter } from '../database/types.js';
2
2
  export interface ListInput {
3
3
  regulation?: string;
4
+ category?: string;
4
5
  }
5
6
  export interface Chapter {
6
7
  number: string;
@@ -17,6 +18,12 @@ export interface RegulationInfo {
17
18
  }
18
19
  export interface ListResult {
19
20
  regulations: RegulationInfo[];
21
+ category_summary?: string;
20
22
  }
23
+ /**
24
+ * Regulation categories for discoverability.
25
+ * Maps category name → array of regulation IDs.
26
+ */
27
+ export declare const REGULATION_CATEGORIES: Record<string, string[]>;
21
28
  export declare function listRegulations(db: DatabaseAdapter, input: ListInput): Promise<ListResult>;
22
29
  //# sourceMappingURL=list.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,eAAe,EACnB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,UAAU,CAAC,CA+FrB"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAe1D,CAAC;AAEF,wBAAsB,eAAe,CACnC,EAAE,EAAE,eAAe,EACnB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,UAAU,CAAC,CAoJrB"}
@@ -1,5 +1,25 @@
1
+ /**
2
+ * Regulation categories for discoverability.
3
+ * Maps category name → array of regulation IDs.
4
+ */
5
+ export const REGULATION_CATEGORIES = {
6
+ cybersecurity: ['NIS2', 'CYBERSECURITY_ACT', 'CYBER_SOLIDARITY', 'EUCC'],
7
+ data_protection: ['GDPR', 'EPRIVACY', 'LED', 'DGA', 'DATA_ACT', 'EHDS'],
8
+ digital_services: ['DSA', 'DMA', 'EIDAS2', 'EECC'],
9
+ financial_services: ['DORA', 'MICA', 'MIFID2', 'MIFIR', 'PSD2', 'AIFMD', 'SFDR', 'EU_TAXONOMY',
10
+ 'DORA_RTS_ICT_RISK', 'DORA_RTS_INCIDENT_CLASS', 'DORA_RTS_INCIDENT_REPORTING',
11
+ 'DORA_ITS_INCIDENT_FORMS', 'DORA_RTS_TLPT', 'DORA_RTS_ICT_SERVICES',
12
+ 'DORA_RTS_CRITICAL_PROVIDER', 'DORA_RTS_OVERSIGHT',
13
+ 'DORA_RTS_OVERSIGHT_FEES', 'DORA_ITS_REGISTER'],
14
+ ai_and_technology: ['AI_ACT', 'CHIPS_ACT'],
15
+ product_safety: ['CRA', 'GPSR', 'MACHINERY', 'RED', 'PLD'],
16
+ healthcare: ['MDR', 'IVDR', 'EHDS'],
17
+ sustainability: ['CSRD', 'CSDDD', 'EU_TAXONOMY', 'SFDR', 'CBAM', 'EUDR', 'CRMA'],
18
+ critical_infrastructure: ['CER', 'NIS2'],
19
+ automotive: ['UN_R155', 'UN_R156'],
20
+ };
1
21
  export async function listRegulations(db, input) {
2
- const { regulation } = input;
22
+ const { regulation, category } = input;
3
23
  if (regulation) {
4
24
  // Get specific regulation with chapters
5
25
  const regResult = await db.query(`SELECT id, full_name, celex_id, effective_date
@@ -51,14 +71,59 @@ export async function listRegulations(db, input) {
51
71
  GROUP BY r.id, r.full_name, r.celex_id, r.effective_date
52
72
  ORDER BY r.id`);
53
73
  const rows = result.rows;
74
+ const allRegulations = rows.map(row => ({
75
+ id: row.id,
76
+ full_name: row.full_name,
77
+ celex_id: row.celex_id,
78
+ effective_date: row.effective_date,
79
+ article_count: Number(row.article_count),
80
+ }));
81
+ // Filter by category if specified
82
+ if (category) {
83
+ const catKey = category.toLowerCase();
84
+ if (!(catKey in REGULATION_CATEGORIES)) {
85
+ const available = Object.keys(REGULATION_CATEGORIES).sort().join(', ');
86
+ return {
87
+ regulations: [],
88
+ category_summary: `Category '${category}' not found. Available categories: ${available}`,
89
+ };
90
+ }
91
+ const catIds = new Set(REGULATION_CATEGORIES[catKey]);
92
+ const filtered = allRegulations.filter(r => catIds.has(r.id));
93
+ return {
94
+ regulations: filtered,
95
+ category_summary: `${category} (${filtered.length} regulations)`,
96
+ };
97
+ }
98
+ // No category filter: return grouped by category
99
+ const regById = new Map(allRegulations.map(r => [r.id, r]));
100
+ const categorized = new Set();
101
+ const lines = [];
102
+ lines.push(`${allRegulations.length} regulations in ${Object.keys(REGULATION_CATEGORIES).length} categories\n`);
103
+ for (const [catName, catIds] of Object.entries(REGULATION_CATEGORIES).sort()) {
104
+ const catRegs = catIds
105
+ .filter(id => regById.has(id))
106
+ .map(id => regById.get(id));
107
+ if (catRegs.length === 0)
108
+ continue;
109
+ lines.push(`${catName} (${catRegs.length}):`);
110
+ for (const r of catRegs) {
111
+ lines.push(` ${r.id}: ${r.full_name} (${r.article_count} articles)`);
112
+ categorized.add(r.id);
113
+ }
114
+ lines.push('');
115
+ }
116
+ // List uncategorized regulations
117
+ const uncategorized = allRegulations.filter(r => !categorized.has(r.id));
118
+ if (uncategorized.length > 0) {
119
+ lines.push(`other (${uncategorized.length}):`);
120
+ for (const r of uncategorized) {
121
+ lines.push(` ${r.id}: ${r.full_name} (${r.article_count} articles)`);
122
+ }
123
+ }
54
124
  return {
55
- regulations: rows.map(row => ({
56
- id: row.id,
57
- full_name: row.full_name,
58
- celex_id: row.celex_id,
59
- effective_date: row.effective_date,
60
- article_count: Number(row.article_count),
61
- })),
125
+ regulations: allRegulations,
126
+ category_summary: lines.join('\n'),
62
127
  };
63
128
  }
64
129
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAyBA,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAmB,EACnB,KAAgB;IAEhB,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE7B,IAAI,UAAU,EAAE,CAAC;QACf,wCAAwC;QACxC,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,KAAK,CAC9B;;qBAEe,EACf,CAAC,UAAU,CAAC,CACb,CAAC;QAEF,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAK9B,CAAC;QAEF,kCAAkC;QAClC,MAAM,cAAc,GAAG,MAAM,EAAE,CAAC,KAAK,CACnC;;;wCAGkC,EAClC,CAAC,UAAU,CAAC,CACb,CAAC;QAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,IAI9B,CAAC;QAEH,mBAAmB;QACnB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;QAC9C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;YAChD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE;oBACzB,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,WAAW,UAAU,EAAE;oBAC9B,QAAQ,EAAE,EAAE;iBACb,CAAC,CAAC;YACL,CAAC;YACD,UAAU,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpE,CAAC;QAED,OAAO;YACL,WAAW,EAAE,CAAC;oBACZ,EAAE,EAAE,MAAM,CAAC,EAAE;oBACb,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,cAAc,EAAE,MAAM,CAAC,cAAc;oBACrC,aAAa,EAAE,QAAQ,CAAC,MAAM;oBAC9B,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;iBAC1C,CAAC;SACH,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAC3B;;;;;;;;;kBASc,CACf,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,CAAC,IAMlB,CAAC;IAEH,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5B,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;SACzC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,15 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
  import type { DatabaseAdapter } from '../database/types.js';
3
+ import { type AboutContext } from './about.js';
3
4
  interface ToolDefinition {
4
5
  name: string;
5
6
  description: string;
6
7
  inputSchema: any;
8
+ annotations?: {
9
+ title: string;
10
+ readOnlyHint: boolean;
11
+ destructiveHint: boolean;
12
+ };
7
13
  handler: (db: DatabaseAdapter, args: any) => Promise<any>;
8
14
  }
9
15
  /**
@@ -11,10 +17,14 @@ interface ToolDefinition {
11
17
  * Single source of truth for both stdio and HTTP servers.
12
18
  */
13
19
  export declare const TOOLS: ToolDefinition[];
20
+ /**
21
+ * Build the full tools list including context-dependent tools.
22
+ */
23
+ export declare function buildTools(context: AboutContext): ToolDefinition[];
14
24
  /**
15
25
  * Register all tools with an MCP server instance.
16
26
  * Use this for both stdio and HTTP servers to ensure parity.
17
27
  */
18
- export declare function registerTools(server: Server, db: DatabaseAdapter): void;
28
+ export declare function registerTools(server: Server, db: DatabaseAdapter, context?: AboutContext): void;
19
29
  export {};
20
30
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAY5D,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,OAAO,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3D;AAED;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,cAAc,EAwOjC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,GAAG,IAAI,CA4CvE"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW5D,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzD,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,OAAO,CAAC;KAC1B,CAAC;IACF,OAAO,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3D;AA0BD;;;GAGG;AACH,eAAO,MAAM,KAAK,EAAE,cAAc,EA4OjC,CAAC;AAuBF;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,cAAc,EAAE,CAElE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CA8C/F"}