@numa-tech/numa 1.16.0 → 1.17.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 +22 -11
- package/dist/ai-registry/commands.js +41 -5
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/ai-registry/mcp-installer.d.ts +1 -0
- package/dist/ai-registry/mcp-installer.js +20 -1
- package/dist/ai-registry/mcp-installer.js.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.js +14 -4
- package/dist/command-catalog.js.map +1 -1
- package/dist/interactive/mcp.js +13 -3
- package/dist/interactive/mcp.js.map +1 -1
- package/dist/mcp/commands.d.ts +2 -1
- package/dist/mcp/commands.js +21 -5
- package/dist/mcp/commands.js.map +1 -1
- package/dist/mcp/install.d.ts +1 -0
- package/dist/mcp/install.js +15 -9
- package/dist/mcp/install.js.map +1 -1
- package/dist/mcp-gateway/commands.d.ts +24 -0
- package/dist/mcp-gateway/commands.js +125 -0
- package/dist/mcp-gateway/commands.js.map +1 -0
- package/dist/mcp-gateway/install.d.ts +22 -0
- package/dist/mcp-gateway/install.js +36 -0
- package/dist/mcp-gateway/install.js.map +1 -0
- package/dist/mcp-gateway/profile.d.ts +61 -0
- package/dist/mcp-gateway/profile.js +155 -0
- package/dist/mcp-gateway/profile.js.map +1 -0
- package/dist/mcp-gateway/runtime.d.ts +141 -0
- package/dist/mcp-gateway/runtime.js +148 -0
- package/dist/mcp-gateway/runtime.js.map +1 -0
- package/package.json +4 -4
- package/skills/numa-cli/SKILL.md +1 -1
- package/skills/numa-cli/numa-skill.json +1 -1
- package/skills/numa-cli/references/cli-mcp.md +3 -3
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
2
|
+
import type { AuthConfig } from "../config.js";
|
|
3
|
+
import { type KeycloakFetchDependencies } from "../oauth.js";
|
|
4
|
+
import { type GatewayBinding } from "./profile.js";
|
|
5
|
+
export type RuntimeDependencies = KeycloakFetchDependencies & {
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function serviceEndpoint(binding: GatewayBinding, service: string): string;
|
|
9
|
+
export declare function gatewayFetch(binding: GatewayBinding, auth: AuthConfig, dependencies?: RuntimeDependencies, exactEndpoint?: string): typeof fetch;
|
|
10
|
+
export declare function gatewayTransport(binding: GatewayBinding, auth: AuthConfig, service: string, dependencies?: RuntimeDependencies): StreamableHTTPClientTransport;
|
|
11
|
+
export declare function listGatewayTools(binding: GatewayBinding, auth: AuthConfig, service: string, dependencies?: RuntimeDependencies): Promise<{
|
|
12
|
+
tools: {
|
|
13
|
+
inputSchema: {
|
|
14
|
+
[x: string]: unknown;
|
|
15
|
+
type: "object";
|
|
16
|
+
properties?: Record<string, object> | undefined;
|
|
17
|
+
required?: string[] | undefined;
|
|
18
|
+
};
|
|
19
|
+
name: string;
|
|
20
|
+
description?: string | undefined;
|
|
21
|
+
outputSchema?: {
|
|
22
|
+
[x: string]: unknown;
|
|
23
|
+
type: "object";
|
|
24
|
+
properties?: Record<string, object> | undefined;
|
|
25
|
+
required?: string[] | undefined;
|
|
26
|
+
} | undefined;
|
|
27
|
+
annotations?: {
|
|
28
|
+
title?: string | undefined;
|
|
29
|
+
readOnlyHint?: boolean | undefined;
|
|
30
|
+
destructiveHint?: boolean | undefined;
|
|
31
|
+
idempotentHint?: boolean | undefined;
|
|
32
|
+
openWorldHint?: boolean | undefined;
|
|
33
|
+
} | undefined;
|
|
34
|
+
execution?: {
|
|
35
|
+
taskSupport?: "optional" | "required" | "forbidden" | undefined;
|
|
36
|
+
} | undefined;
|
|
37
|
+
_meta?: Record<string, unknown> | undefined;
|
|
38
|
+
icons?: {
|
|
39
|
+
src: string;
|
|
40
|
+
mimeType?: string | undefined;
|
|
41
|
+
sizes?: string[] | undefined;
|
|
42
|
+
theme?: "light" | "dark" | undefined;
|
|
43
|
+
}[] | undefined;
|
|
44
|
+
title?: string | undefined;
|
|
45
|
+
}[];
|
|
46
|
+
}>;
|
|
47
|
+
export declare function callGatewayTool(binding: GatewayBinding, auth: AuthConfig, service: string, tool: string, argumentsValue: Record<string, unknown>, dependencies?: RuntimeDependencies): Promise<{
|
|
48
|
+
[x: string]: unknown;
|
|
49
|
+
content: ({
|
|
50
|
+
type: "text";
|
|
51
|
+
text: string;
|
|
52
|
+
annotations?: {
|
|
53
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
54
|
+
priority?: number | undefined;
|
|
55
|
+
lastModified?: string | undefined;
|
|
56
|
+
} | undefined;
|
|
57
|
+
_meta?: Record<string, unknown> | undefined;
|
|
58
|
+
} | {
|
|
59
|
+
type: "image";
|
|
60
|
+
data: string;
|
|
61
|
+
mimeType: string;
|
|
62
|
+
annotations?: {
|
|
63
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
64
|
+
priority?: number | undefined;
|
|
65
|
+
lastModified?: string | undefined;
|
|
66
|
+
} | undefined;
|
|
67
|
+
_meta?: Record<string, unknown> | undefined;
|
|
68
|
+
} | {
|
|
69
|
+
type: "audio";
|
|
70
|
+
data: string;
|
|
71
|
+
mimeType: string;
|
|
72
|
+
annotations?: {
|
|
73
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
74
|
+
priority?: number | undefined;
|
|
75
|
+
lastModified?: string | undefined;
|
|
76
|
+
} | undefined;
|
|
77
|
+
_meta?: Record<string, unknown> | undefined;
|
|
78
|
+
} | {
|
|
79
|
+
type: "resource";
|
|
80
|
+
resource: {
|
|
81
|
+
uri: string;
|
|
82
|
+
text: string;
|
|
83
|
+
mimeType?: string | undefined;
|
|
84
|
+
_meta?: Record<string, unknown> | undefined;
|
|
85
|
+
} | {
|
|
86
|
+
uri: string;
|
|
87
|
+
blob: string;
|
|
88
|
+
mimeType?: string | undefined;
|
|
89
|
+
_meta?: Record<string, unknown> | undefined;
|
|
90
|
+
};
|
|
91
|
+
annotations?: {
|
|
92
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
93
|
+
priority?: number | undefined;
|
|
94
|
+
lastModified?: string | undefined;
|
|
95
|
+
} | undefined;
|
|
96
|
+
_meta?: Record<string, unknown> | undefined;
|
|
97
|
+
} | {
|
|
98
|
+
uri: string;
|
|
99
|
+
name: string;
|
|
100
|
+
type: "resource_link";
|
|
101
|
+
description?: string | undefined;
|
|
102
|
+
mimeType?: string | undefined;
|
|
103
|
+
size?: number | undefined;
|
|
104
|
+
annotations?: {
|
|
105
|
+
audience?: ("user" | "assistant")[] | undefined;
|
|
106
|
+
priority?: number | undefined;
|
|
107
|
+
lastModified?: string | undefined;
|
|
108
|
+
} | undefined;
|
|
109
|
+
_meta?: {
|
|
110
|
+
[x: string]: unknown;
|
|
111
|
+
} | undefined;
|
|
112
|
+
icons?: {
|
|
113
|
+
src: string;
|
|
114
|
+
mimeType?: string | undefined;
|
|
115
|
+
sizes?: string[] | undefined;
|
|
116
|
+
theme?: "light" | "dark" | undefined;
|
|
117
|
+
}[] | undefined;
|
|
118
|
+
title?: string | undefined;
|
|
119
|
+
})[];
|
|
120
|
+
_meta?: {
|
|
121
|
+
[x: string]: unknown;
|
|
122
|
+
progressToken?: string | number | undefined;
|
|
123
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
124
|
+
taskId: string;
|
|
125
|
+
} | undefined;
|
|
126
|
+
} | undefined;
|
|
127
|
+
structuredContent?: Record<string, unknown> | undefined;
|
|
128
|
+
isError?: boolean | undefined;
|
|
129
|
+
} | {
|
|
130
|
+
[x: string]: unknown;
|
|
131
|
+
toolResult: unknown;
|
|
132
|
+
_meta?: {
|
|
133
|
+
[x: string]: unknown;
|
|
134
|
+
progressToken?: string | number | undefined;
|
|
135
|
+
"io.modelcontextprotocol/related-task"?: {
|
|
136
|
+
taskId: string;
|
|
137
|
+
} | undefined;
|
|
138
|
+
} | undefined;
|
|
139
|
+
}>;
|
|
140
|
+
export declare function gatewayCatalog(binding: GatewayBinding, auth: AuthConfig, service?: string, dependencies?: RuntimeDependencies): Promise<Record<string, any>>;
|
|
141
|
+
export declare function runGatewayBridge(binding: GatewayBinding, auth: AuthConfig, service: string): Promise<void>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { PACKAGE_VERSION } from "../branding.js";
|
|
5
|
+
import { fetchWithKeycloakIdentity } from "../oauth.js";
|
|
6
|
+
import { bridgeMcpTransports } from "../ai-registry/bridge.js";
|
|
7
|
+
import { AiRegistryError } from "../ai-registry/errors.js";
|
|
8
|
+
import { gatewayError } from "./profile.js";
|
|
9
|
+
const MAX_BYTES = 4 * 1024 * 1024;
|
|
10
|
+
export function serviceEndpoint(binding, service) {
|
|
11
|
+
if (service === "@catalog")
|
|
12
|
+
return binding.baseUrl + "/catalog/mcp" + (binding.metadata.publishedEndpoints !== undefined ? `?gatewayId=${encodeURIComponent(binding.metadata.gatewayId)}` : "");
|
|
13
|
+
if (!/^[a-z0-9][a-z0-9-]{0,62}$/u.test(service))
|
|
14
|
+
throw gatewayError("Invalid MCP service name.");
|
|
15
|
+
if (binding.metadata.publishedEndpoints !== undefined) {
|
|
16
|
+
const endpoint = binding.metadata.publishedEndpoints.find(e => e.serviceId === service);
|
|
17
|
+
if (!endpoint)
|
|
18
|
+
throw gatewayError("MCP service has no published endpoint in this gateway profile.");
|
|
19
|
+
return endpoint.url;
|
|
20
|
+
}
|
|
21
|
+
return `${binding.baseUrl}/services/${service}/mcp`;
|
|
22
|
+
}
|
|
23
|
+
export function gatewayFetch(binding, auth, dependencies = {}, exactEndpoint) {
|
|
24
|
+
return async (input, init = {}) => {
|
|
25
|
+
const url = new URL(typeof input === "string" || input instanceof URL ? input : input.url);
|
|
26
|
+
const base = new URL(binding.baseUrl);
|
|
27
|
+
const catalogPath = base.pathname + "/api/v1/catalog";
|
|
28
|
+
const catalogRequest = url.pathname === catalogPath || /^\/[a-z0-9][a-z0-9-]{0,62}$/u.test(url.pathname.slice(catalogPath.length)) && url.pathname.startsWith(catalogPath + "/");
|
|
29
|
+
const validQuery = !url.search || (catalogRequest || url.pathname === base.pathname + "/catalog/mcp") && [...url.searchParams.keys()].every(k => k === "gatewayId") && url.searchParams.getAll("gatewayId").length === 1 && url.searchParams.get("gatewayId") === binding.metadata.gatewayId;
|
|
30
|
+
const allowedPath = exactEndpoint ? url.origin + url.pathname === new URL(exactEndpoint).origin + new URL(exactEndpoint).pathname && url.search === new URL(exactEndpoint).search : catalogRequest || url.pathname.startsWith(base.pathname + "/");
|
|
31
|
+
if (url.origin !== base.origin || !allowedPath || url.username || url.password || !validQuery || url.hash) {
|
|
32
|
+
throw gatewayError("MCP request escaped the selected gateway application.");
|
|
33
|
+
}
|
|
34
|
+
const timeout = AbortSignal.timeout(dependencies.timeoutMs ?? 60_000);
|
|
35
|
+
const signal = init.signal ? AbortSignal.any([init.signal, timeout]) : timeout;
|
|
36
|
+
const response = await fetchWithKeycloakIdentity(auth, url.toString(), () => ({ ...init, signal, redirect: "manual", headers: new Headers(init.headers) }), {
|
|
37
|
+
...dependencies, retryUnauthorized: false
|
|
38
|
+
});
|
|
39
|
+
if (response.status >= 300 && response.status < 400) {
|
|
40
|
+
await response.body?.cancel();
|
|
41
|
+
throw gatewayError("MCP gateway redirects are refused.");
|
|
42
|
+
}
|
|
43
|
+
if (Number(response.headers.get("content-length")) > MAX_BYTES) {
|
|
44
|
+
await response.body?.cancel();
|
|
45
|
+
throw gatewayError("MCP gateway response exceeds the size limit.");
|
|
46
|
+
}
|
|
47
|
+
if (!response.body)
|
|
48
|
+
return response;
|
|
49
|
+
let size = 0;
|
|
50
|
+
const bounded = response.body.pipeThrough(new TransformStream({
|
|
51
|
+
transform(chunk, controller) {
|
|
52
|
+
size += chunk.byteLength;
|
|
53
|
+
if (size > MAX_BYTES)
|
|
54
|
+
throw gatewayError("MCP gateway response exceeds the size limit.");
|
|
55
|
+
controller.enqueue(chunk);
|
|
56
|
+
}
|
|
57
|
+
}));
|
|
58
|
+
return new Response(bounded, { status: response.status, statusText: response.statusText, headers: response.headers });
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function gatewayTransport(binding, auth, service, dependencies = {}) {
|
|
62
|
+
if (binding.metadata.publishedEndpoints?.find(e => e.serviceId === service)?.transport === "sse")
|
|
63
|
+
throw gatewayError("Direct SSE providers are not supported by this bridge; publish a Streamable HTTP Router endpoint.");
|
|
64
|
+
return new StreamableHTTPClientTransport(new URL(serviceEndpoint(binding, service)), { fetch: gatewayFetch(binding, auth, dependencies, serviceEndpoint(binding, service)) });
|
|
65
|
+
}
|
|
66
|
+
function safeError(error) {
|
|
67
|
+
if (error instanceof AiRegistryError)
|
|
68
|
+
return error;
|
|
69
|
+
const code = error?.code;
|
|
70
|
+
const status = error?.status ?? (typeof code === "number" && code >= 400 && code <= 599 ? code : undefined);
|
|
71
|
+
if (status === 401 || status === 403)
|
|
72
|
+
return new AiRegistryError(`MCP gateway access denied (HTTP ${status}).`, "mcp_gateway_forbidden", status);
|
|
73
|
+
if (typeof code === "string" && /login|auth|token/iu.test(code))
|
|
74
|
+
return gatewayError("MCP identity is unavailable; run numa mcp login for the selected namespace or supply its machine credential file.", "mcp_gateway_login_required");
|
|
75
|
+
return gatewayError("MCP gateway request failed; check namespace identity, connectivity and service state.", "mcp_gateway_request_failed");
|
|
76
|
+
}
|
|
77
|
+
async function withClient(binding, auth, service, dependencies, operation) {
|
|
78
|
+
const client = new Client({ name: "numa-mcp-gateway", version: PACKAGE_VERSION });
|
|
79
|
+
let timer;
|
|
80
|
+
try {
|
|
81
|
+
return await Promise.race([
|
|
82
|
+
(async () => { await client.connect(gatewayTransport(binding, auth, service, dependencies)); return operation(client); })(),
|
|
83
|
+
new Promise((_resolve, reject) => { timer = setTimeout(() => reject(gatewayError("MCP operation timed out.", "mcp_gateway_timeout")), dependencies.timeoutMs ?? 60_000); })
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
throw safeError(error);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
await client.close().catch(() => undefined);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export async function listGatewayTools(binding, auth, service, dependencies = {}) {
|
|
95
|
+
return withClient(binding, auth, service, dependencies, async (client) => {
|
|
96
|
+
const tools = [];
|
|
97
|
+
let cursor;
|
|
98
|
+
const seen = new Set();
|
|
99
|
+
for (let page = 0; page < 32; page++) {
|
|
100
|
+
const result = await client.listTools(cursor ? { cursor } : undefined);
|
|
101
|
+
tools.push(...result.tools);
|
|
102
|
+
if (tools.length > 4096)
|
|
103
|
+
throw gatewayError("Too many MCP tools.");
|
|
104
|
+
cursor = result.nextCursor;
|
|
105
|
+
if (!cursor)
|
|
106
|
+
return { tools };
|
|
107
|
+
if (seen.has(cursor))
|
|
108
|
+
throw gatewayError("MCP tools pagination repeated a cursor.");
|
|
109
|
+
seen.add(cursor);
|
|
110
|
+
}
|
|
111
|
+
throw gatewayError("MCP tools pagination exceeded its limit.");
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export async function callGatewayTool(binding, auth, service, tool, argumentsValue, dependencies = {}) {
|
|
115
|
+
return withClient(binding, auth, service, dependencies, client => client.callTool({ name: tool, arguments: argumentsValue }, undefined, { timeout: dependencies.timeoutMs ?? 60_000 }));
|
|
116
|
+
}
|
|
117
|
+
export async function gatewayCatalog(binding, auth, service, dependencies = {}) {
|
|
118
|
+
if (service)
|
|
119
|
+
serviceEndpoint(binding, service);
|
|
120
|
+
try {
|
|
121
|
+
const response = await gatewayFetch(binding, auth, dependencies)(binding.baseUrl + "/api/v1/catalog" + (service ? `/${service}` : "") + (binding.metadata.publishedEndpoints !== undefined ? `?gatewayId=${encodeURIComponent(binding.metadata.gatewayId)}` : ""));
|
|
122
|
+
if (!response.ok)
|
|
123
|
+
throw new AiRegistryError(`MCP directory request failed (HTTP ${response.status}).`, "mcp_gateway_catalog_failed", response.status);
|
|
124
|
+
const value = await response.json();
|
|
125
|
+
const rows = service ? [value] : value.services;
|
|
126
|
+
if (!Array.isArray(rows) || rows.length > 256)
|
|
127
|
+
throw gatewayError("Invalid MCP directory response.");
|
|
128
|
+
for (const row of rows) {
|
|
129
|
+
if (typeof row.serviceId !== "string" || row.url !== serviceEndpoint(binding, row.serviceId) || row.transport !== (binding.metadata.publishedEndpoints?.find(e => e.serviceId === row.serviceId)?.transport ?? "streamable-http") || (row.gatewayId !== undefined && row.gatewayId !== binding.metadata.gatewayId) || !Array.isArray(row.tools))
|
|
130
|
+
throw gatewayError("MCP directory returned an endpoint outside the selected gateway binding.");
|
|
131
|
+
}
|
|
132
|
+
if (service && value.serviceId !== service)
|
|
133
|
+
throw gatewayError("MCP directory service identity mismatch.");
|
|
134
|
+
return value;
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw safeError(error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export async function runGatewayBridge(binding, auth, service) {
|
|
141
|
+
try {
|
|
142
|
+
await bridgeMcpTransports(new StdioServerTransport(), gatewayTransport(binding, auth, service));
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw safeError(error);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/mcp-gateway/runtime.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@numa-tech/numa",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"description": "Cross-platform CLI for the Numa internal developer platform with Keycloak authentication and MCP support.",
|
|
5
5
|
"author": "numa-tech",
|
|
6
6
|
"keywords": [
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"typecheck": "turbo run typecheck root:typecheck",
|
|
35
35
|
"root:typecheck": "tsc --noEmit",
|
|
36
36
|
"test": "turbo run test root:test",
|
|
37
|
-
"root:test": "node --import tsx --test src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/bootstrap.test.ts src/ai-registry/install-defaults.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/skill-uninstaller.test.ts src/ai-registry/skill-dependencies.test.ts src/ai-registry/updates.test.ts src/maintenance/scheduler.test.ts src/maintenance/codex.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/oss/client.test.ts src/oss/commands.test.ts src/oss/bootstrap.test.ts src/oss/transfers.test.ts src/oss/search.test.ts src/oss/tools.test.ts src/mcp/install.test.ts src/mcp/catalog.test.ts src/interactive/wizard.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs src/authorization/enrollment.test.ts src/authorization/group-client.test.ts src/authorization/group-commands.test.ts src/notion/client.test.ts src/notion/commands.test.ts src/notion/tools.test.ts src/notion/machine-cli.test.ts src/cloud/accounts.test.ts src/cloud/bootstrap.test.ts src/cloud/business-bootstrap.test.ts src/cloud/maintenance.test.ts src/cloud/wizard.test.ts src/cloud/oss-bootstrap.test.ts",
|
|
37
|
+
"root:test": "node --import tsx --test --test-concurrency=4 src/mcp-gateway/profile.test.ts src/mcp-gateway/runtime.test.ts src/mcp-gateway/install.test.ts src/branding.test.ts src/app-config.test.ts src/platform-profile.test.ts src/identity.test.ts src/backend.test.ts src/oauth.test.ts src/web-console.test.ts src/cli-options.test.ts src/mail/client.test.ts src/wecom/client.test.ts src/wecom/commands.test.ts src/wecom/tools.test.ts src/ai-registry/client.test.ts src/ai-registry/bootstrap.test.ts src/ai-registry/install-defaults.test.ts src/ai-registry/workspace.test.ts src/ai-registry/namespace.test.ts src/ai-registry/sync.test.ts src/ai-registry/bridge.test.ts src/ai-registry/skill-installer.test.ts src/ai-registry/skill-uninstaller.test.ts src/ai-registry/skill-dependencies.test.ts src/ai-registry/updates.test.ts src/maintenance/scheduler.test.ts src/maintenance/codex.test.ts src/ai-registry/mcp-installer.test.ts src/media/client.test.ts src/media/commands.test.ts src/media/transfers.test.ts src/oss/client.test.ts src/oss/commands.test.ts src/oss/bootstrap.test.ts src/oss/transfers.test.ts src/oss/search.test.ts src/oss/tools.test.ts src/mcp/install.test.ts src/mcp/catalog.test.ts src/interactive/wizard.test.ts src/pipeline/client.test.ts src/pipeline/commands.test.ts src/gitops/client.test.ts src/gitops/commands.test.ts src/repositories/client.test.ts src/repositories/commands.test.ts src/publications/scanner.test.ts src/publications/client.test.ts src/publications/commands.test.ts src/jenkins-jobs/client.test.ts src/jenkins-jobs/commands.test.ts src/clusters/client.test.ts src/clusters/commands.test.ts src/clusters/kubeconfig-discovery.test.ts src/teams/client.test.ts src/teams/commands.test.ts src/authorization/client.test.ts src/authorization/commands.test.ts src/authorization/access-request-client.test.ts src/authorization/access-request-commands.test.ts src/application-candidates/client.test.ts src/application-candidates/commands.test.ts src/application-onboarding/client.test.ts src/application-onboarding/commands.test.ts src/application-onboarding/tui.test.ts src/chatgpt-desktop.test.ts src/codex-integration.test.ts scripts/release-all.test.mjs src/authorization/enrollment.test.ts src/authorization/group-client.test.ts src/authorization/group-commands.test.ts src/notion/client.test.ts src/notion/commands.test.ts src/notion/tools.test.ts src/notion/machine-cli.test.ts src/cloud/accounts.test.ts src/cloud/bootstrap.test.ts src/cloud/business-bootstrap.test.ts src/cloud/maintenance.test.ts src/cloud/wizard.test.ts src/cloud/oss-bootstrap.test.ts",
|
|
38
38
|
"pack:check": "turbo run pack:check root:pack:check",
|
|
39
39
|
"root:pack:check": "node scripts/check-root-package.mjs",
|
|
40
40
|
"boundaries": "node scripts/check-workspace-boundaries.mjs",
|
|
@@ -57,8 +57,8 @@
|
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@clack/prompts": "^1.7.0",
|
|
59
59
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
60
|
-
"@numa-tech/cli-auth": "1.
|
|
61
|
-
"@tokensrc/codex": "1.
|
|
60
|
+
"@numa-tech/cli-auth": "1.17.0",
|
|
61
|
+
"@tokensrc/codex": "1.17.0",
|
|
62
62
|
"ali-oss": "^6.23.0",
|
|
63
63
|
"commander": "^14.0.3",
|
|
64
64
|
"ink": "^6.8.0",
|
package/skills/numa-cli/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: numa-cli
|
|
3
3
|
metadata:
|
|
4
|
-
version: "1.3.
|
|
4
|
+
version: "1.3.1"
|
|
5
5
|
description: Numa CLI 与 Skills/MCP 统一入口。用于 numa command not found、npx/Windows 启动、登录及环境检查、发现和安装企业 Skill、依赖与自动更新、项目 registry 锁定同步、上传审核发布,以及 CLI 自身的 stdio MCP、OSS/企微工具和 Agent 安装接入。其他 Numa 业务 Skill 依赖本 Skill;企微、Notion、OSS 和部署任务交给对应专用 Skill,Nacos 基础设施管理交给 numa-nacos。
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -41,14 +41,14 @@ JSON 配置合并保留无关条目。同名替换只有已获覆盖授权时使
|
|
|
41
41
|
|
|
42
42
|
默认 `--auth-mode browser`,先用相同系统用户运行 `numa login`,MCP 复用该用户的登录缓存。显式 browser 会清除 MCP 子进程继承的机器 Client ID/Secret 设置;不会替用户切换平台 profile。Issuer/API 由 platform profile 与既有配置规则提供,不在安装器里写死本地或生产地址。
|
|
43
43
|
|
|
44
|
-
机器身份使用用户明确指定的 Client 与 Secret 文件,不能仅凭三条地址/模式变量取得凭据:
|
|
44
|
+
机器身份使用用户明确指定的 Client 与 Secret 或 Secret 文件,不能仅凭三条地址/模式变量取得凭据:
|
|
45
45
|
|
|
46
46
|
```sh
|
|
47
47
|
numa mcp install-cli --agent workbuddy --auth-mode client_credentials \
|
|
48
48
|
--client-id CONFIRMED_CLIENT --client-secret-file /ABS/PROTECTED_SECRET_FILE --plan --json
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
-
核对计划后执行时去掉 `--plan
|
|
51
|
+
核对计划后执行时去掉 `--plan`。配置只记录文件路径,不读取或复制其内容;运行时由现有认证库校验文件保护。从 CLI 1.16.1 起,也可使用 `--client-secret "$NUMA_KEYCLOAK_CLIENT_SECRET"` 直接传值,与 `--client-secret-file` 互斥。直接模式将实际值保存到客户端环境配置,并清空继承的 Secret 文件路径;预览脱敏,交互向导隐藏输入。不使用公开 `mcp-client` 作为机器身份。机器模式失败不回退到个人登录。安装成功仅证明配置写入;使用 `numa_auth_status`、业务只读查询进一步核对实际身份和授权。
|
|
52
52
|
|
|
53
53
|
## ChatGPT 本地 stdio 接入
|
|
54
54
|
|
|
@@ -106,7 +106,7 @@ numa mcp install-cli --agent workbuddy --scope user --modules oss \
|
|
|
106
106
|
`mcp install-cli --env NAME=VALUE` 可重复,写入 MCP 子进程环境并保留生成器原有变量;值支持等号和空字符串。
|
|
107
107
|
重复变量名会拒绝。敏感字段在输出计划中隐藏,向导用隐藏输入;实际值写入私有客户端配置或 Tunnel launcher。
|
|
108
108
|
不要把秘密写进聊天、命令示例或共享日志。CLI 身份字段使用专门的 `--auth-mode`、`--client-id`、
|
|
109
|
-
`--client-secret-file`,禁止通过 `--env` 覆盖身份模式、Client ID、Secret 或 Secret 文件路径。
|
|
109
|
+
`--client-secret` 或 `--client-secret-file`,禁止通过 `--env` 覆盖身份模式、Client ID、Secret 或 Secret 文件路径。
|
|
110
110
|
普通业务配置可通过环境变量追加;不修改 `.zshenv`,不自行换平台地址。
|
|
111
111
|
|
|
112
112
|
企业 `mcp install NAME --transport bridge --env NAME=VALUE` 也支持本地启动环境。
|