@extentos/mcp-server 0.5.10 → 0.6.1

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.
@@ -0,0 +1,222 @@
1
+ // MCP read tools for the per-project "Agent" (assistant) settings + managed-
2
+ // gateway usage — the read-only first slice of the agent MCP access surface
3
+ // (shared-context/decisions-in-flight/mcp-per-project-access-policy.md).
4
+ //
5
+ // getAssistantConfig — read the dashboard-managed Agent config (realtime
6
+ // model / voice / memory model / memory mode) + the
7
+ // catalog of valid options for each.
8
+ // getGatewayUsage — read account-scoped managed-gateway usage + exact
9
+ // cost over a window (metadata only — never content).
10
+ //
11
+ // Both are ACCOUNT-SCOPED reads: they hit the dedicated /api/agent/* backend
12
+ // routes which resolve the account from the ~/.extentos/auth.json Bearer
13
+ // (resolveIdentity), NOT the package-keyed SDK routes (/api/assistant-config),
14
+ // which verify an attestation JWT on any Bearer and would reject the account
15
+ // token. A 401 here genuinely means "no linked account" — run extentos-mcp login.
16
+ //
17
+ // Writes (setAssistantConfig) + the per-project access policy that gates them are
18
+ // the NEXT slice; these two are pure reads and need no policy machinery.
19
+ import { backendFetch } from "../util/backendClient.js";
20
+ import { okResponse, errorResponse } from "../response.js";
21
+ import { REALTIME_MODELS, VOICES, COMPACTION_MODELS, WITHIN_SESSION_MEMORY_MODES, DASHBOARD_DEFAULTS, SDK_HARD_DEFAULTS, } from "../data/assistantCatalog.js";
22
+ function parseAppPackage(raw) {
23
+ if (!raw || typeof raw !== "object") {
24
+ return {
25
+ error: errorResponse({
26
+ code: "invalid_arguments",
27
+ message: "Requires an object argument with `appPackage`.",
28
+ fixHint: 'Pass { appPackage: "com.example.myapp" }.',
29
+ retryable: false,
30
+ }),
31
+ };
32
+ }
33
+ const v = raw.appPackage;
34
+ if (typeof v !== "string" || v.trim().length === 0) {
35
+ return {
36
+ error: errorResponse({
37
+ code: "invalid_arguments",
38
+ message: "`appPackage` is required and must be a non-empty string (the app's package / bundle id).",
39
+ fixHint: "Pass the developer's package/bundle id, e.g. com.example.myapp.",
40
+ retryable: false,
41
+ }),
42
+ };
43
+ }
44
+ return { value: v.trim() };
45
+ }
46
+ function accountRequired(action) {
47
+ return errorResponse({
48
+ code: "account_required",
49
+ message: `${action} needs a linked Extentos account. Run \`extentos-mcp login\` ` +
50
+ "(or `npx -p @extentos/mcp-server extentos-mcp login`) and approve in the browser, then retry.",
51
+ fixHint: "Run `extentos-mcp login`, approve in the browser, then retry.",
52
+ retryable: false,
53
+ });
54
+ }
55
+ function backendError(what, status, errorText) {
56
+ return errorResponse({
57
+ code: "backend_error",
58
+ message: `${what} (HTTP ${status}).${errorText ? ` ${errorText}` : ""}`,
59
+ fixHint: "Check the MCP can reach api.extentos.com and that the /api/agent/* routes are deployed. Retry if the failure looks transient.",
60
+ retryable: status === 0 || status >= 500,
61
+ });
62
+ }
63
+ // 403 from a governed /api/agent/* route = the project owner restricted this
64
+ // capability (set it below the level this call needs) in the dashboard's MCP
65
+ // access controls. Default is Read+Write, so this only fires after a deliberate
66
+ // tighten.
67
+ function permissionDenied(message, fixHint) {
68
+ return errorResponse({ code: "permission_denied", message, fixHint, retryable: false });
69
+ }
70
+ export async function handleGetAssistantConfig(raw) {
71
+ const pkg = parseAppPackage(raw);
72
+ if ("error" in pkg)
73
+ return pkg.error;
74
+ const res = await backendFetch(`/api/agent/config?appPackage=${encodeURIComponent(pkg.value)}`);
75
+ if (res.status === 401)
76
+ return accountRequired("Reading the Agent (assistant) config");
77
+ if (res.status === 403)
78
+ return permissionDenied("Reading this project's Agent config is restricted — the owner set Assistant-config access to Off in the dashboard.", "Ask the project owner to set Assistant config to Read or Read+Write in the project's MCP access controls.");
79
+ if (!res.ok)
80
+ return backendError(`Failed to read Agent config for ${pkg.value}`, res.status, res.errorText);
81
+ const config = res.data?.config ?? null;
82
+ const options = {
83
+ realtimeModel: REALTIME_MODELS.map((o) => ({ id: o.id, label: o.label, description: o.description })),
84
+ voice: VOICES.map((o) => ({ id: o.id, label: o.label })),
85
+ compactionModel: COMPACTION_MODELS.map((o) => ({ id: o.id, label: o.label, description: o.description })),
86
+ withinSessionMemory: WITHIN_SESSION_MEMORY_MODES.map((o) => ({ id: o.id, label: o.label, description: o.description })),
87
+ };
88
+ return okResponse({
89
+ managed: config !== null,
90
+ projectInstallId: pkg.value,
91
+ config,
92
+ dashboardDefaults: DASHBOARD_DEFAULTS,
93
+ sdkHardDefaults: SDK_HARD_DEFAULTS,
94
+ options,
95
+ precedenceNote: "Runtime precedence: a value set in app code (AssistantProvider.OpenAi(model = …, voice = …)) wins over this dashboard-managed config, which wins over the SDK hard defaults. This tool shows the dashboard-managed layer only — it cannot see code-set values. These settings are consumed by the Android SDK today; iOS reads them after the assistant iOS sweep.",
96
+ summary: config
97
+ ? `${pkg.value} has a dashboard-managed Agent config — realtime: ${config.realtimeModel}, voice: ${config.voice}, memory model: ${config.compactionModel}, memory mode: ${config.withinSessionMemory}.`
98
+ : `${pkg.value} has NO dashboard-managed Agent config. Unless the app code sets them, the SDK uses its hard defaults (realtime ${SDK_HARD_DEFAULTS.realtimeModel}, voice ${SDK_HARD_DEFAULTS.voice}, memory model ${SDK_HARD_DEFAULTS.compactionModel}, memory mode ${SDK_HARD_DEFAULTS.withinSessionMemory}). Set them in the dashboard's Agent section, or change them here with setAssistantConfig.`,
99
+ });
100
+ }
101
+ export async function handleGetGatewayUsage(raw) {
102
+ const pkg = parseAppPackage(raw);
103
+ if ("error" in pkg)
104
+ return pkg.error;
105
+ const obj = raw;
106
+ let days = 30;
107
+ if (obj.days !== undefined) {
108
+ if (typeof obj.days !== "number" || !Number.isFinite(obj.days)) {
109
+ return errorResponse({
110
+ code: "invalid_arguments",
111
+ message: "`days` must be a number between 1 and 365 when provided.",
112
+ fixHint: "Omit `days` for the default 30-day window, or pass e.g. days: 7.",
113
+ retryable: false,
114
+ });
115
+ }
116
+ days = Math.min(365, Math.max(1, Math.trunc(obj.days)));
117
+ }
118
+ const res = await backendFetch(`/api/agent/usage?appPackage=${encodeURIComponent(pkg.value)}&days=${days}`);
119
+ if (res.status === 401)
120
+ return accountRequired("Reading managed-gateway usage");
121
+ if (res.status === 403)
122
+ return permissionDenied("Reading this project's usage is restricted — the owner set Analytics access to Off in the dashboard.", "Ask the project owner to set Analytics to Read in the project's MCP access controls.");
123
+ if (!res.ok)
124
+ return backendError(`Failed to read gateway usage for ${pkg.value}`, res.status, res.errorText);
125
+ const d = res.data;
126
+ if (!d) {
127
+ return errorResponse({
128
+ code: "backend_error",
129
+ message: "Gateway usage response was empty.",
130
+ fixHint: "Retry; if it persists, check the /api/agent/usage route is deployed.",
131
+ retryable: true,
132
+ });
133
+ }
134
+ const topModel = d.byModel[0]?.model ?? "—";
135
+ return okResponse({
136
+ projectInstallId: pkg.value,
137
+ window: d.window,
138
+ totals: d.totals,
139
+ byModel: d.byModel,
140
+ creditBalanceUsd: d.creditBalanceUsd,
141
+ summary: d.hasData
142
+ ? `${pkg.value}: ${d.totals.responses} managed-gateway response(s) over the last ${d.window.days}d — ${d.totals.totalTokens.toLocaleString()} tokens, $${d.totals.costUsd.toFixed(4)}${d.creditBalanceUsd != null ? `; credit balance $${d.creditBalanceUsd.toFixed(2)}` : ""}. Top model: ${topModel}.`
143
+ : `${pkg.value}: no managed-gateway usage in the last ${d.window.days}d. Only managed-gateway + dashboard-vault-BYOK sessions are metered — a code-direct setOpenaiApiKey() bypass goes straight to OpenAI and never reaches Extentos.`,
144
+ });
145
+ }
146
+ // Catalog per writable field — the MCP-side gate so an agent gets a helpful
147
+ // "valid ids are…" error instead of a backend rejection. The backend re-checks
148
+ // the policy gate; field validity is enforced here (and at the schema enum).
149
+ const CATALOG_BY_FIELD = {
150
+ realtimeModel: REALTIME_MODELS,
151
+ voice: VOICES,
152
+ compactionModel: COMPACTION_MODELS,
153
+ withinSessionMemory: WITHIN_SESSION_MEMORY_MODES,
154
+ };
155
+ export async function handleSetAssistantConfig(raw) {
156
+ const pkg = parseAppPackage(raw);
157
+ if ("error" in pkg)
158
+ return pkg.error;
159
+ const obj = raw;
160
+ // Collect + validate the provided fields against the catalog (partial update).
161
+ const provided = {};
162
+ for (const field of ["realtimeModel", "voice", "compactionModel", "withinSessionMemory"]) {
163
+ const v = obj[field];
164
+ if (v === undefined)
165
+ continue;
166
+ if (typeof v !== "string" || v.trim().length === 0) {
167
+ return errorResponse({
168
+ code: "invalid_arguments",
169
+ message: `\`${field}\` must be a non-empty string when provided.`,
170
+ fixHint: `Pass a valid ${field} id, or omit it.`,
171
+ retryable: false,
172
+ });
173
+ }
174
+ const id = v.trim();
175
+ const catalog = CATALOG_BY_FIELD[field];
176
+ if (!catalog.some((o) => o.id === id)) {
177
+ return errorResponse({
178
+ code: "invalid_arguments",
179
+ message: `\`${field}\`: "${id}" is not a valid option. Valid ids: ${catalog.map((o) => o.id).join(", ")}.`,
180
+ fixHint: "Call getAssistantConfig to see the catalog of valid options for each field.",
181
+ retryable: false,
182
+ });
183
+ }
184
+ provided[field] = id;
185
+ }
186
+ if (Object.keys(provided).length === 0) {
187
+ return errorResponse({
188
+ code: "invalid_arguments",
189
+ message: "Provide at least one field to change: realtimeModel, voice, compactionModel, or withinSessionMemory.",
190
+ fixHint: 'e.g. { appPackage: "com.example.app", realtimeModel: "gpt-realtime-mini" }.',
191
+ retryable: false,
192
+ });
193
+ }
194
+ const res = await backendFetch("/api/agent/config", {
195
+ method: "POST",
196
+ body: { appPackage: pkg.value, ...provided },
197
+ });
198
+ if (res.status === 401)
199
+ return accountRequired("Changing the Agent (assistant) config");
200
+ if (res.status === 403) {
201
+ return permissionDenied(res.data?.message ??
202
+ "Changing this project's Agent config via MCP is restricted — the owner set Assistant-config access below Read+Write.", "Ask the project owner to set Assistant config to Read+Write in the project's MCP access controls, then retry.");
203
+ }
204
+ if (!res.ok)
205
+ return backendError(`Failed to update Agent config for ${pkg.value}`, res.status, res.errorText);
206
+ const config = res.data?.config ?? null;
207
+ const costNote = res.data?.costNote ?? null;
208
+ return okResponse({
209
+ status: "ok",
210
+ projectInstallId: pkg.value,
211
+ changed: provided,
212
+ config,
213
+ costNote,
214
+ summary: `Updated ${pkg.value} Agent config (${Object.keys(provided).join(", ")}).` +
215
+ (config
216
+ ? ` Now: realtime ${config.realtimeModel}, voice ${config.voice}, memory model ${config.compactionModel}, mode ${config.withinSessionMemory}.`
217
+ : "") +
218
+ (costNote ? ` Cost impact — ${costNote}` : "") +
219
+ " Takes effect on the Android SDK's next assistant session (code-set values still win); iOS after the assistant sweep.",
220
+ });
221
+ }
222
+ //# sourceMappingURL=assistantConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantConfig.js","sourceRoot":"","sources":["../../../src/tools/handlers/assistantConfig.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,yEAAyE;AACzE,EAAE;AACF,2EAA2E;AAC3E,2EAA2E;AAC3E,4DAA4D;AAC5D,2EAA2E;AAC3E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,+EAA+E;AAC/E,6EAA6E;AAC7E,kFAAkF;AAClF,EAAE;AACF,kFAAkF;AAClF,yEAAyE;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAmB,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EACL,eAAe,EACf,MAAM,EACN,iBAAiB,EACjB,2BAA2B,EAC3B,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO;YACL,KAAK,EAAE,aAAa,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,gDAAgD;gBACzD,OAAO,EAAE,2CAA2C;gBACpD,SAAS,EAAE,KAAK;aACjB,CAAC;SACH,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,GAAI,GAA+B,CAAC,UAAU,CAAC;IACtD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,KAAK,EAAE,aAAa,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,0FAA0F;gBACnG,OAAO,EAAE,iEAAiE;gBAC1E,SAAS,EAAE,KAAK;aACjB,CAAC;SACH,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,kBAAkB;QACxB,OAAO,EACL,GAAG,MAAM,+DAA+D;YACxE,+FAA+F;QACjG,OAAO,EAAE,+DAA+D;QACxE,SAAS,EAAE,KAAK;KACjB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,SAAwB;IAC1E,OAAO,aAAa,CAAC;QACnB,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,GAAG,IAAI,UAAU,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACvE,OAAO,EACL,+HAA+H;QACjI,SAAS,EAAE,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,GAAG;KACzC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,6EAA6E;AAC7E,gFAAgF;AAChF,WAAW;AACX,SAAS,gBAAgB,CAAC,OAAe,EAAE,OAAe;IACxD,OAAO,aAAa,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAY;IACzD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IAErC,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,gCAAgC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAChE,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC,sCAAsC,CAAC,CAAC;IACvF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QACpB,OAAO,gBAAgB,CACrB,oHAAoH,EACpH,2GAA2G,CAC5G,CAAC;IACJ,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,YAAY,CAAC,mCAAmC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAE5G,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG;QACd,aAAa,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACrG,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACxD,eAAe,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzG,mBAAmB,EAAE,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;KACxH,CAAC;IAEF,OAAO,UAAU,CAAC;QAChB,OAAO,EAAE,MAAM,KAAK,IAAI;QACxB,gBAAgB,EAAE,GAAG,CAAC,KAAK;QAC3B,MAAM;QACN,iBAAiB,EAAE,kBAAkB;QACrC,eAAe,EAAE,iBAAiB;QAClC,OAAO;QACP,cAAc,EACZ,oWAAoW;QACtW,OAAO,EAAE,MAAM;YACb,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,qDAAqD,MAAM,CAAC,aAAa,YAAY,MAAM,CAAC,KAAK,mBAAmB,MAAM,CAAC,eAAe,kBAAkB,MAAM,CAAC,mBAAmB,GAAG;YACvM,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,mHAAmH,iBAAiB,CAAC,aAAa,WAAW,iBAAiB,CAAC,KAAK,kBAAkB,iBAAiB,CAAC,eAAe,iBAAiB,iBAAiB,CAAC,mBAAmB,4FAA4F;KAC1Y,CAAC,CAAC;AACL,CAAC;AAsBD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAY;IACtD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IACrC,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,OAAO,aAAa,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,0DAA0D;gBACnE,OAAO,EAAE,kEAAkE;gBAC3E,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAC5B,+BAA+B,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAC5E,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC,+BAA+B,CAAC,CAAC;IAChF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QACpB,OAAO,gBAAgB,CACrB,sGAAsG,EACtG,sFAAsF,CACvF,CAAC;IACJ,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,YAAY,CAAC,oCAAoC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAC7G,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACnB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,mCAAmC;YAC5C,OAAO,EAAE,sEAAsE;YAC/E,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,CAAC;IAC5C,OAAO,UAAU,CAAC;QAChB,gBAAgB,EAAE,GAAG,CAAC,KAAK;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;QACpC,OAAO,EAAE,CAAC,CAAC,OAAO;YAChB,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,8CAA8C,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAChL,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACtF,gBAAgB,QAAQ,GAAG;YAC7B,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,0CAA0C,CAAC,CAAC,MAAM,CAAC,IAAI,kKAAkK;KAC1O,CAAC,CAAC;AACL,CAAC;AAED,4EAA4E;AAC5E,+EAA+E;AAC/E,6EAA6E;AAC7E,MAAM,gBAAgB,GAA8C;IAClE,aAAa,EAAE,eAAe;IAC9B,KAAK,EAAE,MAAM;IACb,eAAe,EAAE,iBAAiB;IAClC,mBAAmB,EAAE,2BAA2B;CACjD,CAAC;AAWF,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAY;IACzD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,OAAO,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC;IACrC,MAAM,GAAG,GAAG,GAA8B,CAAC;IAE3C,+EAA+E;IAC/E,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,EAAE,CAAC;QACzF,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,aAAa,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,KAAK,KAAK,8CAA8C;gBACjE,OAAO,EAAE,gBAAgB,KAAK,kBAAkB;gBAChD,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACtC,OAAO,aAAa,CAAC;gBACnB,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,KAAK,KAAK,QAAQ,EAAE,uCAAuC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAC1G,OAAO,EAAE,6EAA6E;gBACtF,SAAS,EAAE,KAAK;aACjB,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,sGAAsG;YAC/G,OAAO,EAAE,6EAA6E;YACtF,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAA6B,mBAAmB,EAAE;QAC9E,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE;KAC7C,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,eAAe,CAAC,uCAAuC,CAAC,CAAC;IACxF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACvB,OAAO,gBAAgB,CACrB,GAAG,CAAC,IAAI,EAAE,OAAO;YACf,sHAAsH,EACxH,+GAA+G,CAChH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,YAAY,CAAC,qCAAqC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;IAE9G,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC;IAC5C,OAAO,UAAU,CAAC;QAChB,MAAM,EAAE,IAAI;QACZ,gBAAgB,EAAE,GAAG,CAAC,KAAK;QAC3B,OAAO,EAAE,QAAQ;QACjB,MAAM;QACN,QAAQ;QACR,OAAO,EACL,WAAW,GAAG,CAAC,KAAK,kBAAkB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC1E,CAAC,MAAM;gBACL,CAAC,CAAC,kBAAkB,MAAM,CAAC,aAAa,WAAW,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,eAAe,UAAU,MAAM,CAAC,mBAAmB,GAAG;gBAC9I,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,uHAAuH;KAC1H,CAAC,CAAC;AACL,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA+BhD,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAE9E,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA4BhD,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAoChD,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAE9E,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA+BhD,CAAC"}
@@ -6,6 +6,7 @@ import { handleCreateSimulatorSession } from "./handlers/createSimulatorSession.
6
6
  import { handleEnsureSimulatorBrowser } from "./handlers/ensureSimulatorBrowser.js";
7
7
  import { handleGenerateConnectionModule } from "./handlers/generateConnectionModule.js";
8
8
  import { handleGetConnectionPageConfig, handleSetConnectionPageConfig, handleRegenerateConnectionPageFile, handleAdoptConnectionPageFile, } from "./handlers/connectionPageConfig.js";
9
+ import { handleGetAssistantConfig, handleGetGatewayUsage, handleSetAssistantConfig, } from "./handlers/assistantConfig.js";
9
10
  import { handleGetCapabilityGuide } from "./handlers/getCapabilityGuide.js";
10
11
  import { handleGetCodeExample } from "./handlers/getCodeExample.js";
11
12
  import { handleGetCredentialGuide } from "./handlers/getCredentialGuide.js";
@@ -34,6 +35,9 @@ export const handlers = {
34
35
  setConnectionPageConfig: handleSetConnectionPageConfig,
35
36
  regenerateConnectionPageFile: handleRegenerateConnectionPageFile,
36
37
  adoptConnectionPageFile: handleAdoptConnectionPageFile,
38
+ getAssistantConfig: handleGetAssistantConfig,
39
+ setAssistantConfig: handleSetAssistantConfig,
40
+ getGatewayUsage: handleGetGatewayUsage,
37
41
  getCapabilityGuide: handleGetCapabilityGuide,
38
42
  getCodeExample: handleGetCodeExample,
39
43
  getCredentialGuide: handleGetCredentialGuide,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,yEAAyE;AACzE,yEAAyE;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC;AACtF,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAI9E,MAAM,CAAC,MAAM,QAAQ,GAAgC;IACnD,gBAAgB,EAAE,sBAAsB;IACxC,sBAAsB,EAAE,4BAA4B;IACpD,sBAAsB,EAAE,4BAA4B;IACpD,wBAAwB,EAAE,8BAA8B;IACxD,uBAAuB,EAAE,6BAA6B;IACtD,uBAAuB,EAAE,6BAA6B;IACtD,4BAA4B,EAAE,kCAAkC;IAChE,uBAAuB,EAAE,6BAA6B;IACtD,kBAAkB,EAAE,wBAAwB;IAC5C,cAAc,EAAE,oBAAoB;IACpC,kBAAkB,EAAE,wBAAwB;IAC5C,eAAe,EAAE,qBAAqB;IACtC,WAAW,EAAE,iBAAiB;IAC9B,cAAc,EAAE,oBAAoB;IACpC,WAAW,EAAE,iBAAiB;IAC9B,eAAe,EAAE,qBAAqB;IACtC,sBAAsB,EAAE,4BAA4B;IACpD,kBAAkB,EAAE,wBAAwB;IAC5C,uBAAuB,EAAE,6BAA6B;IACtD,wBAAwB,EAAE,8BAA8B;IACxD,gBAAgB,EAAE,sBAAsB;IACxC,kBAAkB,EAAE,wBAAwB;IAC5C,gBAAgB,EAAE,sBAAsB;IACxC,UAAU,EAAE,gBAAgB;IAC5B,YAAY,EAAE,kBAAkB;IAChC,WAAW,EAAE,iBAAiB;IAC9B,mBAAmB,EAAE,yBAAyB;CAC/C,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@extentos/mcp-server",
3
- "version": "0.5.10",
3
+ "version": "0.6.1",
4
4
  "description": "Extentos MCP server — deterministic tools for building Meta-glasses apps.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -24,6 +24,11 @@
24
24
  "parity:connection-page": "node scripts/connection-page-parity.mjs",
25
25
  "parity:dat-version": "node scripts/dat-version-parity.mjs",
26
26
  "parity:device-catalog": "node scripts/device-catalog-parity.mjs",
27
+ "parity:assistant-catalog": "node scripts/assistant-catalog-parity.mjs",
28
+ "docs:reference": "node scripts/generate-docs-reference.mjs",
29
+ "docs:errors": "node scripts/generate-errors-reference.mjs",
30
+ "docs:generate": "npm run build && node scripts/generate-docs-reference.mjs && node scripts/generate-errors-reference.mjs",
31
+ "docs:check": "npm run docs:generate && git -C .. diff --exit-code -- content/docs/reference/mcp-tools.mdx content/docs/reference/errors.mdx",
27
32
  "prepublishOnly": "npm run build"
28
33
  },
29
34
  "keywords": [