@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.
- package/README.md +60 -22
- package/data/regulations.db +0 -0
- package/dist/database/sqlite-adapter.d.ts +2 -2
- package/dist/database/sqlite-adapter.d.ts.map +1 -1
- package/dist/database/sqlite-adapter.js.map +1 -1
- package/dist/http-server.js +27 -5
- package/dist/http-server.js.map +1 -1
- package/dist/index.js +27 -4
- package/dist/index.js.map +1 -1
- package/dist/tools/about.d.ts +40 -0
- package/dist/tools/about.d.ts.map +1 -0
- package/dist/tools/about.js +61 -0
- package/dist/tools/about.js.map +1 -0
- package/dist/tools/list.d.ts +7 -0
- package/dist/tools/list.d.ts.map +1 -1
- package/dist/tools/list.js +73 -8
- package/dist/tools/list.js.map +1 -1
- package/dist/tools/registry.d.ts +11 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +56 -4
- package/dist/tools/registry.js.map +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +17 -5
- package/dist/worker.js.map +1 -1
- package/package.json +6 -5
- package/scripts/add-cross-references.sql +0 -200
- package/scripts/analyze-survey-responses.ts +0 -285
- package/scripts/build-db.ts +0 -421
- package/scripts/bulk-reingest-all.ts +0 -331
- package/scripts/check-updates.ts +0 -294
- package/scripts/extract-eprivacy-recitals.ts +0 -98
- package/scripts/ingest-eurlex-browser.ts +0 -113
- package/scripts/ingest-eurlex.ts +0 -349
- package/scripts/ingest-unece.ts +0 -382
- package/scripts/migrate-postgres.ts +0 -445
- package/scripts/migrate-to-postgres.ts +0 -353
- package/scripts/reingest-all-with-recitals.sh +0 -81
- package/scripts/sync-versions.ts +0 -206
- package/scripts/test-cross-refs.js +0 -26
- package/scripts/test-postgres-adapter.ts +0 -146
- package/scripts/update-dora-rts-metadata.ts +0 -112
- package/src/database/postgres-adapter.ts +0 -84
- package/src/database/sqlite-adapter.ts +0 -44
- package/src/database/types.ts +0 -10
- package/src/http-server.ts +0 -149
- package/src/index.ts +0 -61
- package/src/middleware/rate-limit.ts +0 -104
- package/src/tools/applicability.ts +0 -167
- package/src/tools/article.ts +0 -81
- package/src/tools/compare.ts +0 -217
- package/src/tools/definitions.ts +0 -49
- package/src/tools/evidence.ts +0 -84
- package/src/tools/list.ts +0 -124
- package/src/tools/map.ts +0 -86
- package/src/tools/recital.ts +0 -60
- package/src/tools/registry.ts +0 -311
- package/src/tools/search.ts +0 -297
- 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
|
-
###
|
|
37
|
+
### Use Remotely (No Install Needed)
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
> Connect directly to the hosted version — zero dependencies, nothing to install.
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
**Endpoint:** `https://eu-regulations-mcp.vercel.app/mcp`
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
"
|
|
51
|
-
"
|
|
56
|
+
"type": "url",
|
|
57
|
+
"url": "https://eu-regulations-mcp.vercel.app/mcp"
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
61
|
```
|
|
56
62
|
|
|
57
|
-
|
|
63
|
+
**GitHub Copilot** — add to VS Code `settings.json`:
|
|
58
64
|
|
|
59
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
- Automatic updates when new versions are released
|
|
78
|
+
```bash
|
|
79
|
+
npx @ansvar/eu-regulations-mcp
|
|
80
|
+
```
|
|
65
81
|
|
|
66
|
-
**
|
|
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
|
-
"
|
|
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
|
-
**
|
|
98
|
+
**Cursor / VS Code:**
|
|
80
99
|
|
|
81
|
-
```
|
|
82
|
-
|
|
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
|
package/data/regulations.db
CHANGED
|
Binary file
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type Database from '
|
|
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
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/http-server.js
CHANGED
|
@@ -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 '
|
|
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:
|
|
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
|
package/dist/http-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../src/http-server.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAKnG,OAAO,QAAQ,MAAM,
|
|
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 '
|
|
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:
|
|
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,
|
|
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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"}
|
package/dist/tools/list.d.ts
CHANGED
|
@@ -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
|
package/dist/tools/list.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/tools/list.js
CHANGED
|
@@ -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:
|
|
56
|
-
|
|
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
|
package/dist/tools/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|