@extentos/mcp-server 0.5.9 → 0.6.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.
@@ -0,0 +1,216 @@
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
+ export async function handleGetAssistantConfig(raw) {
64
+ const pkg = parseAppPackage(raw);
65
+ if ("error" in pkg)
66
+ return pkg.error;
67
+ const res = await backendFetch(`/api/agent/config?appPackage=${encodeURIComponent(pkg.value)}`);
68
+ if (res.status === 401)
69
+ return accountRequired("Reading the Agent (assistant) config");
70
+ if (!res.ok)
71
+ return backendError(`Failed to read Agent config for ${pkg.value}`, res.status, res.errorText);
72
+ const config = res.data?.config ?? null;
73
+ const options = {
74
+ realtimeModel: REALTIME_MODELS.map((o) => ({ id: o.id, label: o.label, description: o.description })),
75
+ voice: VOICES.map((o) => ({ id: o.id, label: o.label })),
76
+ compactionModel: COMPACTION_MODELS.map((o) => ({ id: o.id, label: o.label, description: o.description })),
77
+ withinSessionMemory: WITHIN_SESSION_MEMORY_MODES.map((o) => ({ id: o.id, label: o.label, description: o.description })),
78
+ };
79
+ return okResponse({
80
+ managed: config !== null,
81
+ projectInstallId: pkg.value,
82
+ config,
83
+ dashboardDefaults: DASHBOARD_DEFAULTS,
84
+ sdkHardDefaults: SDK_HARD_DEFAULTS,
85
+ options,
86
+ 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.",
87
+ summary: config
88
+ ? `${pkg.value} has a dashboard-managed Agent config — realtime: ${config.realtimeModel}, voice: ${config.voice}, memory model: ${config.compactionModel}, memory mode: ${config.withinSessionMemory}.`
89
+ : `${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 (agent write tools land in the next slice).`,
90
+ });
91
+ }
92
+ export async function handleGetGatewayUsage(raw) {
93
+ const pkg = parseAppPackage(raw);
94
+ if ("error" in pkg)
95
+ return pkg.error;
96
+ const obj = raw;
97
+ let days = 30;
98
+ if (obj.days !== undefined) {
99
+ if (typeof obj.days !== "number" || !Number.isFinite(obj.days)) {
100
+ return errorResponse({
101
+ code: "invalid_arguments",
102
+ message: "`days` must be a number between 1 and 365 when provided.",
103
+ fixHint: "Omit `days` for the default 30-day window, or pass e.g. days: 7.",
104
+ retryable: false,
105
+ });
106
+ }
107
+ days = Math.min(365, Math.max(1, Math.trunc(obj.days)));
108
+ }
109
+ const res = await backendFetch(`/api/agent/usage?appPackage=${encodeURIComponent(pkg.value)}&days=${days}`);
110
+ if (res.status === 401)
111
+ return accountRequired("Reading managed-gateway usage");
112
+ if (!res.ok)
113
+ return backendError(`Failed to read gateway usage for ${pkg.value}`, res.status, res.errorText);
114
+ const d = res.data;
115
+ if (!d) {
116
+ return errorResponse({
117
+ code: "backend_error",
118
+ message: "Gateway usage response was empty.",
119
+ fixHint: "Retry; if it persists, check the /api/agent/usage route is deployed.",
120
+ retryable: true,
121
+ });
122
+ }
123
+ const topModel = d.byModel[0]?.model ?? "—";
124
+ return okResponse({
125
+ projectInstallId: pkg.value,
126
+ window: d.window,
127
+ totals: d.totals,
128
+ byModel: d.byModel,
129
+ creditBalanceUsd: d.creditBalanceUsd,
130
+ summary: d.hasData
131
+ ? `${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}.`
132
+ : `${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.`,
133
+ });
134
+ }
135
+ // Catalog per writable field — the MCP-side gate so an agent gets a helpful
136
+ // "valid ids are…" error instead of a backend rejection. The backend re-checks
137
+ // the policy gate; field validity is enforced here (and at the schema enum).
138
+ const CATALOG_BY_FIELD = {
139
+ realtimeModel: REALTIME_MODELS,
140
+ voice: VOICES,
141
+ compactionModel: COMPACTION_MODELS,
142
+ withinSessionMemory: WITHIN_SESSION_MEMORY_MODES,
143
+ };
144
+ export async function handleSetAssistantConfig(raw) {
145
+ const pkg = parseAppPackage(raw);
146
+ if ("error" in pkg)
147
+ return pkg.error;
148
+ const obj = raw;
149
+ // Collect + validate the provided fields against the catalog (partial update).
150
+ const provided = {};
151
+ for (const field of ["realtimeModel", "voice", "compactionModel", "withinSessionMemory"]) {
152
+ const v = obj[field];
153
+ if (v === undefined)
154
+ continue;
155
+ if (typeof v !== "string" || v.trim().length === 0) {
156
+ return errorResponse({
157
+ code: "invalid_arguments",
158
+ message: `\`${field}\` must be a non-empty string when provided.`,
159
+ fixHint: `Pass a valid ${field} id, or omit it.`,
160
+ retryable: false,
161
+ });
162
+ }
163
+ const id = v.trim();
164
+ const catalog = CATALOG_BY_FIELD[field];
165
+ if (!catalog.some((o) => o.id === id)) {
166
+ return errorResponse({
167
+ code: "invalid_arguments",
168
+ message: `\`${field}\`: "${id}" is not a valid option. Valid ids: ${catalog.map((o) => o.id).join(", ")}.`,
169
+ fixHint: "Call getAssistantConfig to see the catalog of valid options for each field.",
170
+ retryable: false,
171
+ });
172
+ }
173
+ provided[field] = id;
174
+ }
175
+ if (Object.keys(provided).length === 0) {
176
+ return errorResponse({
177
+ code: "invalid_arguments",
178
+ message: "Provide at least one field to change: realtimeModel, voice, compactionModel, or withinSessionMemory.",
179
+ fixHint: 'e.g. { appPackage: "com.example.app", realtimeModel: "gpt-realtime-mini" }.',
180
+ retryable: false,
181
+ });
182
+ }
183
+ const res = await backendFetch("/api/agent/config", {
184
+ method: "POST",
185
+ body: { appPackage: pkg.value, ...provided },
186
+ });
187
+ if (res.status === 401)
188
+ return accountRequired("Changing the Agent (assistant) config");
189
+ if (res.status === 403) {
190
+ return errorResponse({
191
+ code: "policy_denied",
192
+ message: res.data?.message ??
193
+ 'Changing this project\'s Agent settings via MCP is turned off. The project owner enables it in the dashboard: project -> Agent -> "Let AI agents change these settings".',
194
+ fixHint: 'Ask the project owner to turn on "Let AI agents change these settings" on the project\'s Agent page, then retry. Reading config + usage stays available without it.',
195
+ retryable: false,
196
+ });
197
+ }
198
+ if (!res.ok)
199
+ return backendError(`Failed to update Agent config for ${pkg.value}`, res.status, res.errorText);
200
+ const config = res.data?.config ?? null;
201
+ const costNote = res.data?.costNote ?? null;
202
+ return okResponse({
203
+ status: "ok",
204
+ projectInstallId: pkg.value,
205
+ changed: provided,
206
+ config,
207
+ costNote,
208
+ summary: `Updated ${pkg.value} Agent config (${Object.keys(provided).join(", ")}).` +
209
+ (config
210
+ ? ` Now: realtime ${config.realtimeModel}, voice ${config.voice}, memory model ${config.compactionModel}, mode ${config.withinSessionMemory}.`
211
+ : "") +
212
+ (costNote ? ` Cost impact — ${costNote}` : "") +
213
+ " Takes effect on the Android SDK's next assistant session (code-set values still win); iOS after the assistant sweep.",
214
+ });
215
+ }
216
+ //# sourceMappingURL=assistantConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantConfig.js","sourceRoot":"","sources":["../../../src/tools/handlers/assistantConfig.ts"],"names":[],"mappings":"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"}
@@ -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.9",
3
+ "version": "0.6.0",
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": [