@oml/mcp 0.15.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 +72 -0
- package/bin/mcp.js +6 -0
- package/out/main.d.ts +1 -0
- package/out/main.js +769 -0
- package/out/main.js.map +1 -0
- package/package.json +34 -0
package/README.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# @oml/mcp
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) bridge that exposes the OML server REST interface to AI applications.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npx @oml/mcp [--workspace <path>] [--url <url>]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Options
|
|
12
|
+
|
|
13
|
+
| Flag | Short | Description |
|
|
14
|
+
|------|-------|-------------|
|
|
15
|
+
| `--workspace` | `-w` | Path to the OML workspace directory. Used to locate the server lock file under `~/.oml`. Defaults to the current working directory. |
|
|
16
|
+
| `--url` | `-u` | Explicit base URL of the OML server, including protocol and port (e.g. `http://127.0.0.1:8080`). Takes priority over `--workspace` when both are provided. |
|
|
17
|
+
|
|
18
|
+
When neither flag is given, the current working directory is treated as the workspace.
|
|
19
|
+
|
|
20
|
+
## URL Resolution
|
|
21
|
+
|
|
22
|
+
- If `--url` is provided, it is used directly.
|
|
23
|
+
- Otherwise, the workspace path (from `--workspace` or `cwd`) is hashed (SHA-256 of its canonical path) to locate the server lock file at `~/.oml/workspaces/<hash>/server.lock`, and the port is read from that file.
|
|
24
|
+
|
|
25
|
+
## Exposed Tools
|
|
26
|
+
|
|
27
|
+
| Tool | Backend API | Description |
|
|
28
|
+
|------|-------------|-------------|
|
|
29
|
+
| `oml_workspace` | `GET /v0/workspace` | Return workspace root path |
|
|
30
|
+
| `oml_models` | `GET /v0/models` | List model URIs (paginated) |
|
|
31
|
+
| `oml_ontologies` | `GET /v0/models` + SPARQL | Map ontology IRI to `oml:type` (paginated) |
|
|
32
|
+
| `oml_members` | SPARQL | List ontology members in context (paginated) |
|
|
33
|
+
| `oml_shapes` | SPARQL | Find SHACL node shapes for a type (`sh:targetClass` or `sh:class`) |
|
|
34
|
+
| `oml_assertions` | `POST /v0/assertions` | Return RDF assertions serialization |
|
|
35
|
+
| `oml_paths` | SPARQL `SELECT` | Return path triples from source to target |
|
|
36
|
+
| `oml_sparql` | SPARQL `SELECT` / `ASK` / `CONSTRUCT` / `DESCRIBE` | Return rows, booleans, or graph triples based on query kind |
|
|
37
|
+
| `oml_imports` | SPARQL `SELECT` | Return `owl:imports` triples (paginated) |
|
|
38
|
+
| `oml_search` | `POST /v0/fuzzysearch` | Fuzzy member search (paginated) |
|
|
39
|
+
| `oml_update` | `POST /v0/update` | Apply operations and return diagnostics |
|
|
40
|
+
| `oml_preview` | `POST /v0/update` with `preview=true` | Return workspace edit without persistence |
|
|
41
|
+
| `oml_lint` | `POST /v0/lint` | Lint diagnostics (optional context filter client-side) |
|
|
42
|
+
| `oml_validate` | `POST /v0/validate` | SHACL diagnostics (optional context filter client-side) |
|
|
43
|
+
|
|
44
|
+
### `oml_update` / `oml_preview` operation types
|
|
45
|
+
|
|
46
|
+
Update operations use the same wrapper schema as the REST API: each item has exactly one top-level property named after the operation.
|
|
47
|
+
|
|
48
|
+
- `{ createInstance: { descriptionIri, instanceName } }`
|
|
49
|
+
- `{ createRelationInstance: { descriptionIri, instanceName } }`
|
|
50
|
+
- `{ createInstanceRef: { descriptionIri, instanceIri, typeIri? } }`
|
|
51
|
+
- `{ createRelationInstanceRef: { descriptionIri, instanceIri, typeIri? } }`
|
|
52
|
+
- `{ addAssertion: { descriptionIri, subjectIri, predicateIri, object } }`
|
|
53
|
+
- `{ updateAssertion: { descriptionIri, subjectIri, predicateIri, object } }`
|
|
54
|
+
- `{ removeAssertion: { descriptionIri, subjectIri, predicateIri, object? } }`
|
|
55
|
+
- `{ addAnnotation: { ontologyIri, subjectIri, predicateIri, object } }`
|
|
56
|
+
- `{ updateAnnotation: { ontologyIri, subjectIri, predicateIri, object } }`
|
|
57
|
+
- `{ removeAnnotation: { ontologyIri, subjectIri, predicateIri, object? } }`
|
|
58
|
+
- `{ deleteMemberCascade: { ontologyIri, memberIri } }`
|
|
59
|
+
- `{ deleteMemberRef: { ontologyIri, memberIri, typeIri? } }`
|
|
60
|
+
- `{ deleteOntology: { ontologyIri } }` (deletes ontology file only; caller must ensure safety)
|
|
61
|
+
- `{ addImport: { importingIri, importedIri } }`
|
|
62
|
+
- `{ removeImport: { importingIri, importedIri } }`
|
|
63
|
+
- `{ createOntology: { ontologyKind, ontologyNamespace, ontologyPrefix } }`
|
|
64
|
+
|
|
65
|
+
For backward compatibility, MCP still accepts the flat form like `{ kind: 'createInstance', ... }` and normalizes it before calling REST.
|
|
66
|
+
|
|
67
|
+
Notes:
|
|
68
|
+
|
|
69
|
+
- `referencingUri` is a request-level anchor for update placement. For `createOntology`, pass an existing nearby `.oml` file URI under the workspace `oml/` tree. Do not pass the destination URI you want created.
|
|
70
|
+
- `createOntology` derives the new file path from `referencingUri` plus `ontologyNamespace`; it does not accept an explicit output path.
|
|
71
|
+
- Prefer `addImport` after `createOntology` instead of hand-writing import text. `addImport` infers the correct `extends` / `includes` / `uses` kind and reuses the imported ontology prefix when possible.
|
|
72
|
+
- When creating a new ontology and importing it in the same request, send both operations in one `oml_update` transaction and keep `referencingUri` at the top level of the request.
|
package/bin/mcp.js
ADDED
package/out/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runMcpServer(argv?: string[]): Promise<void>;
|
package/out/main.js
ADDED
|
@@ -0,0 +1,769 @@
|
|
|
1
|
+
// Copyright (c) 2026 Modelware. All rights reserved.
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { realpathSync } from 'node:fs';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
9
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
11
|
+
function stripSparqlComments(input) {
|
|
12
|
+
let out = '';
|
|
13
|
+
let inAngle = false;
|
|
14
|
+
let inSingle = false;
|
|
15
|
+
let inDouble = false;
|
|
16
|
+
let escaped = false;
|
|
17
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
18
|
+
const ch = input[i];
|
|
19
|
+
if (escaped) {
|
|
20
|
+
out += ch;
|
|
21
|
+
escaped = false;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (ch === '\\') {
|
|
25
|
+
out += ch;
|
|
26
|
+
escaped = inSingle || inDouble;
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (!inSingle && !inDouble && ch === '<') {
|
|
30
|
+
inAngle = true;
|
|
31
|
+
out += ch;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (!inSingle && !inDouble && ch === '>') {
|
|
35
|
+
inAngle = false;
|
|
36
|
+
out += ch;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!inAngle && !inDouble && ch === '\'') {
|
|
40
|
+
inSingle = !inSingle;
|
|
41
|
+
out += ch;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (!inAngle && !inSingle && ch === '"') {
|
|
45
|
+
inDouble = !inDouble;
|
|
46
|
+
out += ch;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (!inAngle && !inSingle && !inDouble && ch === '#') {
|
|
50
|
+
while (i < input.length && input[i] !== '\n' && input[i] !== '\r') {
|
|
51
|
+
i += 1;
|
|
52
|
+
}
|
|
53
|
+
if (i < input.length) {
|
|
54
|
+
out += input[i];
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
out += ch;
|
|
59
|
+
}
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
function detectSparqlKind(sparql) {
|
|
63
|
+
const cleaned = stripSparqlComments(sparql).trim().toUpperCase();
|
|
64
|
+
const match = cleaned.match(/\b(SELECT|ASK|CONSTRUCT|DESCRIBE)\b/);
|
|
65
|
+
if (match?.[1] === 'SELECT')
|
|
66
|
+
return 'select';
|
|
67
|
+
if (match?.[1] === 'ASK')
|
|
68
|
+
return 'ask';
|
|
69
|
+
if (match?.[1] === 'CONSTRUCT')
|
|
70
|
+
return 'construct';
|
|
71
|
+
if (match?.[1] === 'DESCRIBE')
|
|
72
|
+
return 'describe';
|
|
73
|
+
return 'unknown';
|
|
74
|
+
}
|
|
75
|
+
function parseArgs(argv) {
|
|
76
|
+
let workspace;
|
|
77
|
+
let url;
|
|
78
|
+
for (let i = 0; i < argv.length; i++) {
|
|
79
|
+
const arg = argv[i];
|
|
80
|
+
if ((arg === '--workspace' || arg === '-w') && i + 1 < argv.length)
|
|
81
|
+
workspace = argv[++i];
|
|
82
|
+
else if (arg.startsWith('--workspace='))
|
|
83
|
+
workspace = arg.slice('--workspace='.length);
|
|
84
|
+
else if ((arg === '--url' || arg === '-u') && i + 1 < argv.length)
|
|
85
|
+
url = argv[++i];
|
|
86
|
+
else if (arg.startsWith('--url='))
|
|
87
|
+
url = arg.slice('--url='.length);
|
|
88
|
+
}
|
|
89
|
+
return { workspace, url };
|
|
90
|
+
}
|
|
91
|
+
function canonicalPath(workspaceRoot) {
|
|
92
|
+
const resolved = path.resolve(workspaceRoot);
|
|
93
|
+
try {
|
|
94
|
+
return realpathSync.native(resolved);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return resolved;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function lockFileForWorkspace(workspaceRoot) {
|
|
101
|
+
const hash = createHash('sha256').update(canonicalPath(workspaceRoot)).digest('hex');
|
|
102
|
+
return path.join(os.homedir(), '.oml', 'workspaces', hash, 'server.lock');
|
|
103
|
+
}
|
|
104
|
+
async function resolveBaseUrl(args) {
|
|
105
|
+
if (args.url && args.url.trim())
|
|
106
|
+
return args.url.trim().replace(/\/+$/, '');
|
|
107
|
+
const workspaceRoot = args.workspace?.trim() ? args.workspace.trim() : process.cwd();
|
|
108
|
+
const lockFile = lockFileForWorkspace(workspaceRoot);
|
|
109
|
+
let raw = '';
|
|
110
|
+
try {
|
|
111
|
+
raw = await fs.readFile(lockFile, 'utf-8');
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error(`No OML server lock file found at '${lockFile}'. Ensure OML server is running for workspace '${workspaceRoot}'.`);
|
|
115
|
+
}
|
|
116
|
+
let lock;
|
|
117
|
+
try {
|
|
118
|
+
lock = JSON.parse(raw);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
throw new Error(`Malformed OML server lock file at '${lockFile}'.`);
|
|
122
|
+
}
|
|
123
|
+
if (typeof lock.port !== 'number' || !Number.isFinite(lock.port)) {
|
|
124
|
+
throw new Error(`OML server lock file at '${lockFile}' does not contain a valid port number.`);
|
|
125
|
+
}
|
|
126
|
+
return `http://127.0.0.1:${lock.port}`;
|
|
127
|
+
}
|
|
128
|
+
function textResult(text, isError = false) {
|
|
129
|
+
return { content: [{ type: 'text', text }], isError };
|
|
130
|
+
}
|
|
131
|
+
function jsonResult(payload, isError = false) {
|
|
132
|
+
return textResult(JSON.stringify(payload), isError);
|
|
133
|
+
}
|
|
134
|
+
async function fetchJson(baseUrl, restPath, init) {
|
|
135
|
+
const url = `${baseUrl}${restPath}`;
|
|
136
|
+
let response;
|
|
137
|
+
try {
|
|
138
|
+
response = await fetch(url, init);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const err = error instanceof Error ? error.message : String(error);
|
|
142
|
+
throw new Error(`OML server unreachable (${err}) URL: ${url}`);
|
|
143
|
+
}
|
|
144
|
+
const text = await response.text();
|
|
145
|
+
let parsed = text;
|
|
146
|
+
try {
|
|
147
|
+
parsed = text ? JSON.parse(text) : {};
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Keep as text when not JSON.
|
|
151
|
+
}
|
|
152
|
+
if (!response.ok) {
|
|
153
|
+
if (typeof parsed === 'object' && parsed && typeof parsed.error === 'string') {
|
|
154
|
+
throw new Error(String(parsed.error));
|
|
155
|
+
}
|
|
156
|
+
throw new Error(`HTTP ${response.status} from ${url}: ${text}`);
|
|
157
|
+
}
|
|
158
|
+
return parsed;
|
|
159
|
+
}
|
|
160
|
+
async function restGetJson(baseUrl, restPath, headers) {
|
|
161
|
+
return await fetchJson(baseUrl, restPath, { method: 'GET', headers });
|
|
162
|
+
}
|
|
163
|
+
async function restPostJson(baseUrl, restPath, body) {
|
|
164
|
+
return await fetchJson(baseUrl, restPath, {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
headers: { 'content-type': 'application/json' },
|
|
167
|
+
body: JSON.stringify(body),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function unwrapRestEnvelope(response) {
|
|
171
|
+
// REST server wraps POST responses in {ok, method, result, requestId}
|
|
172
|
+
return response?.result ?? response;
|
|
173
|
+
}
|
|
174
|
+
async function restGetText(baseUrl, restPath, accept) {
|
|
175
|
+
const url = `${baseUrl}${restPath}`;
|
|
176
|
+
let response;
|
|
177
|
+
try {
|
|
178
|
+
response = await fetch(url, { method: 'GET', headers: { accept } });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
const err = error instanceof Error ? error.message : String(error);
|
|
182
|
+
throw new Error(`OML server unreachable (${err}) URL: ${url}`);
|
|
183
|
+
}
|
|
184
|
+
const text = await response.text();
|
|
185
|
+
if (!response.ok) {
|
|
186
|
+
throw new Error(`HTTP ${response.status} from ${url}: ${text}`);
|
|
187
|
+
}
|
|
188
|
+
return text;
|
|
189
|
+
}
|
|
190
|
+
async function fetchWorkspace(baseUrl) {
|
|
191
|
+
const json = await restGetJson(baseUrl, '/v0/workspace');
|
|
192
|
+
const payload = unwrapRestEnvelope(json);
|
|
193
|
+
if (typeof payload.workspaceUri !== 'string') {
|
|
194
|
+
throw new Error('Invalid /v0/workspace response.');
|
|
195
|
+
}
|
|
196
|
+
const workspaceUri = payload.workspaceUri.replace(/\/+$/, '');
|
|
197
|
+
const workspaceRoot = workspaceUri.startsWith('file://')
|
|
198
|
+
? fileURLToPath(workspaceUri)
|
|
199
|
+
: workspaceUri;
|
|
200
|
+
const roots = Array.isArray(payload.roots) ? payload.roots.filter((r) => typeof r === 'string') : [];
|
|
201
|
+
return { workspaceUri, workspaceRoot, roots };
|
|
202
|
+
}
|
|
203
|
+
const OML_TYPE_SHORT = {
|
|
204
|
+
'http://opencaesar.io/oml#Vocabulary': 'vocabulary',
|
|
205
|
+
'http://opencaesar.io/oml#VocabularyBundle': 'vocabularyBundle',
|
|
206
|
+
'http://opencaesar.io/oml#Description': 'description',
|
|
207
|
+
'http://opencaesar.io/oml#DescriptionBundle': 'descriptionBundle',
|
|
208
|
+
};
|
|
209
|
+
async function fetchOntologies(baseUrl, workspaceUri, includeImports = false) {
|
|
210
|
+
const json = await restGetJson(baseUrl, '/v0/ontologies');
|
|
211
|
+
const ontologies = Array.isArray(json.ontologies) ? json.ontologies : [];
|
|
212
|
+
const wsPrefix = workspaceUri.replace(/\/+$/, '') + '/';
|
|
213
|
+
return ontologies
|
|
214
|
+
.map((entry) => {
|
|
215
|
+
const ontology = typeof entry?.ontology === 'string' ? String(entry.ontology) : '';
|
|
216
|
+
const rawType = typeof entry?.oml_type === 'string' ? String(entry.oml_type) : '';
|
|
217
|
+
const type = OML_TYPE_SHORT[rawType] ?? rawType;
|
|
218
|
+
const modelUri = typeof entry?.modelUri === 'string' ? String(entry.modelUri) : '';
|
|
219
|
+
const path = modelUri.startsWith(wsPrefix) ? modelUri.slice(wsPrefix.length) : modelUri;
|
|
220
|
+
const imports = Array.isArray(entry?.imports)
|
|
221
|
+
? entry.imports.filter((i) => typeof i === 'string')
|
|
222
|
+
: [];
|
|
223
|
+
const result = { ontology, type, path };
|
|
224
|
+
if (includeImports)
|
|
225
|
+
result.imports = imports;
|
|
226
|
+
return result;
|
|
227
|
+
})
|
|
228
|
+
.filter((entry) => entry.ontology.length > 0 && entry.type.length > 0)
|
|
229
|
+
.sort((a, b) => a.ontology.localeCompare(b.ontology));
|
|
230
|
+
}
|
|
231
|
+
function parsePageRequest(args, defaultPageSize = 50, maxPageSize = 200) {
|
|
232
|
+
const sizeRaw = args.pageSize;
|
|
233
|
+
const pageSize = Math.max(1, Math.min(maxPageSize, typeof sizeRaw === 'number' ? Math.floor(sizeRaw) : defaultPageSize));
|
|
234
|
+
const pageToken = typeof args.pageToken === 'string' && args.pageToken.trim().length > 0 ? args.pageToken.trim() : undefined;
|
|
235
|
+
return { pageSize, pageToken };
|
|
236
|
+
}
|
|
237
|
+
function decodePageToken(token) {
|
|
238
|
+
if (!token)
|
|
239
|
+
return 0;
|
|
240
|
+
let decoded = '';
|
|
241
|
+
try {
|
|
242
|
+
decoded = Buffer.from(token, 'base64url').toString('utf-8');
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
throw new Error('Invalid pageToken encoding.');
|
|
246
|
+
}
|
|
247
|
+
let parsed;
|
|
248
|
+
try {
|
|
249
|
+
parsed = JSON.parse(decoded);
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
throw new Error('Invalid pageToken payload.');
|
|
253
|
+
}
|
|
254
|
+
const offset = parsed?.offset;
|
|
255
|
+
if (typeof offset !== 'number' || !Number.isInteger(offset) || offset < 0) {
|
|
256
|
+
throw new Error('Invalid pageToken offset.');
|
|
257
|
+
}
|
|
258
|
+
return offset;
|
|
259
|
+
}
|
|
260
|
+
function encodePageToken(offset) {
|
|
261
|
+
return Buffer.from(JSON.stringify({ offset }), 'utf-8').toString('base64url');
|
|
262
|
+
}
|
|
263
|
+
function paginate(items, page) {
|
|
264
|
+
const start = decodePageToken(page.pageToken);
|
|
265
|
+
if (start >= items.length) {
|
|
266
|
+
return { items: [], truncated: false };
|
|
267
|
+
}
|
|
268
|
+
const end = Math.min(items.length, start + page.pageSize);
|
|
269
|
+
return {
|
|
270
|
+
items: items.slice(start, end),
|
|
271
|
+
nextPageToken: end < items.length ? encodePageToken(end) : undefined,
|
|
272
|
+
truncated: end < items.length,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function ontologyIriToModelId(ontologyIri) {
|
|
276
|
+
const iri = new URL(ontologyIri);
|
|
277
|
+
const rawPath = iri.pathname.replace(/\/+$/, '');
|
|
278
|
+
const segments = rawPath.split('/').filter(Boolean);
|
|
279
|
+
const stem = segments.at(-1) || 'index';
|
|
280
|
+
const dirSegs = iri.host ? [iri.host, ...segments.slice(0, -1)] : segments.slice(0, -1);
|
|
281
|
+
return [...dirSegs, stem].join('/');
|
|
282
|
+
}
|
|
283
|
+
function resolveContext(args) {
|
|
284
|
+
const contextArg = typeof args.context === 'string' ? args.context.trim() : '';
|
|
285
|
+
const ontologyArg = typeof args.ontology === 'string' ? args.ontology.trim() : '';
|
|
286
|
+
const ontologyIriArg = typeof args.ontologyIri === 'string' ? args.ontologyIri.trim() : '';
|
|
287
|
+
const iri = ontologyIriArg || ontologyArg || contextArg;
|
|
288
|
+
if (!iri)
|
|
289
|
+
throw new Error('An ontologyIri parameter is required.');
|
|
290
|
+
return iri;
|
|
291
|
+
}
|
|
292
|
+
async function runSparqlSelect(baseUrl, ontologyIri, sparql) {
|
|
293
|
+
const modelId = encodeURIComponent(ontologyIriToModelId(ontologyIri));
|
|
294
|
+
const query = encodeURIComponent(sparql);
|
|
295
|
+
return await restGetJson(baseUrl, `/v0/sparql/${modelId}?query=${query}`, { accept: 'application/sparql-results+json' });
|
|
296
|
+
}
|
|
297
|
+
async function runSparqlGraph(baseUrl, ontologyIri, sparql) {
|
|
298
|
+
const modelId = encodeURIComponent(ontologyIriToModelId(ontologyIri));
|
|
299
|
+
const query = encodeURIComponent(sparql);
|
|
300
|
+
return restGetText(baseUrl, `/v0/sparql/${modelId}?query=${query}`, 'text/turtle');
|
|
301
|
+
}
|
|
302
|
+
// Wrapped operation schema: each operation is a single-key object {operationKind: {props}}.
|
|
303
|
+
const UPDATE_OPERATION_SCHEMA = {
|
|
304
|
+
type: 'object',
|
|
305
|
+
minProperties: 1,
|
|
306
|
+
maxProperties: 1,
|
|
307
|
+
additionalProperties: {
|
|
308
|
+
type: 'object',
|
|
309
|
+
},
|
|
310
|
+
};
|
|
311
|
+
const UPDATE_TOOL_DESCRIPTION = `Apply (or preview) OML update operations. Pass preview:true to return the edit without writing to disk.
|
|
312
|
+
|
|
313
|
+
Each operation is {kind: {props}} where kind is one of the following (* = required):
|
|
314
|
+
createInstance/createRelationInstance: {descriptionIri*, instanceName*}
|
|
315
|
+
createInstanceRef/createRelationInstanceRef: {descriptionIri*, instanceIri*, typeIri?}
|
|
316
|
+
addAssertion/updateAssertion: {descriptionIri*, subjectIri*, predicateIri*, object*}
|
|
317
|
+
removeAssertion: {descriptionIri*, subjectIri*, predicateIri*, object?}
|
|
318
|
+
addImport/removeImport: {importingIri*, importedIri*}
|
|
319
|
+
addAnnotation/updateAnnotation: {ontologyIri*, subjectIri*, predicateIri*, object*}
|
|
320
|
+
removeAnnotation: {ontologyIri*, subjectIri*, predicateIri*, object?}
|
|
321
|
+
deleteMemberCascade/deleteMemberRef: {ontologyIri*, memberIri*, typeIri?}
|
|
322
|
+
deleteOntology: {ontologyIri*}
|
|
323
|
+
createOntology: {ontologyKind*(vocabulary|description|vocabulary bundle|description bundle), ontologyNamespace*, ontologyPrefix*, targetFolder?(workspace-relative path to the 'oml' root folder)}
|
|
324
|
+
|
|
325
|
+
object: IRI string, number, boolean, or {value, datatypeIri?, langTag?, typeIri?}
|
|
326
|
+
|
|
327
|
+
Example: {"createInstance": {"descriptionIri": "http://example.org/model", "instanceName": "MyInstance"}}`;
|
|
328
|
+
const PAGINATION_PROPS = {
|
|
329
|
+
pageSize: { type: 'integer', description: 'Items per page (default 50)' },
|
|
330
|
+
pageToken: { type: 'string', description: 'Token from previous response' },
|
|
331
|
+
};
|
|
332
|
+
const TOOLS = [
|
|
333
|
+
{
|
|
334
|
+
name: 'oml_workspace',
|
|
335
|
+
description: 'Get workspace info. Returns {workspaceUri, roots} where roots are the ontology IRIs at the top of the import graph (not imported by anything else). Use a root as the context for broad oml_sparql and oml_paths queries.',
|
|
336
|
+
inputSchema: { type: 'object', properties: {} }
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
name: 'oml_ontologies',
|
|
340
|
+
description: 'List workspace ontologies with type. Add includeImports:true to include direct imports.',
|
|
341
|
+
inputSchema: {
|
|
342
|
+
type: 'object',
|
|
343
|
+
properties: {
|
|
344
|
+
includeImports: { type: 'boolean', description: 'Include imports list (default false)' },
|
|
345
|
+
...PAGINATION_PROPS,
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
name: 'oml_members',
|
|
351
|
+
description: 'List ontology members, optionally filtered by kind.',
|
|
352
|
+
inputSchema: {
|
|
353
|
+
type: 'object',
|
|
354
|
+
required: ['ontology'],
|
|
355
|
+
properties: {
|
|
356
|
+
ontology: { type: 'string', description: 'Ontology IRI.' },
|
|
357
|
+
kind: { type: 'string', enum: ['all', 'classes', 'properties', 'instances'], description: 'Member kind filter (default all). properties includes scalar properties, annotation properties, and relations.' },
|
|
358
|
+
...PAGINATION_PROPS,
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
name: 'oml_about',
|
|
364
|
+
description: 'Get all axioms where one or more members appear as subject or object. Returns Turtle. Use for single-member inspection or a small known set. Do NOT call in a loop over discovered members — write a SPARQL CONSTRUCT instead.',
|
|
365
|
+
inputSchema: {
|
|
366
|
+
type: 'object',
|
|
367
|
+
required: ['context', 'members'],
|
|
368
|
+
properties: {
|
|
369
|
+
context: { type: 'string', description: 'Ontology IRI (query context).' },
|
|
370
|
+
members: {
|
|
371
|
+
oneOf: [
|
|
372
|
+
{ type: 'string', description: 'Single member IRI.' },
|
|
373
|
+
{ type: 'array', items: { type: 'string' }, description: 'Multiple member IRIs.' },
|
|
374
|
+
],
|
|
375
|
+
description: 'Member IRI(s) to describe.',
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
name: 'oml_shapes',
|
|
382
|
+
description: 'Find SHACL NodeShapes for a class IRI from markdown.',
|
|
383
|
+
inputSchema: {
|
|
384
|
+
type: 'object',
|
|
385
|
+
required: ['type'],
|
|
386
|
+
properties: {
|
|
387
|
+
type: { type: 'string', description: 'Class IRI.' },
|
|
388
|
+
pageSize: { type: 'integer', description: 'Items per page (default 20)' },
|
|
389
|
+
pageToken: { type: 'string', description: 'Token from previous response' },
|
|
390
|
+
},
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
name: 'oml_assertions',
|
|
395
|
+
description: 'Export RDF assertions for an ontology.',
|
|
396
|
+
inputSchema: {
|
|
397
|
+
type: 'object',
|
|
398
|
+
properties: {
|
|
399
|
+
ontology: { type: 'string', description: 'Ontology IRI filter. Omit for all.' },
|
|
400
|
+
format: { type: 'string', description: 'ttl | turtle | jsonld | ntriples | nquads' },
|
|
401
|
+
pretty: { type: 'boolean', description: 'Pretty-print (default false)' },
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
name: 'oml_paths',
|
|
407
|
+
description: 'Find RDF property paths between two IRIs.',
|
|
408
|
+
inputSchema: {
|
|
409
|
+
type: 'object',
|
|
410
|
+
required: ['context', 'source', 'target'],
|
|
411
|
+
properties: {
|
|
412
|
+
context: { type: 'string', description: 'Ontology IRI.' },
|
|
413
|
+
source: { type: 'string', description: 'Source IRI.' },
|
|
414
|
+
target: { type: 'string', description: 'Target IRI.' },
|
|
415
|
+
maxDepth: { type: 'integer', description: 'Max hops (default 3).' },
|
|
416
|
+
pageSize: { type: 'integer', description: 'Items per page (default 20)' },
|
|
417
|
+
pageToken: { type: 'string', description: 'Token from previous response' },
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
name: 'oml_sparql',
|
|
423
|
+
description: 'Run a SPARQL SELECT, ASK, CONSTRUCT, or DESCRIBE query.',
|
|
424
|
+
inputSchema: {
|
|
425
|
+
type: 'object',
|
|
426
|
+
required: ['context', 'sparql'],
|
|
427
|
+
properties: {
|
|
428
|
+
context: { type: 'string', description: 'Ontology IRI.' },
|
|
429
|
+
sparql: { type: 'string', description: 'SPARQL query.' },
|
|
430
|
+
pageSize: { type: 'integer', description: 'Rows per page (default 20)' },
|
|
431
|
+
pageToken: { type: 'string', description: 'Token from previous response' },
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
},
|
|
435
|
+
{
|
|
436
|
+
name: 'oml_search',
|
|
437
|
+
description: 'Fuzzy search ontology members by text.',
|
|
438
|
+
inputSchema: {
|
|
439
|
+
type: 'object',
|
|
440
|
+
required: ['text'],
|
|
441
|
+
properties: {
|
|
442
|
+
text: { type: 'string', description: 'Search text.' },
|
|
443
|
+
pageSize: { type: 'integer', description: 'Results per page (default 12, max 50)' },
|
|
444
|
+
pageToken: { type: 'string', description: 'Token from previous response' },
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
name: 'oml_update',
|
|
450
|
+
description: UPDATE_TOOL_DESCRIPTION,
|
|
451
|
+
inputSchema: {
|
|
452
|
+
type: 'object',
|
|
453
|
+
required: ['operations'],
|
|
454
|
+
properties: {
|
|
455
|
+
operations: {
|
|
456
|
+
type: 'array',
|
|
457
|
+
items: UPDATE_OPERATION_SCHEMA,
|
|
458
|
+
description: 'Array of update operations.',
|
|
459
|
+
},
|
|
460
|
+
preview: { type: 'boolean', description: 'Return edit without writing to disk.' },
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
name: 'oml_validate',
|
|
466
|
+
description: 'Run OML lint then SHACL validation. Returns early with lint problems if lint fails.',
|
|
467
|
+
inputSchema: {
|
|
468
|
+
type: 'object',
|
|
469
|
+
properties: {
|
|
470
|
+
ontologies: { type: 'array', items: { type: 'string' }, description: 'Optional IRI filter.' },
|
|
471
|
+
pageSize: { type: 'integer', description: 'Problems per page (default 20)' },
|
|
472
|
+
pageToken: { type: 'string', description: 'Token from previous response' },
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
},
|
|
476
|
+
];
|
|
477
|
+
function toOntologyIriArray(value) {
|
|
478
|
+
if (!Array.isArray(value))
|
|
479
|
+
return [];
|
|
480
|
+
return value.filter((item) => typeof item === 'string' && (String(item).startsWith('http://') || String(item).startsWith('https://'))).map((item) => String(item).trim());
|
|
481
|
+
}
|
|
482
|
+
function escapeIri(iri) {
|
|
483
|
+
return `<${iri.replace(/>/g, '%3E')}>`;
|
|
484
|
+
}
|
|
485
|
+
function iriNamespace(iri) {
|
|
486
|
+
const h = iri.lastIndexOf('#');
|
|
487
|
+
if (h >= 0)
|
|
488
|
+
return iri.slice(0, h + 1);
|
|
489
|
+
const s = iri.lastIndexOf('/');
|
|
490
|
+
return s >= 0 ? iri.slice(0, s + 1) : iri;
|
|
491
|
+
}
|
|
492
|
+
function buildPrefixMap(iris) {
|
|
493
|
+
const nsToPrefix = new Map();
|
|
494
|
+
const used = new Set();
|
|
495
|
+
for (const iri of iris) {
|
|
496
|
+
if (!iri.startsWith('http://') && !iri.startsWith('https://'))
|
|
497
|
+
continue;
|
|
498
|
+
const ns = iriNamespace(iri);
|
|
499
|
+
if (nsToPrefix.has(ns))
|
|
500
|
+
continue;
|
|
501
|
+
const clean = ns.replace(/[#/]+$/, '');
|
|
502
|
+
const seg = clean.slice(clean.lastIndexOf('/') + 1).replace(/[^a-zA-Z0-9]/g, '_').replace(/^[^a-zA-Z_]/, 'n') || 'ns';
|
|
503
|
+
let p = seg, n = 2;
|
|
504
|
+
while (used.has(p))
|
|
505
|
+
p = seg + (n++);
|
|
506
|
+
nsToPrefix.set(ns, p);
|
|
507
|
+
used.add(p);
|
|
508
|
+
}
|
|
509
|
+
const prefixes = {};
|
|
510
|
+
for (const [ns, p] of [...nsToPrefix.entries()].sort((a, b) => a[1].localeCompare(b[1])))
|
|
511
|
+
prefixes[p] = ns;
|
|
512
|
+
const compress = (iri) => {
|
|
513
|
+
if (!iri.startsWith('http://') && !iri.startsWith('https://'))
|
|
514
|
+
return iri;
|
|
515
|
+
const ns = iriNamespace(iri);
|
|
516
|
+
const p = nsToPrefix.get(ns);
|
|
517
|
+
return p ? `${p}:${iri.slice(ns.length)}` : iri;
|
|
518
|
+
};
|
|
519
|
+
return { prefixes, compress };
|
|
520
|
+
}
|
|
521
|
+
function compressRecords(items, compress) {
|
|
522
|
+
return items.map(row => {
|
|
523
|
+
const out = {};
|
|
524
|
+
for (const [k, v] of Object.entries(row))
|
|
525
|
+
out[k] = typeof v === 'string' && (v.startsWith('http://') || v.startsWith('https://')) ? compress(v) : v;
|
|
526
|
+
return out;
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
async function dispatchTool(parsedArgs, name, args) {
|
|
530
|
+
const baseUrl = await resolveBaseUrl(parsedArgs);
|
|
531
|
+
if (name === 'oml_workspace') {
|
|
532
|
+
const { workspaceUri, roots } = await fetchWorkspace(baseUrl);
|
|
533
|
+
return jsonResult({ workspaceUri, roots });
|
|
534
|
+
}
|
|
535
|
+
if (name === 'oml_ontologies') {
|
|
536
|
+
const includeImports = args.includeImports === true;
|
|
537
|
+
const { workspaceUri } = await fetchWorkspace(baseUrl);
|
|
538
|
+
const ontologies = await fetchOntologies(baseUrl, workspaceUri, includeImports);
|
|
539
|
+
return jsonResult(paginate(ontologies, parsePageRequest(args)));
|
|
540
|
+
}
|
|
541
|
+
if (name === 'oml_members') {
|
|
542
|
+
const ontologyIri = resolveContext(args);
|
|
543
|
+
const kind = typeof args.kind === 'string' ? args.kind : 'all';
|
|
544
|
+
const KIND_TYPES = {
|
|
545
|
+
classes: ['oml:Concept', 'oml:Aspect', 'oml:RelationEntity', 'oml:Scalar'],
|
|
546
|
+
properties: ['oml:ScalarProperty', 'oml:AnnotationProperty', 'oml:ForwardRelation', 'oml:ReverseRelation', 'oml:UnreifiedRelation'],
|
|
547
|
+
instances: ['oml:ConceptInstance', 'oml:RelationInstance'],
|
|
548
|
+
};
|
|
549
|
+
const kindFilter = kind !== 'all' && KIND_TYPES[kind]
|
|
550
|
+
? `FILTER(?oml_type IN (${KIND_TYPES[kind].join(', ')}))`
|
|
551
|
+
: '';
|
|
552
|
+
const sparql = `
|
|
553
|
+
PREFIX oml: <http://opencaesar.io/oml#>
|
|
554
|
+
SELECT ?member ?oml_type ?rdfs_type
|
|
555
|
+
WHERE {
|
|
556
|
+
GRAPH ${escapeIri(ontologyIri)} {
|
|
557
|
+
?member a ?rdfs_type .
|
|
558
|
+
?member oml:type ?oml_type .
|
|
559
|
+
FILTER(?member != ${escapeIri(ontologyIri)})
|
|
560
|
+
${kindFilter}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
`;
|
|
564
|
+
const result = await runSparqlSelect(baseUrl, ontologyIri, sparql);
|
|
565
|
+
const bindings = Array.isArray(result?.results?.bindings) ? result.results.bindings : [];
|
|
566
|
+
const members = bindings
|
|
567
|
+
.map((binding) => ({
|
|
568
|
+
member: String(binding?.member?.value ?? ''),
|
|
569
|
+
oml_type: String(binding?.oml_type?.value ?? ''),
|
|
570
|
+
rdfs_type: binding?.rdfs_type?.value ? String(binding.rdfs_type.value) : undefined
|
|
571
|
+
}))
|
|
572
|
+
.filter((entry) => entry.member && entry.oml_type)
|
|
573
|
+
.sort((a, b) => a.member.localeCompare(b.member));
|
|
574
|
+
const page = paginate(members, parsePageRequest(args));
|
|
575
|
+
const allIris = page.items.flatMap((m) => [m.member, m.oml_type, m.rdfs_type].filter(Boolean));
|
|
576
|
+
const { prefixes, compress } = buildPrefixMap(allIris);
|
|
577
|
+
return jsonResult({ prefixes, items: compressRecords(page.items, compress), nextPageToken: page.nextPageToken, truncated: page.truncated });
|
|
578
|
+
}
|
|
579
|
+
if (name === 'oml_about') {
|
|
580
|
+
const ontologyIri = resolveContext(args);
|
|
581
|
+
const raw = args.members;
|
|
582
|
+
const memberIris = (Array.isArray(raw) ? raw : [raw])
|
|
583
|
+
.map((m) => String(m ?? '').trim())
|
|
584
|
+
.filter(Boolean);
|
|
585
|
+
if (memberIris.length === 0)
|
|
586
|
+
throw new Error('oml_about requires at least one member IRI.');
|
|
587
|
+
const values = memberIris.map((iri) => escapeIri(iri)).join(' ');
|
|
588
|
+
const sparql = `
|
|
589
|
+
CONSTRUCT { ?s ?p ?o }
|
|
590
|
+
WHERE {
|
|
591
|
+
{ VALUES ?s { ${values} } ?s ?p ?o }
|
|
592
|
+
UNION
|
|
593
|
+
{ VALUES ?o { ${values} } ?s ?p ?o }
|
|
594
|
+
}
|
|
595
|
+
`;
|
|
596
|
+
const turtle = await runSparqlGraph(baseUrl, ontologyIri, sparql);
|
|
597
|
+
return jsonResult({ turtle });
|
|
598
|
+
}
|
|
599
|
+
if (name === 'oml_shapes') {
|
|
600
|
+
const typeIri = String(args.type ?? '').trim();
|
|
601
|
+
if (!typeIri)
|
|
602
|
+
throw new Error('oml_shapes requires type IRI.');
|
|
603
|
+
const result = unwrapRestEnvelope(await restPostJson(baseUrl, '/v0/shapes', { type: typeIri }));
|
|
604
|
+
if (!result.success) {
|
|
605
|
+
return jsonResult(result, true);
|
|
606
|
+
}
|
|
607
|
+
const results = Array.isArray(result.results) ? result.results : [];
|
|
608
|
+
return jsonResult(paginate(results, parsePageRequest(args, 20)));
|
|
609
|
+
}
|
|
610
|
+
if (name === 'oml_assertions') {
|
|
611
|
+
const ontologyArg = typeof args.ontology === 'string' ? args.ontology.trim() : '';
|
|
612
|
+
const format = typeof args.format === 'string' ? args.format.toLowerCase() : 'ttl';
|
|
613
|
+
const body = { format, pretty: args.pretty !== false };
|
|
614
|
+
if (ontologyArg)
|
|
615
|
+
body.ontologyIri = ontologyArg;
|
|
616
|
+
const result = unwrapRestEnvelope(await restPostJson(baseUrl, '/v0/assertions', body));
|
|
617
|
+
return jsonResult(result);
|
|
618
|
+
}
|
|
619
|
+
if (name === 'oml_sparql') {
|
|
620
|
+
const ontologyIri = resolveContext(args);
|
|
621
|
+
const sparql = String(args.sparql ?? '').trim();
|
|
622
|
+
if (!sparql)
|
|
623
|
+
throw new Error('oml_sparql requires sparql.');
|
|
624
|
+
const kind = detectSparqlKind(sparql);
|
|
625
|
+
if (kind === 'select') {
|
|
626
|
+
const result = await runSparqlSelect(baseUrl, ontologyIri, sparql);
|
|
627
|
+
const bindings = Array.isArray(result?.results?.bindings) ? result.results.bindings : [];
|
|
628
|
+
const rows = bindings.map((binding) => {
|
|
629
|
+
const row = {};
|
|
630
|
+
for (const [key, valueObj] of Object.entries(binding)) {
|
|
631
|
+
row[key] = valueObj?.value;
|
|
632
|
+
}
|
|
633
|
+
return row;
|
|
634
|
+
});
|
|
635
|
+
const page = paginate(rows, parsePageRequest(args, 20));
|
|
636
|
+
const allIris = page.items.flatMap((row) => Object.values(row).filter((v) => typeof v === 'string' && (v.startsWith('http://') || v.startsWith('https://'))));
|
|
637
|
+
const { prefixes, compress } = buildPrefixMap(allIris);
|
|
638
|
+
return jsonResult({ kind, prefixes, items: compressRecords(page.items, compress), nextPageToken: page.nextPageToken, truncated: page.truncated });
|
|
639
|
+
}
|
|
640
|
+
if (kind === 'ask') {
|
|
641
|
+
const ask = await runSparqlSelect(baseUrl, ontologyIri, sparql);
|
|
642
|
+
return jsonResult({ kind, result: Boolean(ask?.boolean) });
|
|
643
|
+
}
|
|
644
|
+
if (kind === 'construct' || kind === 'describe') {
|
|
645
|
+
const turtle = await runSparqlGraph(baseUrl, ontologyIri, sparql);
|
|
646
|
+
return jsonResult({ kind, turtle });
|
|
647
|
+
}
|
|
648
|
+
throw new Error(`oml_sparql requires a SELECT, ASK, CONSTRUCT, or DESCRIBE query, but detected '${kind}'.`);
|
|
649
|
+
}
|
|
650
|
+
if (name === 'oml_paths') {
|
|
651
|
+
const ontologyIri = resolveContext(args);
|
|
652
|
+
const source = String(args.source ?? '').trim();
|
|
653
|
+
const target = String(args.target ?? '').trim();
|
|
654
|
+
if (!source || !target)
|
|
655
|
+
throw new Error('oml_paths requires source and target IRIs.');
|
|
656
|
+
const maxDepth = Math.max(1, Math.min(8, typeof args.maxDepth === 'number' ? Math.floor(args.maxDepth) : 4));
|
|
657
|
+
const visited = new Set([source]);
|
|
658
|
+
const parent = new Map();
|
|
659
|
+
let frontier = [source];
|
|
660
|
+
let found = false;
|
|
661
|
+
for (let depth = 0; depth < maxDepth && frontier.length > 0 && !found; depth += 1) {
|
|
662
|
+
const values = frontier.map((iri) => escapeIri(iri)).join(' ');
|
|
663
|
+
const sparql = `SELECT ?s ?p ?o WHERE { VALUES ?s { ${values} } ?s ?p ?o . FILTER(isIRI(?o)) }`;
|
|
664
|
+
const result = await runSparqlSelect(baseUrl, ontologyIri, sparql);
|
|
665
|
+
const bindings = Array.isArray(result?.results?.bindings) ? result.results.bindings : [];
|
|
666
|
+
const next = [];
|
|
667
|
+
for (const binding of bindings) {
|
|
668
|
+
const s = String(binding?.s?.value ?? '');
|
|
669
|
+
const p = String(binding?.p?.value ?? '');
|
|
670
|
+
const o = String(binding?.o?.value ?? '');
|
|
671
|
+
if (!s || !p || !o)
|
|
672
|
+
continue;
|
|
673
|
+
if (!visited.has(o)) {
|
|
674
|
+
visited.add(o);
|
|
675
|
+
parent.set(o, { from: s, predicate: p });
|
|
676
|
+
next.push(o);
|
|
677
|
+
if (o === target) {
|
|
678
|
+
found = true;
|
|
679
|
+
break;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
frontier = next;
|
|
684
|
+
}
|
|
685
|
+
if (!found)
|
|
686
|
+
return jsonResult({ prefixes: {}, items: [], truncated: false });
|
|
687
|
+
const triples = [];
|
|
688
|
+
let cursor = target;
|
|
689
|
+
while (cursor !== source) {
|
|
690
|
+
const step = parent.get(cursor);
|
|
691
|
+
if (!step)
|
|
692
|
+
break;
|
|
693
|
+
triples.push({ subject: step.from, predicate: step.predicate, object: cursor });
|
|
694
|
+
cursor = step.from;
|
|
695
|
+
}
|
|
696
|
+
triples.reverse();
|
|
697
|
+
const page = paginate(triples, parsePageRequest(args, 20));
|
|
698
|
+
const allIris = page.items.flatMap(t => [t.subject, t.predicate, t.object]);
|
|
699
|
+
const { prefixes, compress } = buildPrefixMap(allIris);
|
|
700
|
+
return jsonResult({ prefixes, items: page.items.map(t => ({ subject: compress(t.subject), predicate: compress(t.predicate), object: compress(t.object) })), nextPageToken: page.nextPageToken, truncated: page.truncated });
|
|
701
|
+
}
|
|
702
|
+
if (name === 'oml_search') {
|
|
703
|
+
const text = String(args.text ?? '').trim();
|
|
704
|
+
if (!text)
|
|
705
|
+
throw new Error('oml_search requires text.');
|
|
706
|
+
const fuzzy = unwrapRestEnvelope(await restPostJson(baseUrl, '/v0/fuzzysearch', { text, limit: 50 }));
|
|
707
|
+
if (fuzzy?.success === false) {
|
|
708
|
+
throw new Error(typeof fuzzy?.error === 'string' && fuzzy.error.trim().length > 0
|
|
709
|
+
? fuzzy.error
|
|
710
|
+
: 'fuzzysearch failed');
|
|
711
|
+
}
|
|
712
|
+
const candidates = Array.isArray(fuzzy?.candidates) ? fuzzy.candidates : [];
|
|
713
|
+
const items = candidates
|
|
714
|
+
.map((candidate) => ({
|
|
715
|
+
member: String(candidate?.member ?? ''),
|
|
716
|
+
confidence: Number(candidate?.score ?? 0),
|
|
717
|
+
label: typeof candidate?.label === 'string' ? candidate.label : undefined,
|
|
718
|
+
}))
|
|
719
|
+
.filter((item) => item.member);
|
|
720
|
+
return jsonResult(paginate(items, parsePageRequest(args, 12, 50)));
|
|
721
|
+
}
|
|
722
|
+
if (name === 'oml_update') {
|
|
723
|
+
const preview = args.preview === true;
|
|
724
|
+
const body = { ...args };
|
|
725
|
+
if (preview)
|
|
726
|
+
body.preview = true;
|
|
727
|
+
const result = unwrapRestEnvelope(await restPostJson(baseUrl, '/v0/update', body));
|
|
728
|
+
if (!preview && result && typeof result === 'object' && 'edit' in result) {
|
|
729
|
+
delete result.edit;
|
|
730
|
+
}
|
|
731
|
+
return jsonResult(result, result?.success === false);
|
|
732
|
+
}
|
|
733
|
+
if (name === 'oml_validate') {
|
|
734
|
+
const ontologyIris = toOntologyIriArray(args.ontologies);
|
|
735
|
+
const body = ontologyIris.length > 0 ? { ontologies: ontologyIris } : {};
|
|
736
|
+
const result = unwrapRestEnvelope(await restPostJson(baseUrl, '/v0/validate', body));
|
|
737
|
+
const problems = Array.isArray(result?.problems) ? result.problems : [];
|
|
738
|
+
const page = paginate(problems, parsePageRequest(args, 20));
|
|
739
|
+
return jsonResult({
|
|
740
|
+
success: result.success,
|
|
741
|
+
filesChecked: result.filesChecked,
|
|
742
|
+
errors: result.errors,
|
|
743
|
+
warnings: result.warnings,
|
|
744
|
+
problems: page.items,
|
|
745
|
+
nextPageToken: page.nextPageToken,
|
|
746
|
+
truncated: page.truncated
|
|
747
|
+
}, result?.success === false);
|
|
748
|
+
}
|
|
749
|
+
throw new Error(`Unknown tool: ${name}`);
|
|
750
|
+
}
|
|
751
|
+
export async function runMcpServer(argv = process.argv.slice(2)) {
|
|
752
|
+
const parsedArgs = parseArgs(argv);
|
|
753
|
+
const pkgPath = path.resolve(fileURLToPath(import.meta.url), '../..', 'package.json');
|
|
754
|
+
const { name, version } = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
|
|
755
|
+
const server = new Server({ name, version }, { capabilities: { tools: {} } });
|
|
756
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
757
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
758
|
+
try {
|
|
759
|
+
const { name, arguments: toolArgs } = request.params;
|
|
760
|
+
return await dispatchTool(parsedArgs, name, (toolArgs ?? {}));
|
|
761
|
+
}
|
|
762
|
+
catch (error) {
|
|
763
|
+
return textResult(error instanceof Error ? error.message : String(error), true);
|
|
764
|
+
}
|
|
765
|
+
});
|
|
766
|
+
const transport = new StdioServerTransport();
|
|
767
|
+
await server.connect(transport);
|
|
768
|
+
}
|
|
769
|
+
//# sourceMappingURL=main.js.map
|
package/out/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oml/mcp",
|
|
3
|
+
"description": "MCP bridge for the OML REST server",
|
|
4
|
+
"version": "0.15.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=20.10.0",
|
|
8
|
+
"npm": ">=10.2.3"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"bin",
|
|
12
|
+
"out",
|
|
13
|
+
"README.md",
|
|
14
|
+
"package.json"
|
|
15
|
+
],
|
|
16
|
+
"bin": {
|
|
17
|
+
"oml-mcp": "./bin/mcp.js"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"clean": "shx rm -fr *.tsbuildinfo out",
|
|
21
|
+
"build": "echo 'No build step'",
|
|
22
|
+
"build:clean": "npm run clean && npm run build"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"shx": "~0.4.0"
|
|
29
|
+
},
|
|
30
|
+
"volta": {
|
|
31
|
+
"node": "20.19.2",
|
|
32
|
+
"npm": "10.8.2"
|
|
33
|
+
}
|
|
34
|
+
}
|