@revealui/mcp 0.1.10 → 0.2.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/LICENSE.commercial +90 -0
- package/README.md +5 -13
- package/dist/adapters/db.d.ts +16 -7
- package/dist/adapters/db.d.ts.map +1 -1
- package/dist/adapters/db.js +6 -24
- package/dist/adapters/db.js.map +1 -1
- package/dist/client.d.ts +307 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +492 -0
- package/dist/client.js.map +1 -0
- package/dist/hypervisor.d.ts +18 -0
- package/dist/hypervisor.d.ts.map +1 -1
- package/dist/hypervisor.js +83 -4
- package/dist/hypervisor.js.map +1 -1
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/metering.d.ts +59 -0
- package/dist/metering.d.ts.map +1 -0
- package/dist/metering.js +25 -0
- package/dist/metering.js.map +1 -0
- package/dist/oauth.d.ts +171 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +292 -0
- package/dist/oauth.js.map +1 -0
- package/dist/remote-client.d.ts +86 -0
- package/dist/remote-client.d.ts.map +1 -0
- package/dist/remote-client.js +130 -0
- package/dist/remote-client.js.map +1 -0
- package/dist/servers/adapter.d.ts.map +1 -1
- package/dist/servers/adapter.js +4 -0
- package/dist/servers/adapter.js.map +1 -1
- package/dist/servers/factories/revealui-content.d.ts +85 -0
- package/dist/servers/factories/revealui-content.d.ts.map +1 -0
- package/dist/servers/factories/revealui-content.js +471 -0
- package/dist/servers/factories/revealui-content.js.map +1 -0
- package/dist/servers/revealui-content.d.ts +12 -18
- package/dist/servers/revealui-content.d.ts.map +1 -1
- package/dist/servers/revealui-content.js +14 -220
- package/dist/servers/revealui-content.js.map +1 -1
- package/dist/servers/revealui-memory.d.ts +24 -0
- package/dist/servers/revealui-memory.d.ts.map +1 -0
- package/dist/servers/revealui-memory.js +339 -0
- package/dist/servers/revealui-memory.js.map +1 -0
- package/dist/streamable-http.d.ts +72 -0
- package/dist/streamable-http.d.ts.map +1 -0
- package/dist/streamable-http.js +120 -0
- package/dist/streamable-http.js.map +1 -0
- package/package.json +24 -11
- package/dist/stores/postgres-idempotency.d.ts +0 -32
- package/dist/stores/postgres-idempotency.d.ts.map +0 -1
- package/dist/stores/postgres-idempotency.js +0 -63
- package/dist/stores/postgres-idempotency.js.map +0 -1
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for the `revealui-content` MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Dual-mode template (Stage 1 PR-1.2 of the MCP v1 plan): this module owns
|
|
5
|
+
* the Server construction + request-handler wiring, decoupled from any
|
|
6
|
+
* transport. The stdio launcher at `./revealui-content.ts` and a future HTTP
|
|
7
|
+
* launcher both consume `createRevealuiContentServer()` to ensure a single
|
|
8
|
+
* source of truth for the tool surface.
|
|
9
|
+
*
|
|
10
|
+
* Tools exposed:
|
|
11
|
+
* revealui_list_sites — list all sites in the RevealUI instance
|
|
12
|
+
* revealui_list_content — list content entries for a site/collection
|
|
13
|
+
* revealui_get_content — fetch a single content entry by ID
|
|
14
|
+
* revealui_list_users — list users (admin only)
|
|
15
|
+
* revealui_site_stats — per-site user + content counts
|
|
16
|
+
*
|
|
17
|
+
* Resources (Stage 4.1 + 4.2): every CollectionConfig with `mcpResource !==
|
|
18
|
+
* false` is surfaced as an MCP resource under `revealui-content://<slug>/
|
|
19
|
+
* <id>`. The factory resolves the effective set via three tiers:
|
|
20
|
+
*
|
|
21
|
+
* 1. Injected `collectionsProvider` — in-process consumers (admin, agent
|
|
22
|
+
* runtime) pass a function that reads directly from the admin registry.
|
|
23
|
+
* 2. HTTP introspection — fetches `${REVEALUI_API_URL}/api/mcp/collections`
|
|
24
|
+
* with the configured API key. Used by out-of-process consumers that
|
|
25
|
+
* can reach a running admin.
|
|
26
|
+
* 3. Curated fallback — `posts`, `pages`, `products`, `media` with
|
|
27
|
+
* well-known title fields. Used when neither 1 nor 2 is available
|
|
28
|
+
* (airgapped dev, admin offline, credentials missing).
|
|
29
|
+
*
|
|
30
|
+
* Credentials are supplied by the hypervisor (or HTTP launcher wrapper)
|
|
31
|
+
* via `setCredentials()`. Falls back to `REVEALUI_API_URL` +
|
|
32
|
+
* `REVEALUI_API_KEY` env vars when no override is set.
|
|
33
|
+
*/
|
|
34
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
35
|
+
/**
|
|
36
|
+
* Set credential overrides for this server. Called by the hypervisor with
|
|
37
|
+
* resolved tenant credentials (or by an HTTP launcher before handing the
|
|
38
|
+
* server to the handler).
|
|
39
|
+
*
|
|
40
|
+
* Credentials set here are process-global (module-level state). Multi-tenant
|
|
41
|
+
* HTTP deployments that need per-session credentials should either:
|
|
42
|
+
* (a) instantiate the server inside `createServer` per call, passing the
|
|
43
|
+
* credentials into closure scope, OR
|
|
44
|
+
* (b) use the hypervisor's tenant-scoped credential resolver.
|
|
45
|
+
*/
|
|
46
|
+
export declare function setCredentials(creds: Record<string, string>): void;
|
|
47
|
+
/**
|
|
48
|
+
* MCP-facing summary of a content collection. Wire-compatible with the shape
|
|
49
|
+
* returned by `GET /api/mcp/collections` on the admin app.
|
|
50
|
+
*/
|
|
51
|
+
export interface CollectionMcpSummary {
|
|
52
|
+
/** Collection slug. */
|
|
53
|
+
slug: string;
|
|
54
|
+
/** Human-readable singular label (e.g. `Post`). */
|
|
55
|
+
label: string;
|
|
56
|
+
/** Human-readable plural label, when known. */
|
|
57
|
+
labelPlural?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Resolved MCP-resource flag. Only collections with `mcpResource: true`
|
|
60
|
+
* are surfaced as resources.
|
|
61
|
+
*/
|
|
62
|
+
mcpResource: boolean;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Injection point for in-process consumers. Returning `null` signals the
|
|
66
|
+
* factory to try the next tier (HTTP, then curated).
|
|
67
|
+
*/
|
|
68
|
+
export type CollectionsProvider = () => Promise<CollectionMcpSummary[] | null>;
|
|
69
|
+
export interface CreateRevealuiContentServerOptions {
|
|
70
|
+
/**
|
|
71
|
+
* Optional provider used to resolve the list of collections exposed as
|
|
72
|
+
* MCP resources. When provided, skips HTTP introspection. In-process
|
|
73
|
+
* admin or agent-runtime consumers wire this to read the registry
|
|
74
|
+
* directly; out-of-process subprocess consumers leave it unset.
|
|
75
|
+
*/
|
|
76
|
+
collectionsProvider?: CollectionsProvider;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create a fresh `revealui-content` MCP Server instance. Safe to call
|
|
80
|
+
* multiple times — each call returns an independent Server with its own
|
|
81
|
+
* request handlers registered. Dual-mode launchers (stdio, Streamable HTTP)
|
|
82
|
+
* consume this factory; the factory itself is transport-agnostic.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createRevealuiContentServer(options?: CreateRevealuiContentServerOptions): Server;
|
|
85
|
+
//# sourceMappingURL=revealui-content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revealui-content.d.ts","sourceRoot":"","sources":["../../../src/servers/factories/revealui-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAkBnE;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAElE;AAkID;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,CAAC;AAE/E,MAAM,WAAW,kCAAkC;IACjD;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAuID;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,MAAM,CAyOhG"}
|
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for the `revealui-content` MCP server.
|
|
3
|
+
*
|
|
4
|
+
* Dual-mode template (Stage 1 PR-1.2 of the MCP v1 plan): this module owns
|
|
5
|
+
* the Server construction + request-handler wiring, decoupled from any
|
|
6
|
+
* transport. The stdio launcher at `./revealui-content.ts` and a future HTTP
|
|
7
|
+
* launcher both consume `createRevealuiContentServer()` to ensure a single
|
|
8
|
+
* source of truth for the tool surface.
|
|
9
|
+
*
|
|
10
|
+
* Tools exposed:
|
|
11
|
+
* revealui_list_sites — list all sites in the RevealUI instance
|
|
12
|
+
* revealui_list_content — list content entries for a site/collection
|
|
13
|
+
* revealui_get_content — fetch a single content entry by ID
|
|
14
|
+
* revealui_list_users — list users (admin only)
|
|
15
|
+
* revealui_site_stats — per-site user + content counts
|
|
16
|
+
*
|
|
17
|
+
* Resources (Stage 4.1 + 4.2): every CollectionConfig with `mcpResource !==
|
|
18
|
+
* false` is surfaced as an MCP resource under `revealui-content://<slug>/
|
|
19
|
+
* <id>`. The factory resolves the effective set via three tiers:
|
|
20
|
+
*
|
|
21
|
+
* 1. Injected `collectionsProvider` — in-process consumers (admin, agent
|
|
22
|
+
* runtime) pass a function that reads directly from the admin registry.
|
|
23
|
+
* 2. HTTP introspection — fetches `${REVEALUI_API_URL}/api/mcp/collections`
|
|
24
|
+
* with the configured API key. Used by out-of-process consumers that
|
|
25
|
+
* can reach a running admin.
|
|
26
|
+
* 3. Curated fallback — `posts`, `pages`, `products`, `media` with
|
|
27
|
+
* well-known title fields. Used when neither 1 nor 2 is available
|
|
28
|
+
* (airgapped dev, admin offline, credentials missing).
|
|
29
|
+
*
|
|
30
|
+
* Credentials are supplied by the hypervisor (or HTTP launcher wrapper)
|
|
31
|
+
* via `setCredentials()`. Falls back to `REVEALUI_API_URL` +
|
|
32
|
+
* `REVEALUI_API_KEY` env vars when no override is set.
|
|
33
|
+
*/
|
|
34
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
35
|
+
import { CallToolRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Credential overrides (set by hypervisor / HTTP launcher)
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
let _credentialOverrides = {};
|
|
40
|
+
/**
|
|
41
|
+
* Set credential overrides for this server. Called by the hypervisor with
|
|
42
|
+
* resolved tenant credentials (or by an HTTP launcher before handing the
|
|
43
|
+
* server to the handler).
|
|
44
|
+
*
|
|
45
|
+
* Credentials set here are process-global (module-level state). Multi-tenant
|
|
46
|
+
* HTTP deployments that need per-session credentials should either:
|
|
47
|
+
* (a) instantiate the server inside `createServer` per call, passing the
|
|
48
|
+
* credentials into closure scope, OR
|
|
49
|
+
* (b) use the hypervisor's tenant-scoped credential resolver.
|
|
50
|
+
*/
|
|
51
|
+
export function setCredentials(creds) {
|
|
52
|
+
_credentialOverrides = creds;
|
|
53
|
+
}
|
|
54
|
+
function resolveCredentials() {
|
|
55
|
+
const apiUrl = (_credentialOverrides.REVEALUI_API_URL ?? process.env.REVEALUI_API_URL)?.replace(/\/$/, '');
|
|
56
|
+
const apiKey = _credentialOverrides.REVEALUI_API_KEY ?? process.env.REVEALUI_API_KEY;
|
|
57
|
+
return { apiUrl, apiKey };
|
|
58
|
+
}
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// API helpers (shared across tool handlers)
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
function apiHeaders(apiKey) {
|
|
63
|
+
return {
|
|
64
|
+
Authorization: `Bearer ${apiKey}`,
|
|
65
|
+
'Content-Type': 'application/json',
|
|
66
|
+
'User-Agent': 'RevealUI-MCP/1.0',
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function apiGet(baseUrl, apiKey, path, params) {
|
|
70
|
+
const url = new URL(`${baseUrl}${path}`);
|
|
71
|
+
if (params) {
|
|
72
|
+
for (const [k, v] of Object.entries(params))
|
|
73
|
+
url.searchParams.set(k, v);
|
|
74
|
+
}
|
|
75
|
+
const res = await fetch(url.toString(), { headers: apiHeaders(apiKey) });
|
|
76
|
+
const body = await res.json();
|
|
77
|
+
if (!res.ok) {
|
|
78
|
+
throw new Error(body.error ??
|
|
79
|
+
body.message ??
|
|
80
|
+
`API ${res.status}`);
|
|
81
|
+
}
|
|
82
|
+
return body;
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Tool definitions
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
const TOOLS = [
|
|
88
|
+
{
|
|
89
|
+
name: 'revealui_list_sites',
|
|
90
|
+
description: 'List all sites registered in the RevealUI instance.',
|
|
91
|
+
inputSchema: {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {
|
|
94
|
+
limit: { type: 'number', description: 'Max results to return (default: 20)', default: 20 },
|
|
95
|
+
page: {
|
|
96
|
+
type: 'number',
|
|
97
|
+
description: 'Page number for pagination (default: 1)',
|
|
98
|
+
default: 1,
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'revealui_list_content',
|
|
105
|
+
description: 'List content entries for a site from a given collection (e.g. posts, pages, products).',
|
|
106
|
+
inputSchema: {
|
|
107
|
+
type: 'object',
|
|
108
|
+
properties: {
|
|
109
|
+
site_id: { type: 'string', description: 'Site ID to query content from' },
|
|
110
|
+
collection: {
|
|
111
|
+
type: 'string',
|
|
112
|
+
description: 'Collection slug (e.g. "posts", "pages", "products")',
|
|
113
|
+
},
|
|
114
|
+
limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },
|
|
115
|
+
page: { type: 'number', description: 'Page number (default: 1)', default: 1 },
|
|
116
|
+
status: { type: 'string', description: 'Filter by status: published, draft, archived' },
|
|
117
|
+
},
|
|
118
|
+
required: ['collection'],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
name: 'revealui_get_content',
|
|
123
|
+
description: 'Fetch a single content entry by its ID.',
|
|
124
|
+
inputSchema: {
|
|
125
|
+
type: 'object',
|
|
126
|
+
properties: {
|
|
127
|
+
collection: { type: 'string', description: 'Collection slug (e.g. "posts")' },
|
|
128
|
+
id: { type: 'string', description: 'Content entry ID' },
|
|
129
|
+
},
|
|
130
|
+
required: ['collection', 'id'],
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'revealui_list_users',
|
|
135
|
+
description: 'List users registered in RevealUI. Requires admin API key. ' +
|
|
136
|
+
'Returns email, role, and account status.',
|
|
137
|
+
inputSchema: {
|
|
138
|
+
type: 'object',
|
|
139
|
+
properties: {
|
|
140
|
+
site_id: { type: 'string', description: 'Filter users by site ID' },
|
|
141
|
+
limit: { type: 'number', description: 'Max results (default: 20)', default: 20 },
|
|
142
|
+
page: { type: 'number', description: 'Page number (default: 1)', default: 1 },
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: 'revealui_site_stats',
|
|
148
|
+
description: 'Get aggregate stats for a RevealUI site: user count, content count per collection, and license tier.',
|
|
149
|
+
inputSchema: {
|
|
150
|
+
type: 'object',
|
|
151
|
+
properties: {
|
|
152
|
+
site_id: {
|
|
153
|
+
type: 'string',
|
|
154
|
+
description: 'Site ID to fetch stats for (omit for global stats)',
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
/**
|
|
161
|
+
* Curated fallback used when neither an injected provider nor HTTP
|
|
162
|
+
* introspection is available. These four collections exist in every admin
|
|
163
|
+
* instance shipped today and have stable well-known title fields.
|
|
164
|
+
*/
|
|
165
|
+
const CURATED_FALLBACK = [
|
|
166
|
+
{ slug: 'posts', label: 'Post', labelPlural: 'Posts', mcpResource: true },
|
|
167
|
+
{ slug: 'pages', label: 'Page', labelPlural: 'Pages', mcpResource: true },
|
|
168
|
+
{ slug: 'products', label: 'Product', labelPlural: 'Products', mcpResource: true },
|
|
169
|
+
{ slug: 'media', label: 'Media', mcpResource: true },
|
|
170
|
+
];
|
|
171
|
+
/**
|
|
172
|
+
* Well-known title-field overrides by slug. Collections listed here pick
|
|
173
|
+
* their title from the named field; unknown collections fall back to a
|
|
174
|
+
* cascade (`title` → `name` → `filename` → `label` → id).
|
|
175
|
+
*/
|
|
176
|
+
const TITLE_FIELD_OVERRIDES = {
|
|
177
|
+
posts: 'title',
|
|
178
|
+
pages: 'title',
|
|
179
|
+
products: 'name',
|
|
180
|
+
media: 'filename',
|
|
181
|
+
};
|
|
182
|
+
const TITLE_FIELD_CASCADE = ['title', 'name', 'filename', 'label'];
|
|
183
|
+
/** URI scheme for Stage 4.1. Stage 4.2 leaves this stable; a `revealui://
|
|
184
|
+
* <tenant>/<collection>/<id>` variant is parked for a future design call. */
|
|
185
|
+
const RESOURCE_URI_PREFIX = 'revealui-content://';
|
|
186
|
+
/** Max rows per collection surfaced in a single `resources/list` response. */
|
|
187
|
+
const DEFAULT_RESOURCE_PAGE_SIZE = 50;
|
|
188
|
+
/** Extract rows from one of several shapes the RevealUI content API uses. */
|
|
189
|
+
function extractDocs(body) {
|
|
190
|
+
if (!body || typeof body !== 'object')
|
|
191
|
+
return [];
|
|
192
|
+
const b = body;
|
|
193
|
+
if (Array.isArray(b.docs))
|
|
194
|
+
return b.docs;
|
|
195
|
+
if (Array.isArray(b.items))
|
|
196
|
+
return b.items;
|
|
197
|
+
if (Array.isArray(b.data))
|
|
198
|
+
return b.data;
|
|
199
|
+
if (b.data && typeof b.data === 'object' && Array.isArray(b.data.docs)) {
|
|
200
|
+
return b.data.docs;
|
|
201
|
+
}
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
function pickTitle(row, collectionSlug) {
|
|
205
|
+
const override = TITLE_FIELD_OVERRIDES[collectionSlug];
|
|
206
|
+
if (override) {
|
|
207
|
+
const raw = row[override];
|
|
208
|
+
if (typeof raw === 'string' && raw.length > 0)
|
|
209
|
+
return raw;
|
|
210
|
+
}
|
|
211
|
+
for (const field of TITLE_FIELD_CASCADE) {
|
|
212
|
+
const raw = row[field];
|
|
213
|
+
if (typeof raw === 'string' && raw.length > 0)
|
|
214
|
+
return raw;
|
|
215
|
+
}
|
|
216
|
+
return String(row.id);
|
|
217
|
+
}
|
|
218
|
+
function resourceForRow(summary, row) {
|
|
219
|
+
const id = String(row.id);
|
|
220
|
+
const description = summary.labelPlural ?? `${summary.label} collection`;
|
|
221
|
+
return {
|
|
222
|
+
uri: `${RESOURCE_URI_PREFIX}${summary.slug}/${id}`,
|
|
223
|
+
name: `${summary.slug}/${pickTitle(row, summary.slug)}`,
|
|
224
|
+
description: `${description} (id: ${id})`,
|
|
225
|
+
mimeType: 'application/json',
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function parseResourceUri(uri) {
|
|
229
|
+
if (!uri.startsWith(RESOURCE_URI_PREFIX))
|
|
230
|
+
return null;
|
|
231
|
+
const rest = uri.slice(RESOURCE_URI_PREFIX.length);
|
|
232
|
+
const slash = rest.indexOf('/');
|
|
233
|
+
if (slash < 1 || slash === rest.length - 1)
|
|
234
|
+
return null;
|
|
235
|
+
const collection = rest.slice(0, slash);
|
|
236
|
+
const id = rest.slice(slash + 1);
|
|
237
|
+
if (!/^[a-z][a-z0-9-]*$/.test(collection))
|
|
238
|
+
return null;
|
|
239
|
+
if (!/^[A-Za-z0-9_-]+$/.test(id))
|
|
240
|
+
return null;
|
|
241
|
+
return { collection, id };
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Fetch collection summaries from the admin introspection endpoint.
|
|
245
|
+
* Returns `null` on any failure (network, non-200, malformed body) —
|
|
246
|
+
* callers fall back to the curated set.
|
|
247
|
+
*/
|
|
248
|
+
async function fetchCollectionsFromAdmin(apiUrl, apiKey) {
|
|
249
|
+
try {
|
|
250
|
+
const res = await fetch(`${apiUrl}/api/mcp/collections`, {
|
|
251
|
+
headers: apiHeaders(apiKey),
|
|
252
|
+
});
|
|
253
|
+
if (!res.ok)
|
|
254
|
+
return null;
|
|
255
|
+
const body = (await res.json());
|
|
256
|
+
if (!Array.isArray(body.collections))
|
|
257
|
+
return null;
|
|
258
|
+
const out = [];
|
|
259
|
+
for (const raw of body.collections) {
|
|
260
|
+
if (!raw || typeof raw !== 'object')
|
|
261
|
+
continue;
|
|
262
|
+
const r = raw;
|
|
263
|
+
if (typeof r.slug !== 'string' || r.slug.length === 0)
|
|
264
|
+
continue;
|
|
265
|
+
if (typeof r.label !== 'string' || r.label.length === 0)
|
|
266
|
+
continue;
|
|
267
|
+
if (typeof r.mcpResource !== 'boolean')
|
|
268
|
+
continue;
|
|
269
|
+
out.push({
|
|
270
|
+
slug: r.slug,
|
|
271
|
+
label: r.label,
|
|
272
|
+
labelPlural: typeof r.labelPlural === 'string' ? r.labelPlural : undefined,
|
|
273
|
+
mcpResource: r.mcpResource,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
return out;
|
|
277
|
+
// empty-catch-ok: network/auth/schema errors fall back to curated set
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
// Factory
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
/**
|
|
287
|
+
* Create a fresh `revealui-content` MCP Server instance. Safe to call
|
|
288
|
+
* multiple times — each call returns an independent Server with its own
|
|
289
|
+
* request handlers registered. Dual-mode launchers (stdio, Streamable HTTP)
|
|
290
|
+
* consume this factory; the factory itself is transport-agnostic.
|
|
291
|
+
*/
|
|
292
|
+
export function createRevealuiContentServer(options) {
|
|
293
|
+
const server = new Server({ name: 'revealui-content', version: '1.0.0' }, { capabilities: { tools: {}, resources: {} } });
|
|
294
|
+
// Per-server memoization: resolve the effective collection set once and
|
|
295
|
+
// reuse across `resources/list` + `resources/read` for the lifetime of the
|
|
296
|
+
// server instance. Avoids double-fetching on every read.
|
|
297
|
+
let cachedCollections = null;
|
|
298
|
+
async function resolveCollections() {
|
|
299
|
+
if (cachedCollections)
|
|
300
|
+
return cachedCollections;
|
|
301
|
+
// Tier 1: injected provider (in-process consumers).
|
|
302
|
+
if (options?.collectionsProvider) {
|
|
303
|
+
const fromProvider = await options.collectionsProvider().catch(() => null);
|
|
304
|
+
if (fromProvider) {
|
|
305
|
+
cachedCollections = fromProvider.filter((c) => c.mcpResource);
|
|
306
|
+
return cachedCollections;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// Tier 2: HTTP introspection against admin.
|
|
310
|
+
const { apiUrl, apiKey } = resolveCredentials();
|
|
311
|
+
if (apiUrl && apiKey) {
|
|
312
|
+
const fromHttp = await fetchCollectionsFromAdmin(apiUrl, apiKey);
|
|
313
|
+
if (fromHttp) {
|
|
314
|
+
cachedCollections = fromHttp.filter((c) => c.mcpResource);
|
|
315
|
+
return cachedCollections;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Tier 3: curated fallback.
|
|
319
|
+
cachedCollections = [...CURATED_FALLBACK];
|
|
320
|
+
return cachedCollections;
|
|
321
|
+
}
|
|
322
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
323
|
+
// -------------------------------------------------------------------------
|
|
324
|
+
// Resources (Stage 4.1 + 4.2)
|
|
325
|
+
// -------------------------------------------------------------------------
|
|
326
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => {
|
|
327
|
+
const { apiUrl, apiKey } = resolveCredentials();
|
|
328
|
+
if (!(apiUrl && apiKey)) {
|
|
329
|
+
// Without credentials the server can't enumerate rows; advertise an
|
|
330
|
+
// empty list rather than erroring — clients still see the resources
|
|
331
|
+
// capability and can retry once creds are set.
|
|
332
|
+
return { resources: [] };
|
|
333
|
+
}
|
|
334
|
+
const collections = await resolveCollections();
|
|
335
|
+
const resources = [];
|
|
336
|
+
for (const collection of collections) {
|
|
337
|
+
try {
|
|
338
|
+
const body = await apiGet(apiUrl, apiKey, `/api/${collection.slug}`, {
|
|
339
|
+
limit: String(DEFAULT_RESOURCE_PAGE_SIZE),
|
|
340
|
+
page: '1',
|
|
341
|
+
});
|
|
342
|
+
for (const row of extractDocs(body)) {
|
|
343
|
+
resources.push(resourceForRow(collection, row));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// empty-catch-ok: an unavailable collection shouldn't blank-out the entire resource list
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return { resources };
|
|
351
|
+
});
|
|
352
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
353
|
+
const parsed = parseResourceUri(request.params.uri);
|
|
354
|
+
if (!parsed) {
|
|
355
|
+
throw new Error(`Unknown resource URI (expected ${RESOURCE_URI_PREFIX}<collection>/<id>): ${request.params.uri}`);
|
|
356
|
+
}
|
|
357
|
+
const collections = await resolveCollections();
|
|
358
|
+
const collection = collections.find((c) => c.slug === parsed.collection);
|
|
359
|
+
if (!collection) {
|
|
360
|
+
throw new Error(`Collection is not exposed as a resource: ${parsed.collection}`);
|
|
361
|
+
}
|
|
362
|
+
const { apiUrl, apiKey } = resolveCredentials();
|
|
363
|
+
if (!(apiUrl && apiKey)) {
|
|
364
|
+
throw new Error('REVEALUI_API_URL and REVEALUI_API_KEY must be set');
|
|
365
|
+
}
|
|
366
|
+
const row = await apiGet(apiUrl, apiKey, `/api/${parsed.collection}/${parsed.id}`);
|
|
367
|
+
return {
|
|
368
|
+
contents: [
|
|
369
|
+
{
|
|
370
|
+
uri: request.params.uri,
|
|
371
|
+
mimeType: 'application/json',
|
|
372
|
+
text: JSON.stringify(row, null, 2),
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
};
|
|
376
|
+
});
|
|
377
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
378
|
+
const startTime = Date.now();
|
|
379
|
+
const toolName = request.params.name;
|
|
380
|
+
const { apiUrl, apiKey } = resolveCredentials();
|
|
381
|
+
if (!(apiUrl && apiKey)) {
|
|
382
|
+
return {
|
|
383
|
+
content: [
|
|
384
|
+
{ type: 'text', text: 'Error: REVEALUI_API_URL and REVEALUI_API_KEY must be set' },
|
|
385
|
+
],
|
|
386
|
+
isError: true,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
try {
|
|
390
|
+
let data;
|
|
391
|
+
switch (toolName) {
|
|
392
|
+
case 'revealui_list_sites': {
|
|
393
|
+
const { limit = 20, page = 1 } = request.params.arguments;
|
|
394
|
+
data = await apiGet(apiUrl, apiKey, '/api/sites', {
|
|
395
|
+
limit: String(limit),
|
|
396
|
+
page: String(page),
|
|
397
|
+
});
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
case 'revealui_list_content': {
|
|
401
|
+
const { site_id, collection, limit = 20, page = 1, status, } = request.params.arguments;
|
|
402
|
+
const params = {
|
|
403
|
+
limit: String(limit),
|
|
404
|
+
page: String(page),
|
|
405
|
+
};
|
|
406
|
+
if (site_id)
|
|
407
|
+
params.siteId = site_id;
|
|
408
|
+
if (status)
|
|
409
|
+
params.status = status;
|
|
410
|
+
data = await apiGet(apiUrl, apiKey, `/api/${collection}`, params);
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
case 'revealui_get_content': {
|
|
414
|
+
const { collection, id } = request.params.arguments;
|
|
415
|
+
data = await apiGet(apiUrl, apiKey, `/api/${collection}/${id}`);
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
case 'revealui_list_users': {
|
|
419
|
+
const { site_id, limit = 20, page = 1, } = request.params.arguments;
|
|
420
|
+
const params = {
|
|
421
|
+
limit: String(limit),
|
|
422
|
+
page: String(page),
|
|
423
|
+
};
|
|
424
|
+
if (site_id)
|
|
425
|
+
params.siteId = site_id;
|
|
426
|
+
data = await apiGet(apiUrl, apiKey, '/api/users', params);
|
|
427
|
+
break;
|
|
428
|
+
}
|
|
429
|
+
case 'revealui_site_stats': {
|
|
430
|
+
const { site_id } = request.params.arguments;
|
|
431
|
+
const params = {};
|
|
432
|
+
if (site_id)
|
|
433
|
+
params.siteId = site_id;
|
|
434
|
+
data = await apiGet(apiUrl, apiKey, '/api/health', params);
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
default:
|
|
438
|
+
return {
|
|
439
|
+
content: [{ type: 'text', text: `Error: Unknown tool: ${toolName}` }],
|
|
440
|
+
isError: true,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
content: [
|
|
445
|
+
{
|
|
446
|
+
type: 'text',
|
|
447
|
+
text: JSON.stringify({
|
|
448
|
+
data,
|
|
449
|
+
_meta: {
|
|
450
|
+
durationMs: Date.now() - startTime,
|
|
451
|
+
server: 'revealui-content',
|
|
452
|
+
tool: toolName,
|
|
453
|
+
timestamp: new Date().toISOString(),
|
|
454
|
+
},
|
|
455
|
+
}, null, 2),
|
|
456
|
+
},
|
|
457
|
+
],
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
catch (err) {
|
|
461
|
+
return {
|
|
462
|
+
content: [
|
|
463
|
+
{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` },
|
|
464
|
+
],
|
|
465
|
+
isError: true,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
return server;
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=revealui-content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revealui-content.js","sourceRoot":"","sources":["../../../src/servers/factories/revealui-content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAEL,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,EAEtB,yBAAyB,GAG1B,MAAM,oCAAoC,CAAC;AAE5C,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;AAE9E,IAAI,oBAAoB,GAA2B,EAAE,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,KAA6B;IAC1D,oBAAoB,GAAG,KAAK,CAAC;AAC/B,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,MAAM,GAAG,CAAC,oBAAoB,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAC7F,KAAK,EACL,EAAE,CACH,CAAC;IACF,MAAM,MAAM,GAAG,oBAAoB,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IACrF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,SAAS,UAAU,CAAC,MAAc;IAChC,OAAO;QACL,aAAa,EAAE,UAAU,MAAM,EAAE;QACjC,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,kBAAkB;KACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,OAAe,EACf,MAAc,EACd,IAAY,EACZ,MAA+B;IAE/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACZ,IAA6C,CAAC,KAAK;YACjD,IAA6B,CAAC,OAAO;YACtC,OAAO,GAAG,CAAC,MAAM,EAAE,CACtB,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,KAAK,GAAW;IACpB;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC1F,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yCAAyC;oBACtD,OAAO,EAAE,CAAC;iBACX;aACF;SACF;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EACT,wFAAwF;QAC1F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;gBACzE,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qDAAqD;iBACnE;gBACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,EAAE,EAAE;gBAChF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC,EAAE;gBAC7E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8CAA8C,EAAE;aACxF;YACD,QAAQ,EAAE,CAAC,YAAY,CAAC;SACzB;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,yCAAyC;QACtD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE;gBAC7E,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;aACxD;YACD,QAAQ,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC;SAC/B;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,6DAA6D;YAC7D,0CAA0C;QAC5C,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;gBACnE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,EAAE,EAAE;gBAChF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,OAAO,EAAE,CAAC,EAAE;aAC9E;SACF;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,sGAAsG;QACxG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,oDAAoD;iBAClE;aACF;SACF;KACF;CACF,CAAC;AAwCF;;;;GAIG;AACH,MAAM,gBAAgB,GAAwC;IAC5D,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;IACzE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;IACzE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE;IAClF,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;CACrD,CAAC;AAEF;;;;GAIG;AACH,MAAM,qBAAqB,GAA2B;IACpD,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,CAAU,CAAC;AAE5E;8EAC8E;AAC9E,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAElD,8EAA8E;AAC9E,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAYtC,6EAA6E;AAC7E,SAAS,WAAW,CAAC,IAAa;IAChC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,IAA+E,CAAC;IAC1F,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC;IACzC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,CAAC,CAAC,IAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/F,OAAQ,CAAC,CAAC,IAA+B,CAAC,IAAI,CAAC;IACjD,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,SAAS,CAAC,GAAe,EAAE,cAAsB;IACxD,MAAM,QAAQ,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,mBAAmB,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,OAA6B,EAAE,GAAe;IACpE,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,GAAG,OAAO,CAAC,KAAK,aAAa,CAAC;IACzE,OAAO;QACL,GAAG,EAAE,GAAG,mBAAmB,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE;QAClD,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QACvD,WAAW,EAAE,GAAG,WAAW,SAAS,EAAE,GAAG;QACzC,QAAQ,EAAE,kBAAkB;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,mBAAmB,CAAC;QAAE,OAAO,IAAI,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,yBAAyB,CACtC,MAAc,EACd,MAAc;IAEd,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,sBAAsB,EAAE;YACvD,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8B,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,MAAM,GAAG,GAA2B,EAAE,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,SAAS;YAC9C,MAAM,CAAC,GAAG,GAAoC,CAAC;YAC/C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAChE,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAClE,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,SAAS;gBAAE,SAAS;YACjD,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;gBAC1E,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;QACX,sEAAsE;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,OAA4C;IACtF,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC9C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,CAC/C,CAAC;IAEF,wEAAwE;IACxE,2EAA2E;IAC3E,yDAAyD;IACzD,IAAI,iBAAiB,GAAkC,IAAI,CAAC;IAE5D,KAAK,UAAU,kBAAkB;QAC/B,IAAI,iBAAiB;YAAE,OAAO,iBAAiB,CAAC;QAEhD,oDAAoD;QACpD,IAAI,OAAO,EAAE,mBAAmB,EAAE,CAAC;YACjC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3E,IAAI,YAAY,EAAE,CAAC;gBACjB,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBAC9D,OAAO,iBAAiB,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAChD,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjE,IAAI,QAAQ,EAAE,CAAC;gBACb,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;gBAC1D,OAAO,iBAAiB,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,iBAAiB,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;QAC1C,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAEjF,4EAA4E;IAC5E,8BAA8B;IAC9B,4EAA4E;IAE5E,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;YACxB,oEAAoE;YACpE,oEAAoE;YACpE,+CAA+C;YAC/C,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC/C,MAAM,SAAS,GAAe,EAAE,CAAC;QACjC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,UAAU,CAAC,IAAI,EAAE,EAAE;oBACnE,KAAK,EAAE,MAAM,CAAC,0BAA0B,CAAC;oBACzC,IAAI,EAAE,GAAG;iBACV,CAAC,CAAC;gBACH,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBACpC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yFAAyF;YAC3F,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAA4B,EAAE,EAAE;QACzF,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,kCAAkC,mBAAmB,uBAAuB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CACjG,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,4CAA4C,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAChD,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACnF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;oBACvB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;iBACnC;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAwB,EAAE,EAAE;QACjF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAErC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAEhD,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0DAA0D,EAAE;iBACnF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,IAAI,IAAa,CAAC;YAElB,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,qBAAqB,CAAC,CAAC,CAAC;oBAC3B,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,SAG/C,CAAC;oBACF,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE;wBAChD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;wBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;qBACnB,CAAC,CAAC;oBACH,MAAM;gBACR,CAAC;gBAED,KAAK,uBAAuB,CAAC,CAAC,CAAC;oBAC7B,MAAM,EACJ,OAAO,EACP,UAAU,EACV,KAAK,GAAG,EAAE,EACV,IAAI,GAAG,CAAC,EACR,MAAM,GACP,GAAG,OAAO,CAAC,MAAM,CAAC,SAMlB,CAAC;oBACF,MAAM,MAAM,GAA2B;wBACrC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;wBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;qBACnB,CAAC;oBACF,IAAI,OAAO;wBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;oBACrC,IAAI,MAAM;wBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;oBAEnC,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,UAAU,EAAE,EAAE,MAAM,CAAC,CAAC;oBAClE,MAAM;gBACR,CAAC;gBAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;oBAC5B,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,SAGzC,CAAC;oBACF,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;oBAChE,MAAM;gBACR,CAAC;gBAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;oBAC3B,MAAM,EACJ,OAAO,EACP,KAAK,GAAG,EAAE,EACV,IAAI,GAAG,CAAC,GACT,GAAG,OAAO,CAAC,MAAM,CAAC,SAIlB,CAAC;oBACF,MAAM,MAAM,GAA2B;wBACrC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;wBACpB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;qBACnB,CAAC;oBACF,IAAI,OAAO;wBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;oBAErC,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;oBAC1D,MAAM;gBACR,CAAC;gBAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;oBAC3B,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,SAAiC,CAAC;oBACrE,MAAM,MAAM,GAA2B,EAAE,CAAC;oBAC1C,IAAI,OAAO;wBAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;oBAErC,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;oBAC3D,MAAM;gBACR,CAAC;gBAED;oBACE,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,QAAQ,EAAE,EAAE,CAAC;wBACrE,OAAO,EAAE,IAAI;qBACd,CAAC;YACN,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;4BACE,IAAI;4BACJ,KAAK,EAAE;gCACL,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gCAClC,MAAM,EAAE,kBAAkB;gCAC1B,IAAI,EAAE,QAAQ;gCACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;6BACpC;yBACF,EACD,IAAI,EACJ,CAAC,CACF;qBACF;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE;iBACrF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,25 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* RevealUI Content MCP Server
|
|
3
|
+
* RevealUI Content MCP Server — stdio launcher.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* to
|
|
5
|
+
* Thin wrapper around `createRevealuiContentServer()` (see
|
|
6
|
+
* `./revealui-content-factory.ts` for the tool surface). This file exists
|
|
7
|
+
* purely to run the server as a stdio subprocess — the canonical deployment
|
|
8
|
+
* for local dev, Claude Code integration, and the hypervisor's
|
|
9
|
+
* `spawn()`-based tool-discovery pipeline.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
11
|
+
* For HTTP / serverless / in-process deployment, import the factory
|
|
12
|
+
* directly and wrap it via `createNodeStreamableHttpHandler` from
|
|
13
|
+
* `@revealui/mcp/streamable-http`.
|
|
12
14
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* revealui_list_content - List content entries for a site and collection
|
|
16
|
-
* revealui_get_content - Fetch a single content entry by ID
|
|
17
|
-
* revealui_list_users - List users (admin only)
|
|
18
|
-
* revealui_site_stats - Get user + content counts for a site
|
|
15
|
+
* Re-exports `setCredentials` for hypervisor compatibility — existing
|
|
16
|
+
* tenant-scoped credential resolution continues to work unchanged.
|
|
19
17
|
*/
|
|
20
|
-
|
|
21
|
-
* Set credential overrides for this server.
|
|
22
|
-
* Called by the Hypervisor with resolved tenant credentials.
|
|
23
|
-
*/
|
|
24
|
-
export declare function setCredentials(creds: Record<string, string>): void;
|
|
18
|
+
export { setCredentials } from './factories/revealui-content.js';
|
|
25
19
|
//# sourceMappingURL=revealui-content.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"revealui-content.d.ts","sourceRoot":"","sources":["../../src/servers/revealui-content.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"revealui-content.d.ts","sourceRoot":"","sources":["../../src/servers/revealui-content.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC"}
|