lt-open-data-sdk 1.1.2 → 1.1.4
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 +49 -0
- package/dist/cli/index.js +13 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/client/SpintaClient.d.ts +5 -0
- package/dist/client/SpintaClient.d.ts.map +1 -1
- package/dist/client/SpintaClient.js +5 -0
- package/dist/client/SpintaClient.js.map +1 -1
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +5 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +34 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/codegenTools.d.ts +8 -0
- package/dist/mcp/tools/codegenTools.d.ts.map +1 -0
- package/dist/mcp/tools/codegenTools.js +97 -0
- package/dist/mcp/tools/codegenTools.js.map +1 -0
- package/dist/mcp/tools/dataTools.d.ts +8 -0
- package/dist/mcp/tools/dataTools.d.ts.map +1 -0
- package/dist/mcp/tools/dataTools.js +171 -0
- package/dist/mcp/tools/dataTools.js.map +1 -0
- package/dist/mcp/tools/metadataTools.d.ts +8 -0
- package/dist/mcp/tools/metadataTools.d.ts.map +1 -0
- package/dist/mcp/tools/metadataTools.js +174 -0
- package/dist/mcp/tools/metadataTools.js.map +1 -0
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -127,6 +127,8 @@ for await (const municipality of client.stream(
|
|
|
127
127
|
}
|
|
128
128
|
```
|
|
129
129
|
|
|
130
|
+
> ⚠️ **Do not use `.select()` with `stream()`**. The API does not return pagination tokens when field projection is used, causing the stream to stop after the first page (100 items).
|
|
131
|
+
|
|
130
132
|
### Discovery
|
|
131
133
|
|
|
132
134
|
#### `listNamespace(namespace)` — Browse datasets
|
|
@@ -395,6 +397,53 @@ The SDK handles token caching and automatic refresh.
|
|
|
395
397
|
|
|
396
398
|
---
|
|
397
399
|
|
|
400
|
+
## MCP Server (AI Agent Integration)
|
|
401
|
+
|
|
402
|
+
This SDK exposes a **Model Context Protocol (MCP)** server, allowing AI agents (like Claude Desktop, Cursor, or other MCP clients) to directly access Lithuanian Open Data.
|
|
403
|
+
|
|
404
|
+
### Setup
|
|
405
|
+
|
|
406
|
+
Add this to your MCP configuration file (`claude_desktop_config.json` or similar):
|
|
407
|
+
|
|
408
|
+
```json
|
|
409
|
+
{
|
|
410
|
+
"mcpServers": {
|
|
411
|
+
"lt-open-data": {
|
|
412
|
+
"command": "npx",
|
|
413
|
+
"args": ["-y", "lt-open-data-sdk", "--mcp"]
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### Available Tools
|
|
420
|
+
|
|
421
|
+
| Tool | Description |
|
|
422
|
+
| ------------------ | -------------------------------------------------------- |
|
|
423
|
+
| **Metadata** | |
|
|
424
|
+
| `list_namespace` | Browse dataset hierarchy (Start here!) |
|
|
425
|
+
| `search_datasets` | Find datasets by keyword (returns titles & descriptions) |
|
|
426
|
+
| `describe_model` | Get schema/fields for a dataset (auto-infers if needed) |
|
|
427
|
+
| `get_last_updated` | Check when a dataset was last modified |
|
|
428
|
+
| **Data Access** | |
|
|
429
|
+
| `query_data` | Query records with filtering, sorting, pagination |
|
|
430
|
+
| `count_records` | Count records matching a filter |
|
|
431
|
+
| `get_record` | Fetch a single record by ID |
|
|
432
|
+
| `get_sample_data` | Get a small sample to inspect data structure |
|
|
433
|
+
| **Analysis** | |
|
|
434
|
+
| `get_summary` | Get distribution histograms for numeric fields |
|
|
435
|
+
| `generate_types` | Generate TypeScript interfaces for a dataset |
|
|
436
|
+
|
|
437
|
+
### Example Agent Workflow
|
|
438
|
+
|
|
439
|
+
1. **User:** "Find datasets about population in Vilnius"
|
|
440
|
+
2. **Agent:**
|
|
441
|
+
- `search_datasets("population Vilnius")` → Finds `dataset/path`
|
|
442
|
+
- `describe_model("dataset/path")` → Sees fields `year`, `count`, `district`
|
|
443
|
+
- `query_data("dataset/path", filter="year=2024")` → Returns data
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
398
447
|
## License
|
|
399
448
|
|
|
400
449
|
MIT
|
package/dist/cli/index.js
CHANGED
|
@@ -21,12 +21,14 @@ import { SpintaClient } from '../client/SpintaClient.js';
|
|
|
21
21
|
import { crawlNamespace, fetchAllModelsMetadata } from './crawler.js';
|
|
22
22
|
import { generateDeclarationFile } from './generator.js';
|
|
23
23
|
import { modelPathToInterfaceName } from './typeMapper.js';
|
|
24
|
+
import { startMcpServer } from '../mcp/server.js';
|
|
24
25
|
function parseArgs(args) {
|
|
25
26
|
const options = {
|
|
26
27
|
namespace: '',
|
|
27
28
|
output: undefined,
|
|
28
29
|
baseUrl: 'https://get.data.gov.lt',
|
|
29
30
|
help: false,
|
|
31
|
+
mcp: false,
|
|
30
32
|
};
|
|
31
33
|
let skipNext = false;
|
|
32
34
|
for (const [index, arg] of args.entries()) {
|
|
@@ -37,6 +39,9 @@ function parseArgs(args) {
|
|
|
37
39
|
if (arg === '--help' || arg === '-h') {
|
|
38
40
|
options.help = true;
|
|
39
41
|
}
|
|
42
|
+
else if (arg === '--mcp') {
|
|
43
|
+
options.mcp = true;
|
|
44
|
+
}
|
|
40
45
|
else if (arg === '--output' || arg === '-o') {
|
|
41
46
|
const nextArg = args[index + 1];
|
|
42
47
|
if (nextArg !== undefined) {
|
|
@@ -70,17 +75,24 @@ Arguments:
|
|
|
70
75
|
Options:
|
|
71
76
|
--output, -o Output file path (default: stdout)
|
|
72
77
|
--base-url Base URL for the API (default: https://get.data.gov.lt)
|
|
78
|
+
--mcp Start MCP server for AI agent integration
|
|
73
79
|
--help, -h Show this help message
|
|
74
80
|
|
|
75
81
|
Examples:
|
|
76
82
|
lt-gen datasets/gov/ivpk/adk
|
|
77
83
|
lt-gen datasets/gov/ivpk/adk -o ./types/adk.d.ts
|
|
78
|
-
lt-gen
|
|
84
|
+
lt-gen --mcp # Start MCP server for AI agents
|
|
79
85
|
`);
|
|
80
86
|
}
|
|
81
87
|
async function main() {
|
|
82
88
|
const args = process.argv.slice(2);
|
|
83
89
|
const options = parseArgs(args);
|
|
90
|
+
// Handle MCP server mode
|
|
91
|
+
if (options.mcp) {
|
|
92
|
+
console.error('🚀 Starting MCP server...');
|
|
93
|
+
await startMcpServer();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
84
96
|
if (options.help || options.namespace === '') {
|
|
85
97
|
showHelp();
|
|
86
98
|
process.exit(options.help ? 0 : 1);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -84,6 +84,10 @@ export declare class SpintaClient {
|
|
|
84
84
|
* using the `_page.next` token. Validates token before each page fetch to
|
|
85
85
|
* avoid mid-stream auth failures on large datasets.
|
|
86
86
|
*
|
|
87
|
+
* **Warning**: Do NOT use `.select()` with `stream()`. The data.gov.lt API
|
|
88
|
+
* does not return pagination tokens when field projection is used, causing
|
|
89
|
+
* the stream to stop after the first page.
|
|
90
|
+
*
|
|
87
91
|
* @param model - Full model path
|
|
88
92
|
* @param query - Optional query builder (should include limit for page size)
|
|
89
93
|
* @yields Objects one at a time with metadata
|
|
@@ -258,6 +262,7 @@ interface NamespaceItem {
|
|
|
258
262
|
_id: string;
|
|
259
263
|
_type: 'ns' | 'model';
|
|
260
264
|
title?: string;
|
|
265
|
+
description?: string;
|
|
261
266
|
}
|
|
262
267
|
export {};
|
|
263
268
|
//# sourceMappingURL=SpintaClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpintaClient.d.ts","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EAEd,WAAW,EAEX,UAAU,EAEX,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAY/D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAEnC,MAAM,GAAE,YAAiB;IAgBrC;;;OAGG;YACW,UAAU;IAaxB;;OAEG;YACW,OAAO;IAarB;;;;;;;;;OASG;IACG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC;IAKrE;;;;;;;;;;;;;;;OAeG;IACG,MAAM,CAAC,CAAC,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;IAKhC;;;;;;;;OAQG;IACG,SAAS,CAAC,CAAC,EACf,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAM7B
|
|
1
|
+
{"version":3,"file":"SpintaClient.d.ts","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EAEd,WAAW,EAEX,UAAU,EAEX,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAY/D,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAEnC,MAAM,GAAE,YAAiB;IAgBrC;;;OAGG;YACW,UAAU;IAaxB;;OAEG;YACW,OAAO;IAarB;;;;;;;;;OASG;IACG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC;IAKrE;;;;;;;;;;;;;;;OAeG;IACG,MAAM,CAAC,CAAC,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC;IAKhC;;;;;;;;OAQG;IACG,SAAS,CAAC,CAAC,EACf,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAM7B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACI,MAAM,CAAC,CAAC,EACb,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,cAAc,CAAC,CAAC,GAAG,YAAY,EAAE,IAAI,EAAE,SAAS,CAAC;IA0BpD;;;;;;;;;;OAUG;IACG,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvE;;;;;;;;;;;;;;;OAeG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAqBhE;;;;;;;;;;;;;;;;;;OAkBG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAwBnE;;;;;;;;;;;;;OAaG;IACG,eAAe,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAYzE;;;;;;;;;;;;;;OAcG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAK3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACG,UAAU,CAAC,CAAC,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,SAAM,GACV,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IAQ5B;;;;;;;;;;;;OAYG;IACI,aAAa,CAAC,CAAC,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,SAAI,EACX,QAAQ,SAAM,GACb,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC;IAoBlD;;;;;;;;;;;;;;;;;;OAkBG;IACG,UAAU,CACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC;CAKzB;AAED,gDAAgD;AAChD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAcD,wCAAwC;AACxC,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,IAAI,GAAG,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -129,6 +129,10 @@ export class SpintaClient {
|
|
|
129
129
|
* using the `_page.next` token. Validates token before each page fetch to
|
|
130
130
|
* avoid mid-stream auth failures on large datasets.
|
|
131
131
|
*
|
|
132
|
+
* **Warning**: Do NOT use `.select()` with `stream()`. The data.gov.lt API
|
|
133
|
+
* does not return pagination tokens when field projection is used, causing
|
|
134
|
+
* the stream to stop after the first page.
|
|
135
|
+
*
|
|
132
136
|
* @param model - Full model path
|
|
133
137
|
* @param query - Optional query builder (should include limit for page size)
|
|
134
138
|
* @yields Objects one at a time with metadata
|
|
@@ -215,6 +219,7 @@ export class SpintaClient {
|
|
|
215
219
|
_id: cleanPath,
|
|
216
220
|
_type: isNamespace ? 'ns' : 'model',
|
|
217
221
|
title: item.title,
|
|
222
|
+
description: item.description,
|
|
218
223
|
};
|
|
219
224
|
});
|
|
220
225
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpintaClient.js","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAYH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,mCAAmC;AACnC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AACnD,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AACnD,MAAM,cAAc,GAAsB;IACxC,eAAe;IACf,eAAe;IACf,eAAe;IACf,gBAAgB;CACR,CAAC;AAEX,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IAChB,UAAU,CAAoB;IAE/C,YAAY,SAAuB,EAAE;QACnC,IAAI,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEvE,0DAA0D;QAC1D,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvE,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAC9B,MAAM,CAAC,OAAO,IAAI,gBAAgB,EAClC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,MAAM,IAAI,cAAc,CAChC,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,UAAU;QACtB,MAAM,OAAO,GAA2B;YACtC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC/C,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QAC5C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,KAAK,GAAG,EAAE;QAC/C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAExC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;IACvC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAI,KAAa,EAAE,EAAU;QACvC,MAAM,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAmB,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,KAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,SAAS,CACb,KAAa,EACb,KAAuB;QAEvB,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,OAAO,CAAoB,IAAI,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"SpintaClient.js","sourceRoot":"","sources":["../../src/client/SpintaClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server for lt-open-data-sdk
|
|
3
|
+
*
|
|
4
|
+
* Exposes Lithuanian Open Data as tools for AI agents (Claude, Cursor, etc.)
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create and configure the MCP server with all tools
|
|
9
|
+
*/
|
|
10
|
+
export declare function createMcpServer(): McpServer;
|
|
11
|
+
/**
|
|
12
|
+
* Start the MCP server with stdio transport
|
|
13
|
+
* Used when running via CLI: npx lt-open-data-sdk --mcp
|
|
14
|
+
*/
|
|
15
|
+
export declare function startMcpServer(): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE;;GAEG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAY3C;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Server for lt-open-data-sdk
|
|
3
|
+
*
|
|
4
|
+
* Exposes Lithuanian Open Data as tools for AI agents (Claude, Cursor, etc.)
|
|
5
|
+
*/
|
|
6
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
8
|
+
import { registerDataTools } from './tools/dataTools.js';
|
|
9
|
+
import { registerMetadataTools } from './tools/metadataTools.js';
|
|
10
|
+
import { registerCodegenTools } from './tools/codegenTools.js';
|
|
11
|
+
/**
|
|
12
|
+
* Create and configure the MCP server with all tools
|
|
13
|
+
*/
|
|
14
|
+
export function createMcpServer() {
|
|
15
|
+
const server = new McpServer({
|
|
16
|
+
name: 'lt-open-data',
|
|
17
|
+
version: '1.0.0',
|
|
18
|
+
});
|
|
19
|
+
// Register all tool groups
|
|
20
|
+
registerDataTools(server);
|
|
21
|
+
registerMetadataTools(server);
|
|
22
|
+
registerCodegenTools(server);
|
|
23
|
+
return server;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Start the MCP server with stdio transport
|
|
27
|
+
* Used when running via CLI: npx lt-open-data-sdk --mcp
|
|
28
|
+
*/
|
|
29
|
+
export async function startMcpServer() {
|
|
30
|
+
const server = createMcpServer();
|
|
31
|
+
const transport = new StdioServerTransport();
|
|
32
|
+
await server.connect(transport);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,2BAA2B;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAE7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code generation tools for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeScript interfaces from dataset schemas.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerCodegenTools(server: McpServer): void;
|
|
8
|
+
//# sourceMappingURL=codegenTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegenTools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/codegenTools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwE5D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code generation tools for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Generates TypeScript interfaces from dataset schemas.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { SpintaClient } from '../../client/SpintaClient.js';
|
|
8
|
+
import { fetchModelMetadata } from '../../cli/crawler.js';
|
|
9
|
+
const client = new SpintaClient();
|
|
10
|
+
export function registerCodegenTools(server) {
|
|
11
|
+
// generate_types - Generate TypeScript interfaces from actual data
|
|
12
|
+
server.registerTool('generate_types', {
|
|
13
|
+
description: 'Generate TypeScript interfaces for a dataset. ' +
|
|
14
|
+
'Infers types from actual data samples, not just metadata. ' +
|
|
15
|
+
'Returns .d.ts content ready to use in TypeScript projects.',
|
|
16
|
+
inputSchema: {
|
|
17
|
+
namespace: z.string().describe('Namespace or model path'),
|
|
18
|
+
recursive: z.boolean().default(false).describe('Include nested namespaces (slower)'),
|
|
19
|
+
},
|
|
20
|
+
}, async ({ namespace, recursive }) => {
|
|
21
|
+
// Discover models in namespace
|
|
22
|
+
const models = recursive
|
|
23
|
+
? await client.discoverModels(namespace)
|
|
24
|
+
: [{ path: namespace, title: undefined }];
|
|
25
|
+
if (models.length === 0) {
|
|
26
|
+
return { content: [{ type: 'text', text: 'No models found in this namespace.' }] };
|
|
27
|
+
}
|
|
28
|
+
// Limit to avoid timeout
|
|
29
|
+
const toProcess = models.slice(0, 5);
|
|
30
|
+
const interfaces = [];
|
|
31
|
+
const errors = [];
|
|
32
|
+
for (const model of toProcess) {
|
|
33
|
+
try {
|
|
34
|
+
const metadata = await fetchModelMetadata(client, model.path);
|
|
35
|
+
if (metadata.properties.length === 0) {
|
|
36
|
+
errors.push(`${model.path}: no fields found`);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Generate interface
|
|
40
|
+
const name = model.path.split('/').pop() ?? 'Unknown';
|
|
41
|
+
const fields = metadata.properties.map(p => {
|
|
42
|
+
const tsType = mapToTsType(p.type);
|
|
43
|
+
return ` ${p.name}?: ${tsType};`;
|
|
44
|
+
});
|
|
45
|
+
interfaces.push([
|
|
46
|
+
`/** ${model.path} */`,
|
|
47
|
+
`export interface ${name} {`,
|
|
48
|
+
' _id: string;',
|
|
49
|
+
...fields,
|
|
50
|
+
'}'
|
|
51
|
+
].join('\n'));
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
errors.push(`${model.path}: fetch failed`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (interfaces.length === 0) {
|
|
58
|
+
return { content: [{ type: 'text', text: 'Could not generate interfaces. ' + errors.join(', ') }] };
|
|
59
|
+
}
|
|
60
|
+
let result = interfaces.join('\n\n');
|
|
61
|
+
if (models.length > 5) {
|
|
62
|
+
result += `\n\n// Note: Only first 5 of ${String(models.length)} models shown.`;
|
|
63
|
+
}
|
|
64
|
+
if (errors.length > 0) {
|
|
65
|
+
result += `\n\n// Errors: ${errors.join(', ')}`;
|
|
66
|
+
}
|
|
67
|
+
return { content: [{ type: 'text', text: result }] };
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Map inferred type to TypeScript type
|
|
72
|
+
*/
|
|
73
|
+
function mapToTsType(type) {
|
|
74
|
+
switch (type) {
|
|
75
|
+
case 'string':
|
|
76
|
+
case 'text':
|
|
77
|
+
case 'url':
|
|
78
|
+
return 'string';
|
|
79
|
+
case 'integer':
|
|
80
|
+
case 'number':
|
|
81
|
+
return 'number';
|
|
82
|
+
case 'boolean':
|
|
83
|
+
return 'boolean';
|
|
84
|
+
case 'date':
|
|
85
|
+
case 'datetime':
|
|
86
|
+
return 'string'; // ISO date string
|
|
87
|
+
case 'ref':
|
|
88
|
+
return '{ _id: string }';
|
|
89
|
+
case 'geometry':
|
|
90
|
+
return 'string'; // WKT
|
|
91
|
+
case 'file':
|
|
92
|
+
return '{ _id: string; _content_type?: string }';
|
|
93
|
+
default:
|
|
94
|
+
return 'unknown';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=codegenTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codegenTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/codegenTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data access tools for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Core tools for querying Lithuanian open data.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerDataTools(server: McpServer): void;
|
|
8
|
+
//# sourceMappingURL=dataTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataTools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/dataTools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0FzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyGzD"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data access tools for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Core tools for querying Lithuanian open data.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { SpintaClient } from '../../client/SpintaClient.js';
|
|
8
|
+
import { QueryBuilder } from '../../builder/QueryBuilder.js';
|
|
9
|
+
const client = new SpintaClient();
|
|
10
|
+
/**
|
|
11
|
+
* Parse a simple filter string into QueryBuilder operations
|
|
12
|
+
* Returns error message if filter is invalid
|
|
13
|
+
*/
|
|
14
|
+
function parseFilter(query, filterStr) {
|
|
15
|
+
// Handle contains
|
|
16
|
+
const containsMatch = /^(\w+)\.contains\("(.+)"\)$/.exec(filterStr);
|
|
17
|
+
if (containsMatch !== null) {
|
|
18
|
+
const field = containsMatch[1];
|
|
19
|
+
const value = containsMatch[2];
|
|
20
|
+
if (field !== undefined && value !== undefined) {
|
|
21
|
+
return { query: query.filter(f => f.field(field).contains(value)) };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Handle startswith
|
|
25
|
+
const startsMatch = /^(\w+)\.startswith\("(.+)"\)$/.exec(filterStr);
|
|
26
|
+
if (startsMatch !== null) {
|
|
27
|
+
const field = startsMatch[1];
|
|
28
|
+
const value = startsMatch[2];
|
|
29
|
+
if (field !== undefined && value !== undefined) {
|
|
30
|
+
return { query: query.filter(f => f.field(field).startswith(value)) };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Handle comparison operators
|
|
34
|
+
const compMatch = /^(\w+)(>=|<=|>|<|!=|=)(.+)$/.exec(filterStr);
|
|
35
|
+
if (compMatch !== null) {
|
|
36
|
+
const field = compMatch[1];
|
|
37
|
+
const op = compMatch[2];
|
|
38
|
+
const rawValue = compMatch[3];
|
|
39
|
+
if (field === undefined || op === undefined || rawValue === undefined) {
|
|
40
|
+
return { query, error: `Could not parse filter "${filterStr}"` };
|
|
41
|
+
}
|
|
42
|
+
// Parse value
|
|
43
|
+
let value;
|
|
44
|
+
if (rawValue.startsWith('"') && rawValue.endsWith('"')) {
|
|
45
|
+
value = rawValue.slice(1, -1);
|
|
46
|
+
}
|
|
47
|
+
else if (!isNaN(Number(rawValue))) {
|
|
48
|
+
value = Number(rawValue);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return {
|
|
52
|
+
query,
|
|
53
|
+
error: `Invalid filter value "${rawValue}". Use quotes for strings: ${field}${op}"${rawValue}"`
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
query: query.filter(f => {
|
|
58
|
+
const fieldFilter = f.field(field);
|
|
59
|
+
switch (op) {
|
|
60
|
+
case '=': return fieldFilter.eq(value);
|
|
61
|
+
case '!=': return fieldFilter.ne(value);
|
|
62
|
+
case '>': return fieldFilter.gt(value);
|
|
63
|
+
case '>=': return fieldFilter.ge(value);
|
|
64
|
+
case '<': return fieldFilter.lt(value);
|
|
65
|
+
case '<=': return fieldFilter.le(value);
|
|
66
|
+
default: return fieldFilter.eq(value);
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
query,
|
|
73
|
+
error: `Could not parse filter "${filterStr}". Examples: field=123, field>"text", field.contains("text")`
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Strip Spinta metadata from records for cleaner output
|
|
78
|
+
*/
|
|
79
|
+
function compactRecord(record) {
|
|
80
|
+
const result = {};
|
|
81
|
+
for (const [key, value] of Object.entries(record)) {
|
|
82
|
+
if (key === '_id' || !key.startsWith('_')) {
|
|
83
|
+
result[key] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
export function registerDataTools(server) {
|
|
89
|
+
// query_data - Main query tool
|
|
90
|
+
server.registerTool('query_data', {
|
|
91
|
+
description: 'Query a Lithuanian open data dataset with filtering, sorting, and pagination. ' +
|
|
92
|
+
'IMPORTANT: First use describe_model to see available fields. ' +
|
|
93
|
+
'Filter syntax: field=value, field>100, field.contains("text"). ' +
|
|
94
|
+
'Sort: field or -field for descending. ' +
|
|
95
|
+
'Example: query_data({ model: "datasets/gov/rc/ar/savivaldybe/Savivaldybe", filter: "sav_kodas>50", limit: 5 })',
|
|
96
|
+
inputSchema: {
|
|
97
|
+
model: z.string().describe('Full dataset path like "datasets/gov/rc/ar/savivaldybe/Savivaldybe"'),
|
|
98
|
+
filter: z.string().optional().describe('Filter: "population>50000" or "name.contains(\\"Vilnius\\")"'),
|
|
99
|
+
sort: z.string().optional().describe('Sort field, prefix with - for descending'),
|
|
100
|
+
limit: z.number().default(20).describe('Max records (default 20, max 1000)'),
|
|
101
|
+
compact: z.boolean().default(true).describe('Strip metadata fields for cleaner output'),
|
|
102
|
+
},
|
|
103
|
+
}, async ({ model, filter, sort, limit, compact }) => {
|
|
104
|
+
let query = new QueryBuilder().limit(Math.min(limit, 1000));
|
|
105
|
+
if (filter !== undefined && filter !== '') {
|
|
106
|
+
const result = parseFilter(query, filter);
|
|
107
|
+
if (result.error !== undefined) {
|
|
108
|
+
return { content: [{ type: 'text', text: `Filter error: ${result.error}` }] };
|
|
109
|
+
}
|
|
110
|
+
query = result.query;
|
|
111
|
+
}
|
|
112
|
+
if (sort !== undefined && sort !== '') {
|
|
113
|
+
if (sort.startsWith('-')) {
|
|
114
|
+
query = query.sortDesc(sort.slice(1));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
query = query.sort(sort);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const data = await client.getAll(model, query);
|
|
121
|
+
const output = compact ? data.map(r => compactRecord(r)) : data;
|
|
122
|
+
return { content: [{ type: 'text', text: JSON.stringify(output, null, 2) }] };
|
|
123
|
+
});
|
|
124
|
+
// get_record - Fetch single record
|
|
125
|
+
server.registerTool('get_record', {
|
|
126
|
+
description: 'Fetch a single record by its ID. Use _id value from query_data results.',
|
|
127
|
+
inputSchema: {
|
|
128
|
+
model: z.string().describe('Full dataset path'),
|
|
129
|
+
id: z.string().describe('Record ID (_id field value)'),
|
|
130
|
+
compact: z.boolean().default(true).describe('Strip metadata fields'),
|
|
131
|
+
},
|
|
132
|
+
}, async ({ model, id, compact }) => {
|
|
133
|
+
const record = await client.getOne(model, id);
|
|
134
|
+
const output = compact ? compactRecord(record) : record;
|
|
135
|
+
return { content: [{ type: 'text', text: JSON.stringify(output, null, 2) }] };
|
|
136
|
+
});
|
|
137
|
+
// count_records - Count matching records
|
|
138
|
+
server.registerTool('count_records', {
|
|
139
|
+
description: 'Count records in a dataset, optionally with a filter. Fast way to check dataset size.',
|
|
140
|
+
inputSchema: {
|
|
141
|
+
model: z.string().describe('Full dataset path'),
|
|
142
|
+
filter: z.string().optional().describe('Optional filter expression'),
|
|
143
|
+
},
|
|
144
|
+
}, async ({ model, filter }) => {
|
|
145
|
+
let query = new QueryBuilder();
|
|
146
|
+
if (filter !== undefined && filter !== '') {
|
|
147
|
+
const result = parseFilter(query, filter);
|
|
148
|
+
if (result.error !== undefined) {
|
|
149
|
+
return { content: [{ type: 'text', text: `Filter error: ${result.error}` }] };
|
|
150
|
+
}
|
|
151
|
+
query = result.query;
|
|
152
|
+
}
|
|
153
|
+
const count = await client.count(model, query);
|
|
154
|
+
return { content: [{ type: 'text', text: `Total records: ${String(count)}` }] };
|
|
155
|
+
});
|
|
156
|
+
// get_sample_data - Get sample from dataset
|
|
157
|
+
server.registerTool('get_sample_data', {
|
|
158
|
+
description: 'Get a sample of records from a dataset. Useful for understanding data structure when describe_model is not enough.',
|
|
159
|
+
inputSchema: {
|
|
160
|
+
model: z.string().describe('Full dataset path'),
|
|
161
|
+
count: z.number().default(10).describe('Number of sample records (max 100)'),
|
|
162
|
+
},
|
|
163
|
+
}, async ({ model, count }) => {
|
|
164
|
+
const sampleSize = Math.min(count, 100);
|
|
165
|
+
const query = new QueryBuilder().limit(sampleSize);
|
|
166
|
+
const data = await client.getAll(model, query);
|
|
167
|
+
const output = data.map(r => compactRecord(r));
|
|
168
|
+
return { content: [{ type: 'text', text: JSON.stringify(output, null, 2) }] };
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=dataTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dataTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/dataTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata tools for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Tools for discovering and understanding datasets before querying.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerMetadataTools(server: McpServer): void;
|
|
8
|
+
//# sourceMappingURL=metadataTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataTools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/metadataTools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+M7D"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata tools for MCP server
|
|
3
|
+
*
|
|
4
|
+
* Tools for discovering and understanding datasets before querying.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { SpintaClient } from '../../client/SpintaClient.js';
|
|
8
|
+
import { fetchModelMetadata } from '../../cli/crawler.js';
|
|
9
|
+
import { QueryBuilder } from '../../builder/QueryBuilder.js';
|
|
10
|
+
const client = new SpintaClient();
|
|
11
|
+
export function registerMetadataTools(server) {
|
|
12
|
+
// list_namespace - Browse dataset hierarchy (ENTRY POINT)
|
|
13
|
+
server.registerTool('list_namespace', {
|
|
14
|
+
description: 'START HERE: List namespaces and datasets within a path. ' +
|
|
15
|
+
'Begin with "datasets/gov" to see all government data providers. ' +
|
|
16
|
+
'Drill down through namespaces until you find a "model" (actual dataset). ' +
|
|
17
|
+
'Example flow: list_namespace("datasets/gov") → list_namespace("datasets/gov/rc") → find models',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
namespace: z.string().default('datasets/gov').describe('Namespace path. Start with "datasets/gov"'),
|
|
20
|
+
},
|
|
21
|
+
}, async ({ namespace }) => {
|
|
22
|
+
const items = await client.listNamespace(namespace);
|
|
23
|
+
// Format with titles and descriptions for better context
|
|
24
|
+
const lines = items.map(item => {
|
|
25
|
+
const typeLabel = item._type === 'ns' ? '📁' : '📊';
|
|
26
|
+
const title = item.title !== undefined && item.title !== '' ? ` - ${item.title}` : '';
|
|
27
|
+
const desc = item.description !== undefined && item.description !== ''
|
|
28
|
+
? `\n ${item.description}`
|
|
29
|
+
: '';
|
|
30
|
+
return `${typeLabel} ${item._id}${title}${desc}`;
|
|
31
|
+
});
|
|
32
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
33
|
+
});
|
|
34
|
+
// search_datasets - Find datasets by keyword
|
|
35
|
+
server.registerTool('search_datasets', {
|
|
36
|
+
description: 'Search for datasets by keyword. Returns paths with titles and descriptions. ' +
|
|
37
|
+
'Use this to find relevant datasets before querying. ' +
|
|
38
|
+
'After finding a dataset, use describe_model to see its fields.',
|
|
39
|
+
inputSchema: {
|
|
40
|
+
query: z.string().describe('Search keyword (matches path, title, or description)'),
|
|
41
|
+
namespace: z.string().default('datasets/gov').describe('Starting namespace'),
|
|
42
|
+
max_results: z.number().default(20).describe('Maximum results'),
|
|
43
|
+
},
|
|
44
|
+
}, async ({ query, namespace, max_results }) => {
|
|
45
|
+
const models = await client.discoverModels(namespace);
|
|
46
|
+
const queryLower = query.toLowerCase();
|
|
47
|
+
const matches = models
|
|
48
|
+
.filter(m => m.path.toLowerCase().includes(queryLower) ||
|
|
49
|
+
(m.title?.toLowerCase().includes(queryLower) ?? false))
|
|
50
|
+
.slice(0, max_results);
|
|
51
|
+
if (matches.length === 0) {
|
|
52
|
+
return { content: [{ type: 'text', text: 'No matching datasets found.' }] };
|
|
53
|
+
}
|
|
54
|
+
const lines = matches.map(m => {
|
|
55
|
+
const title = m.title ?? '(no title)';
|
|
56
|
+
return `${m.path}\n → ${title}`;
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
content: [{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `Found ${String(matches.length)} datasets:\n\n${lines.join('\n\n')}`
|
|
62
|
+
}]
|
|
63
|
+
};
|
|
64
|
+
});
|
|
65
|
+
// describe_model - Get schema with auto-fallback to sampling
|
|
66
|
+
server.registerTool('describe_model', {
|
|
67
|
+
description: 'IMPORTANT: Use this before query_data to understand the schema. ' +
|
|
68
|
+
'Returns field names and their types (string, integer, date, ref, etc). ' +
|
|
69
|
+
'This helps you write correct filters and know what data to expect.',
|
|
70
|
+
inputSchema: {
|
|
71
|
+
model: z.string().describe('Full dataset path, e.g. "datasets/gov/rc/ar/savivaldybe/Savivaldybe"'),
|
|
72
|
+
},
|
|
73
|
+
}, async ({ model }) => {
|
|
74
|
+
const metadata = await fetchModelMetadata(client, model);
|
|
75
|
+
// If no properties found from metadata, try sampling
|
|
76
|
+
if (metadata.properties.length === 0) {
|
|
77
|
+
// Fallback: sample data and infer fields
|
|
78
|
+
try {
|
|
79
|
+
const query = new QueryBuilder().limit(5);
|
|
80
|
+
const samples = await client.getAll(model, query);
|
|
81
|
+
if (samples.length === 0) {
|
|
82
|
+
return {
|
|
83
|
+
content: [{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: `Model: ${model}\n\nNo data available in this dataset.`
|
|
86
|
+
}]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Infer fields from sample
|
|
90
|
+
const fieldTypes = new Map();
|
|
91
|
+
for (const record of samples) {
|
|
92
|
+
for (const [key, value] of Object.entries(record)) {
|
|
93
|
+
if (!key.startsWith('_') && !fieldTypes.has(key)) {
|
|
94
|
+
fieldTypes.set(key, typeof value);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const fields = Array.from(fieldTypes.entries())
|
|
99
|
+
.map(([name, type]) => ` - ${name}: ${type}`);
|
|
100
|
+
return {
|
|
101
|
+
content: [{
|
|
102
|
+
type: 'text',
|
|
103
|
+
text: `Model: ${model}\n\nFields (inferred from data):\n${fields.join('\n')}`
|
|
104
|
+
}]
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return {
|
|
109
|
+
content: [{
|
|
110
|
+
type: 'text',
|
|
111
|
+
text: `Model: ${model}\n\nCould not determine schema or sample data.`
|
|
112
|
+
}]
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const lines = [
|
|
117
|
+
`Model: ${model}`,
|
|
118
|
+
metadata.title !== undefined && metadata.title !== '' ? `Title: ${metadata.title}` : null,
|
|
119
|
+
metadata.description !== undefined && metadata.description !== '' ? `Description: ${metadata.description}` : null,
|
|
120
|
+
'',
|
|
121
|
+
'Fields:',
|
|
122
|
+
...metadata.properties.map(p => ` - ${p.name}: ${p.type}`)
|
|
123
|
+
].filter(Boolean);
|
|
124
|
+
return { content: [{ type: 'text', text: lines.join('\n') }] };
|
|
125
|
+
});
|
|
126
|
+
// get_last_updated - Check dataset freshness
|
|
127
|
+
server.registerTool('get_last_updated', {
|
|
128
|
+
description: 'Get the timestamp of when a dataset was last updated. Useful for checking data freshness.',
|
|
129
|
+
inputSchema: {
|
|
130
|
+
model: z.string().describe('Full dataset path'),
|
|
131
|
+
},
|
|
132
|
+
}, async ({ model }) => {
|
|
133
|
+
const lastUpdate = await client.getLastUpdatedAt(model);
|
|
134
|
+
if (lastUpdate !== null) {
|
|
135
|
+
const hoursAgo = Math.round((Date.now() - lastUpdate.getTime()) / 1000 / 60 / 60);
|
|
136
|
+
const daysAgo = Math.round(hoursAgo / 24);
|
|
137
|
+
const timeDesc = daysAgo > 0 ? `${String(daysAgo)} days ago` : `${String(hoursAgo)} hours ago`;
|
|
138
|
+
return {
|
|
139
|
+
content: [{
|
|
140
|
+
type: 'text',
|
|
141
|
+
text: `Last updated: ${lastUpdate.toISOString()} (${timeDesc})`
|
|
142
|
+
}],
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
return { content: [{ type: 'text', text: 'No update history available.' }] };
|
|
146
|
+
});
|
|
147
|
+
// get_summary - Histogram with cleaner output
|
|
148
|
+
server.registerTool('get_summary', {
|
|
149
|
+
description: 'Get a histogram/distribution for a numeric field. Shows value ranges and counts with percentages.',
|
|
150
|
+
inputSchema: {
|
|
151
|
+
model: z.string().describe('Full dataset path'),
|
|
152
|
+
field: z.string().describe('Numeric field name to summarize'),
|
|
153
|
+
},
|
|
154
|
+
}, async ({ model, field }) => {
|
|
155
|
+
const summary = await client.getSummary(model, field);
|
|
156
|
+
if (summary.length === 0) {
|
|
157
|
+
return { content: [{ type: 'text', text: 'No summary data available.' }] };
|
|
158
|
+
}
|
|
159
|
+
const total = summary.reduce((sum, bin) => sum + bin.count, 0);
|
|
160
|
+
const nonEmpty = summary.filter(b => b.count > 0);
|
|
161
|
+
const lines = nonEmpty.map(bin => {
|
|
162
|
+
const binVal = typeof bin.bin === 'number' ? Math.round(bin.bin) : bin.bin;
|
|
163
|
+
const pct = ((bin.count / total) * 100).toFixed(1);
|
|
164
|
+
return ` ${String(binVal)}: ${String(bin.count)} (${pct}%)`;
|
|
165
|
+
});
|
|
166
|
+
return {
|
|
167
|
+
content: [{
|
|
168
|
+
type: 'text',
|
|
169
|
+
text: `Distribution of "${field}" (${String(total)} total records):\n${lines.join('\n')}`
|
|
170
|
+
}],
|
|
171
|
+
};
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=metadataTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadataTools.js","sourceRoot":"","sources":["../../../src/mcp/tools/metadataTools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lt-open-data-sdk",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.4",
|
|
4
4
|
"description": "TypeScript SDK for the Lithuanian Open Data platform (data.gov.lt)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -65,5 +65,9 @@
|
|
|
65
65
|
"dist",
|
|
66
66
|
"README.md",
|
|
67
67
|
"LICENSE"
|
|
68
|
-
]
|
|
68
|
+
],
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
71
|
+
"zod": "^4.3.4"
|
|
72
|
+
}
|
|
69
73
|
}
|