@santi020k/lumen-mcp 0.1.0 → 0.3.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 +53 -9
- package/bin/lumen-mcp-http.mjs +20 -0
- package/bin/lumen-mcp-local.mjs +7 -6
- package/data/lumen-data.json +4303 -687
- package/dist/data.d.ts +26 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +2 -1
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +114 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +95 -3
- package/dist/tools.d.ts +52 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +232 -40
- package/package.json +11 -3
package/dist/data.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
export interface LumenCatalogManifest {
|
|
2
|
+
components: Record<string, string>;
|
|
3
|
+
recipes: Record<string, string>;
|
|
4
|
+
}
|
|
1
5
|
export interface LumenComponentSnapshot {
|
|
2
6
|
apiReference: {
|
|
3
7
|
attribute: string;
|
|
@@ -46,16 +50,20 @@ export interface LumenComponentSnapshot {
|
|
|
46
50
|
}[];
|
|
47
51
|
}
|
|
48
52
|
export interface LumenData {
|
|
53
|
+
catalogManifest: LumenCatalogManifest;
|
|
49
54
|
components: LumenComponentSnapshot[];
|
|
50
55
|
docs: {
|
|
51
56
|
aiUsage: string;
|
|
52
57
|
readme: string;
|
|
53
58
|
};
|
|
54
59
|
meta: {
|
|
60
|
+
catalogHash: string;
|
|
55
61
|
componentCount: number;
|
|
56
62
|
packages: string[];
|
|
63
|
+
packageVersions: Record<string, string>;
|
|
57
64
|
registryName: string;
|
|
58
65
|
registryVersion: number;
|
|
66
|
+
schemaVersion: number;
|
|
59
67
|
serverVersion: string;
|
|
60
68
|
};
|
|
61
69
|
recipes: LumenRecipeSnapshot[];
|
|
@@ -71,6 +79,24 @@ export type LumenFramework = 'astro' | 'elements' | 'react';
|
|
|
71
79
|
export interface LumenFrameworkSnapshot {
|
|
72
80
|
attributes?: string[];
|
|
73
81
|
available: boolean;
|
|
82
|
+
behavior?: {
|
|
83
|
+
controller?: {
|
|
84
|
+
defaultValue: string;
|
|
85
|
+
description: string;
|
|
86
|
+
name: string;
|
|
87
|
+
type: string;
|
|
88
|
+
}[];
|
|
89
|
+
description?: string;
|
|
90
|
+
hook?: string;
|
|
91
|
+
mode: 'adapter' | 'built-in' | 'hook' | 'registration' | 'runtime';
|
|
92
|
+
options?: {
|
|
93
|
+
defaultValue: string;
|
|
94
|
+
description: string;
|
|
95
|
+
name: string;
|
|
96
|
+
type: string;
|
|
97
|
+
}[];
|
|
98
|
+
setup: string;
|
|
99
|
+
};
|
|
74
100
|
example: string;
|
|
75
101
|
importStatement: string;
|
|
76
102
|
language: 'astro' | 'html' | 'tsx';
|
package/dist/data.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
|
package/dist/data.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
const dataUrl = new URL('../data/lumen-data.json', import.meta.url);
|
|
4
4
|
let cached;
|
|
5
5
|
export const loadLumenData = () => {
|
|
6
6
|
if (cached)
|
|
7
7
|
return cached;
|
|
8
|
+
const readFsFile = Reflect.get(fs, 'readFileSync');
|
|
8
9
|
const raw = readFsFile(fileURLToPath(dataUrl), 'utf8');
|
|
9
10
|
cached = JSON.parse(raw);
|
|
10
11
|
return cached;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,21 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'node:http';
|
|
1
2
|
export { loadLumenData } from './data.js';
|
|
2
3
|
export type { LumenData } from './data.js';
|
|
3
4
|
export { createLumenServer } from './server.js';
|
|
4
5
|
export * from './tools.js';
|
|
5
6
|
/** Start the Lumen MCP server over stdio. Called by the `lumen-mcp` bin. */
|
|
6
7
|
export declare const startLumenMcp: () => Promise<void>;
|
|
8
|
+
export interface LumenMcpHttpOptions {
|
|
9
|
+
allowedHosts?: string[] | undefined;
|
|
10
|
+
endpoint?: string | undefined;
|
|
11
|
+
host?: string | undefined;
|
|
12
|
+
port?: number | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface LumenMcpHttpServer {
|
|
15
|
+
close: () => Promise<void>;
|
|
16
|
+
httpServer: HttpServer;
|
|
17
|
+
url: URL;
|
|
18
|
+
}
|
|
19
|
+
/** Start a self-hostable Streamable HTTP transport. Defaults to loopback for safety. */
|
|
20
|
+
export declare const startLumenMcpHttp: (options?: LumenMcpHttpOptions) => Promise<LumenMcpHttpServer>;
|
|
7
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAYrD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,cAAc,YAAY,CAAA;AAE1B,4EAA4E;AAC5E,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAKlD,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,GAAG,CAAA;CACT;AAoDD,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,GAC5B,UAAS,mBAAwB,KAChC,OAAO,CAAC,kBAAkB,CA+F5B,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { createMcpExpressApp } from '@modelcontextprotocol/sdk/server/express.js';
|
|
1
2
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
|
|
2
4
|
import { createLumenServer } from './server.js';
|
|
3
5
|
export { loadLumenData } from './data.js';
|
|
4
6
|
export { createLumenServer } from './server.js';
|
|
@@ -9,3 +11,115 @@ export const startLumenMcp = async () => {
|
|
|
9
11
|
const transport = new StdioServerTransport();
|
|
10
12
|
await server.connect(transport);
|
|
11
13
|
};
|
|
14
|
+
const toWebRequest = (request, host, options) => {
|
|
15
|
+
const headers = new Headers();
|
|
16
|
+
for (const [name, value] of Object.entries(request.headers)) {
|
|
17
|
+
for (const item of Array.isArray(value) ? value : [value]) {
|
|
18
|
+
if (item !== undefined)
|
|
19
|
+
headers.append(name, item);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const hostHeader = request.headers.host ?? `${host}:${options.port ?? 3000}`;
|
|
23
|
+
const method = request.method;
|
|
24
|
+
return new Request(`http://${hostHeader}${request.url}`, {
|
|
25
|
+
headers,
|
|
26
|
+
method,
|
|
27
|
+
...(['GET', 'HEAD'].includes(method) ? {} : { body: JSON.stringify(request.body) })
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const streamResponse = async (webResponse, response) => {
|
|
31
|
+
response.statusCode = webResponse.status;
|
|
32
|
+
for (const [name, value] of webResponse.headers.entries())
|
|
33
|
+
response.setHeader(name, value);
|
|
34
|
+
if (!webResponse.body) {
|
|
35
|
+
response.end();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const reader = webResponse.body.getReader();
|
|
39
|
+
response.once('close', () => {
|
|
40
|
+
reader.cancel().catch(() => { });
|
|
41
|
+
});
|
|
42
|
+
while (!response.destroyed) {
|
|
43
|
+
const chunk = await reader.read();
|
|
44
|
+
if (chunk.done)
|
|
45
|
+
break;
|
|
46
|
+
response.write(Buffer.from(chunk.value));
|
|
47
|
+
}
|
|
48
|
+
if (!response.writableEnded)
|
|
49
|
+
response.end();
|
|
50
|
+
};
|
|
51
|
+
/** Start a self-hostable Streamable HTTP transport. Defaults to loopback for safety. */
|
|
52
|
+
export const startLumenMcpHttp = async (options = {}) => {
|
|
53
|
+
const host = options.host ?? '127.0.0.1';
|
|
54
|
+
const endpoint = options.endpoint ?? '/mcp';
|
|
55
|
+
const app = createMcpExpressApp({
|
|
56
|
+
host,
|
|
57
|
+
...(options.allowedHosts ? { allowedHosts: options.allowedHosts } : {})
|
|
58
|
+
});
|
|
59
|
+
const activeServers = new Set();
|
|
60
|
+
app.all(endpoint, async (request, response) => {
|
|
61
|
+
const mcpServer = createLumenServer();
|
|
62
|
+
const transport = new WebStandardStreamableHTTPServerTransport({
|
|
63
|
+
enableJsonResponse: true
|
|
64
|
+
});
|
|
65
|
+
activeServers.add(mcpServer);
|
|
66
|
+
try {
|
|
67
|
+
await mcpServer.connect(transport);
|
|
68
|
+
const webRequest = toWebRequest(request, host, options);
|
|
69
|
+
const webResponse = await transport.handleRequest(webRequest, {
|
|
70
|
+
parsedBody: request.body
|
|
71
|
+
});
|
|
72
|
+
await streamResponse(webResponse, response);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (response.headersSent)
|
|
76
|
+
throw error;
|
|
77
|
+
response.statusCode = 500;
|
|
78
|
+
response.setHeader('content-type', 'application/json');
|
|
79
|
+
response.end(JSON.stringify({
|
|
80
|
+
error: 'Lumen MCP HTTP request failed.',
|
|
81
|
+
message: String(error)
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
if (mcpServer.isConnected())
|
|
86
|
+
await mcpServer.close();
|
|
87
|
+
activeServers.delete(mcpServer);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
app.get('/health', (_request, response) => {
|
|
91
|
+
response.setHeader('content-type', 'application/json');
|
|
92
|
+
response.end(JSON.stringify({ status: 'ok' }));
|
|
93
|
+
});
|
|
94
|
+
const httpServer = await new Promise((resolve, reject) => {
|
|
95
|
+
const listener = app.listen(options.port ?? 3000, host);
|
|
96
|
+
listener.once('error', reject);
|
|
97
|
+
listener.once('listening', () => {
|
|
98
|
+
resolve(listener);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
const address = httpServer.address();
|
|
102
|
+
if (!address || typeof address === 'string') {
|
|
103
|
+
httpServer.close();
|
|
104
|
+
throw new Error('Could not resolve the Lumen MCP HTTP listening address.');
|
|
105
|
+
}
|
|
106
|
+
const url = new URL(`http://${host.includes(':') ? `[${host}]` : host}:${address.port}${endpoint}`);
|
|
107
|
+
return {
|
|
108
|
+
close: async () => {
|
|
109
|
+
await Promise.all([...activeServers].map(async (server) => {
|
|
110
|
+
if (server.isConnected())
|
|
111
|
+
await server.close();
|
|
112
|
+
}));
|
|
113
|
+
await new Promise((resolve, reject) => {
|
|
114
|
+
httpServer.close((error) => {
|
|
115
|
+
if (error)
|
|
116
|
+
reject(error);
|
|
117
|
+
else
|
|
118
|
+
resolve();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
},
|
|
122
|
+
httpServer,
|
|
123
|
+
url
|
|
124
|
+
};
|
|
125
|
+
};
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAA;AA2JrF,eAAO,MAAM,iBAAiB,QAAO,SAgTpC,CAAA"}
|
package/dist/server.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import * as z from 'zod';
|
|
3
3
|
import { loadLumenData } from './data.js';
|
|
4
|
-
import { getComponent, getRecipe, getRules, getTokens, listComponents, search } from './tools.js';
|
|
4
|
+
import { diagnose, diffCatalog, getCatalogManifest, getComponent, getMeta, getRecipe, getRules, getTokens, listComponents, search } from './tools.js';
|
|
5
5
|
const readOnlyAnnotations = {
|
|
6
6
|
idempotentHint: true,
|
|
7
7
|
openWorldHint: false,
|
|
@@ -55,6 +55,52 @@ const tokensOutputSchema = z.strictObject({
|
|
|
55
55
|
const rulesOutputSchema = z.strictObject({
|
|
56
56
|
rules: z.string().trim()
|
|
57
57
|
});
|
|
58
|
+
const metaOutputSchema = z.strictObject({
|
|
59
|
+
meta: z.strictObject({
|
|
60
|
+
catalogHash: z.string().trim().regex(/^[a-f0-9]{64}$/),
|
|
61
|
+
componentCount: z.int().min(0),
|
|
62
|
+
packages: z.array(z.string().trim()),
|
|
63
|
+
packageVersions: z.record(z.string(), z.string().trim()),
|
|
64
|
+
registryName: z.string().trim(),
|
|
65
|
+
registryVersion: z.int().min(1),
|
|
66
|
+
schemaVersion: z.int().min(1),
|
|
67
|
+
serverVersion: z.string().trim()
|
|
68
|
+
})
|
|
69
|
+
});
|
|
70
|
+
const catalogManifestSchema = z.strictObject({
|
|
71
|
+
components: z.record(z.string(), z.string().trim().regex(/^[a-f0-9]{64}$/)),
|
|
72
|
+
recipes: z.record(z.string(), z.string().trim().regex(/^[a-f0-9]{64}$/))
|
|
73
|
+
});
|
|
74
|
+
const catalogChangesSchema = z.strictObject({
|
|
75
|
+
added: z.array(z.string().trim()),
|
|
76
|
+
changed: z.array(z.string().trim()),
|
|
77
|
+
removed: z.array(z.string().trim()),
|
|
78
|
+
unchanged: z.array(z.string().trim())
|
|
79
|
+
});
|
|
80
|
+
const catalogManifestOutputSchema = z.strictObject({
|
|
81
|
+
catalogHash: z.string().trim().regex(/^[a-f0-9]{64}$/),
|
|
82
|
+
manifest: catalogManifestSchema,
|
|
83
|
+
schemaVersion: z.int().min(1)
|
|
84
|
+
});
|
|
85
|
+
const catalogDiffOutputSchema = z.strictObject({
|
|
86
|
+
components: catalogChangesSchema,
|
|
87
|
+
currentCatalogHash: z.string().trim().regex(/^[a-f0-9]{64}$/),
|
|
88
|
+
recipes: catalogChangesSchema,
|
|
89
|
+
unchanged: z.boolean()
|
|
90
|
+
});
|
|
91
|
+
const diagnosticsOutputSchema = z.strictObject({
|
|
92
|
+
checks: z.array(z.strictObject({
|
|
93
|
+
message: z.string().trim(),
|
|
94
|
+
name: z.string().trim(),
|
|
95
|
+
status: z.enum(['fail', 'pass'])
|
|
96
|
+
})),
|
|
97
|
+
frameworkCoverage: z.strictObject({
|
|
98
|
+
astro: z.int().min(0),
|
|
99
|
+
elements: z.int().min(0),
|
|
100
|
+
react: z.int().min(0)
|
|
101
|
+
}),
|
|
102
|
+
status: z.enum(['healthy', 'issues'])
|
|
103
|
+
});
|
|
58
104
|
const structuredData = (data) => typeof data === 'object' && data !== null
|
|
59
105
|
? data
|
|
60
106
|
: { value: data };
|
|
@@ -73,8 +119,8 @@ const jsonResource = (uri, data, mimeType = 'application/json') => ({
|
|
|
73
119
|
export const createLumenServer = () => {
|
|
74
120
|
const data = loadLumenData();
|
|
75
121
|
const server = new McpServer({ name: '@santi020k/lumen-mcp', version: data.meta.serverVersion }, {
|
|
76
|
-
instructions: 'Read lumen://rules before generating Lumen code. Search or list the catalog,
|
|
77
|
-
'the selected component for the target framework at usage detail before requesting source.'
|
|
122
|
+
instructions: 'Read lumen://meta, lumen://diagnostics, and lumen://rules before generating Lumen code. Search or list the catalog, ' +
|
|
123
|
+
'then inspect the selected component for the target framework at usage detail before requesting source.'
|
|
78
124
|
});
|
|
79
125
|
server.registerTool('lumen_list_components', {
|
|
80
126
|
annotations: readOnlyAnnotations,
|
|
@@ -129,6 +175,9 @@ export const createLumenServer = () => {
|
|
|
129
175
|
description: 'Rank natural-language matches across descriptions, categories, curated collections, ' +
|
|
130
176
|
'framework contracts, props, attributes, recipes, tokens, and agent rules.',
|
|
131
177
|
inputSchema: z.strictObject({
|
|
178
|
+
framework: z.enum(['astro', 'react', 'elements'])
|
|
179
|
+
.optional()
|
|
180
|
+
.meta({ description: 'Only search framework-specific component contracts for this target.' }),
|
|
132
181
|
limit: z.int().min(1).max(100)
|
|
133
182
|
.optional()
|
|
134
183
|
.meta({ description: 'Maximum results to return (1-100, default 20).' }),
|
|
@@ -137,6 +186,37 @@ export const createLumenServer = () => {
|
|
|
137
186
|
}),
|
|
138
187
|
outputSchema: searchOutputSchema
|
|
139
188
|
}, (args) => toMcpResult(search(args)));
|
|
189
|
+
server.registerTool('lumen_get_meta', {
|
|
190
|
+
annotations: readOnlyAnnotations,
|
|
191
|
+
description: 'Return snapshot provenance: server and package versions, schema version, component count, ' +
|
|
192
|
+
'and a deterministic catalog hash for freshness checks.',
|
|
193
|
+
inputSchema: z.strictObject({}),
|
|
194
|
+
outputSchema: metaOutputSchema
|
|
195
|
+
}, () => toMcpResult(getMeta()));
|
|
196
|
+
server.registerTool('lumen_get_catalog_manifest', {
|
|
197
|
+
annotations: readOnlyAnnotations,
|
|
198
|
+
description: 'Return stable per-component and per-recipe fingerprints that a client can retain for later change detection.',
|
|
199
|
+
inputSchema: z.strictObject({}),
|
|
200
|
+
outputSchema: catalogManifestOutputSchema
|
|
201
|
+
}, () => toMcpResult(getCatalogManifest()));
|
|
202
|
+
server.registerTool('lumen_diff_catalog', {
|
|
203
|
+
annotations: readOnlyAnnotations,
|
|
204
|
+
description: 'Compare a previously retained Lumen catalog manifest with the current snapshot and report added, changed, removed, and unchanged entries.',
|
|
205
|
+
inputSchema: z.strictObject({
|
|
206
|
+
baseline: catalogManifestSchema
|
|
207
|
+
.meta({ description: 'Manifest previously returned by lumen_get_catalog_manifest.' }),
|
|
208
|
+
baselineCatalogHash: z.string().trim().regex(/^[a-f0-9]{64}$/)
|
|
209
|
+
.optional()
|
|
210
|
+
.meta({ description: 'Optional previous catalog hash for a fast unchanged check.' })
|
|
211
|
+
}),
|
|
212
|
+
outputSchema: catalogDiffOutputSchema
|
|
213
|
+
}, (args) => toMcpResult(diffCatalog(args)));
|
|
214
|
+
server.registerTool('lumen_diagnose', {
|
|
215
|
+
annotations: readOnlyAnnotations,
|
|
216
|
+
description: 'Run deterministic snapshot integrity checks and report framework coverage. Useful when testing a new MCP connection.',
|
|
217
|
+
inputSchema: z.strictObject({}),
|
|
218
|
+
outputSchema: diagnosticsOutputSchema
|
|
219
|
+
}, () => toMcpResult(diagnose()));
|
|
140
220
|
server.registerTool('lumen_get_tokens', {
|
|
141
221
|
annotations: readOnlyAnnotations,
|
|
142
222
|
description: 'Return structured Lumen semantic tokens, base color values, glass tokens, and theme attribute.',
|
|
@@ -149,6 +229,18 @@ export const createLumenServer = () => {
|
|
|
149
229
|
inputSchema: z.strictObject({}),
|
|
150
230
|
outputSchema: rulesOutputSchema
|
|
151
231
|
}, () => toMcpResult(getRules()));
|
|
232
|
+
server.registerResource('lumen-meta', 'lumen://meta', {
|
|
233
|
+
description: 'Lumen MCP snapshot provenance and package versions.',
|
|
234
|
+
mimeType: 'application/json'
|
|
235
|
+
}, (uri) => jsonResource(uri, getMeta().data));
|
|
236
|
+
server.registerResource('lumen-catalog-manifest', 'lumen://catalog-manifest', {
|
|
237
|
+
description: 'Stable component and recipe fingerprints for catalog change detection.',
|
|
238
|
+
mimeType: 'application/json'
|
|
239
|
+
}, (uri) => jsonResource(uri, getCatalogManifest().data));
|
|
240
|
+
server.registerResource('lumen-diagnostics', 'lumen://diagnostics', {
|
|
241
|
+
description: 'Lumen MCP snapshot integrity checks and framework coverage.',
|
|
242
|
+
mimeType: 'application/json'
|
|
243
|
+
}, (uri) => jsonResource(uri, diagnose().data));
|
|
152
244
|
server.registerResource('lumen-rules', 'lumen://rules', {
|
|
153
245
|
description: 'Lumen agent rules (llms.txt).',
|
|
154
246
|
mimeType: 'text/markdown'
|
package/dist/tools.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type { LumenComponentSnapshot, LumenData, LumenFramework, LumenRecipeSnapshot } from './data.js';
|
|
1
|
+
import type { LumenCatalogManifest, LumenComponentSnapshot, LumenData, LumenFramework, LumenRecipeSnapshot } from './data.js';
|
|
2
|
+
export interface CatalogChanges {
|
|
3
|
+
added: string[];
|
|
4
|
+
changed: string[];
|
|
5
|
+
removed: string[];
|
|
6
|
+
unchanged: string[];
|
|
7
|
+
}
|
|
2
8
|
export type ComponentDetailLevel = 'source' | 'summary' | 'usage';
|
|
3
9
|
export interface ComponentSummary {
|
|
4
10
|
category: string;
|
|
@@ -46,6 +52,24 @@ declare const componentDetail: (component: LumenComponentSnapshot, framework: Lu
|
|
|
46
52
|
framework: {
|
|
47
53
|
attributes?: string[];
|
|
48
54
|
available: boolean;
|
|
55
|
+
behavior?: {
|
|
56
|
+
controller?: {
|
|
57
|
+
defaultValue: string;
|
|
58
|
+
description: string;
|
|
59
|
+
name: string;
|
|
60
|
+
type: string;
|
|
61
|
+
}[];
|
|
62
|
+
description?: string;
|
|
63
|
+
hook?: string;
|
|
64
|
+
mode: "adapter" | "built-in" | "hook" | "registration" | "runtime";
|
|
65
|
+
options?: {
|
|
66
|
+
defaultValue: string;
|
|
67
|
+
description: string;
|
|
68
|
+
name: string;
|
|
69
|
+
type: string;
|
|
70
|
+
}[];
|
|
71
|
+
setup: string;
|
|
72
|
+
};
|
|
49
73
|
example: string;
|
|
50
74
|
importStatement: string;
|
|
51
75
|
language: "astro" | "html" | "tsx";
|
|
@@ -119,6 +143,7 @@ export declare const getRecipe: (args: {
|
|
|
119
143
|
recipe?: LumenRecipeSnapshot;
|
|
120
144
|
}>;
|
|
121
145
|
export declare const search: (args: {
|
|
146
|
+
framework?: FrameworkFilter | undefined;
|
|
122
147
|
limit?: number | undefined;
|
|
123
148
|
query: string;
|
|
124
149
|
}, data?: LumenData) => LumenToolResult<{
|
|
@@ -126,6 +151,32 @@ export declare const search: (args: {
|
|
|
126
151
|
results: SearchResult[];
|
|
127
152
|
total: number;
|
|
128
153
|
}>;
|
|
154
|
+
export declare const getMeta: (data?: LumenData) => LumenToolResult<{
|
|
155
|
+
meta: LumenData["meta"];
|
|
156
|
+
}>;
|
|
157
|
+
export declare const getCatalogManifest: (data?: LumenData) => LumenToolResult<{
|
|
158
|
+
catalogHash: string;
|
|
159
|
+
manifest: LumenCatalogManifest;
|
|
160
|
+
schemaVersion: number;
|
|
161
|
+
}>;
|
|
162
|
+
export declare const diffCatalog: (args: {
|
|
163
|
+
baseline: LumenCatalogManifest;
|
|
164
|
+
baselineCatalogHash?: string | undefined;
|
|
165
|
+
}, data?: LumenData) => LumenToolResult<{
|
|
166
|
+
components: CatalogChanges;
|
|
167
|
+
currentCatalogHash: string;
|
|
168
|
+
recipes: CatalogChanges;
|
|
169
|
+
unchanged: boolean;
|
|
170
|
+
}>;
|
|
171
|
+
export declare const diagnose: (data?: LumenData) => LumenToolResult<{
|
|
172
|
+
checks: {
|
|
173
|
+
message: string;
|
|
174
|
+
name: string;
|
|
175
|
+
status: "fail" | "pass";
|
|
176
|
+
}[];
|
|
177
|
+
frameworkCoverage: Record<LumenFramework, number>;
|
|
178
|
+
status: "healthy" | "issues";
|
|
179
|
+
}>;
|
|
129
180
|
export declare const getTokens: (data?: LumenData) => LumenToolResult<{
|
|
130
181
|
tokens: LumenData["tokens"];
|
|
131
182
|
}>;
|
package/dist/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,SAAS,EACT,cAAc,EAEd,mBAAmB,EACpB,MAAM,WAAW,CAAA;AAGlB,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|