kloudy-mcp 0.1.7 → 0.1.10
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 +7 -7
- package/dist/kloudy-mcp/src/capability-adapter.d.ts +3 -0
- package/dist/kloudy-mcp/src/capability-adapter.js +37 -0
- package/dist/kloudy-mcp/src/capability-adapter.js.map +1 -0
- package/dist/kloudy-mcp/src/cli.js +5 -5
- package/dist/kloudy-mcp/src/cli.js.map +1 -1
- package/dist/kloudy-mcp/src/clients.d.ts +2 -2
- package/dist/kloudy-mcp/src/clients.js +2 -2
- package/dist/kloudy-mcp/src/clients.js.map +1 -1
- package/dist/kloudy-mcp/src/http-auth.js +7 -10
- package/dist/kloudy-mcp/src/http-auth.js.map +1 -1
- package/dist/kloudy-mcp/src/mcp-server.d.ts +2 -2
- package/dist/kloudy-mcp/src/mcp-server.js +6 -5
- package/dist/kloudy-mcp/src/mcp-server.js.map +1 -1
- package/dist/kloudy-mcp/src/version.d.ts +1 -1
- package/dist/kloudy-mcp/src/version.js +1 -1
- package/dist/kloudy-mcp/src/version.js.map +1 -1
- package/dist/shared/src/api-x/client.d.ts +5 -6
- package/dist/shared/src/api-x/client.js +74 -87
- package/dist/shared/src/api-x/client.js.map +1 -1
- package/dist/shared/src/api-x/projections.js +6 -4
- package/dist/shared/src/api-x/projections.js.map +1 -1
- package/dist/shared/src/api-x/types.d.ts +2 -2
- package/dist/shared/src/browser-login.js +14 -8
- package/dist/shared/src/browser-login.js.map +1 -1
- package/dist/shared/src/capabilities/account.d.ts +3 -0
- package/dist/shared/src/capabilities/account.js +11 -0
- package/dist/shared/src/capabilities/account.js.map +1 -0
- package/dist/shared/src/capabilities/archive.d.ts +3 -0
- package/dist/shared/src/capabilities/archive.js +107 -0
- package/dist/shared/src/capabilities/archive.js.map +1 -0
- package/dist/shared/src/capabilities/blog.d.ts +3 -0
- package/dist/shared/src/capabilities/blog.js +34 -0
- package/dist/shared/src/capabilities/blog.js.map +1 -0
- package/dist/{kloudy-mcp/src/tools → shared/src/capabilities}/catalog.d.ts +70 -19
- package/dist/{kloudy-mcp/src/tools → shared/src/capabilities}/catalog.js +35 -20
- package/dist/shared/src/capabilities/catalog.js.map +1 -0
- package/dist/shared/src/capabilities/characters.d.ts +5 -0
- package/dist/shared/src/capabilities/characters.js +20 -0
- package/dist/shared/src/capabilities/characters.js.map +1 -0
- package/dist/shared/src/capabilities/community.d.ts +3 -0
- package/dist/shared/src/capabilities/community.js +31 -0
- package/dist/shared/src/capabilities/community.js.map +1 -0
- package/dist/shared/src/capabilities/documents.d.ts +3 -0
- package/dist/shared/src/capabilities/documents.js +30 -0
- package/dist/shared/src/capabilities/documents.js.map +1 -0
- package/dist/shared/src/capabilities/instructions.d.ts +1 -0
- package/dist/shared/src/capabilities/instructions.js +3 -0
- package/dist/shared/src/capabilities/instructions.js.map +1 -0
- package/dist/shared/src/capabilities/links.d.ts +3 -0
- package/dist/shared/src/capabilities/links.js +15 -0
- package/dist/shared/src/capabilities/links.js.map +1 -0
- package/dist/shared/src/capabilities/registry.d.ts +20 -0
- package/dist/shared/src/capabilities/registry.js +54 -0
- package/dist/shared/src/capabilities/registry.js.map +1 -0
- package/dist/{kloudy-mcp/src/tools → shared/src/capabilities}/shared.d.ts +5 -14
- package/dist/{kloudy-mcp/src/tools → shared/src/capabilities}/shared.js +9 -15
- package/dist/shared/src/capabilities/shared.js.map +1 -0
- package/dist/shared/src/capabilities/taxonomy.d.ts +3 -0
- package/dist/shared/src/capabilities/taxonomy.js +26 -0
- package/dist/shared/src/capabilities/taxonomy.js.map +1 -0
- package/dist/shared/src/capabilities/wiki-semantic.d.ts +3 -0
- package/dist/shared/src/capabilities/wiki-semantic.js +12 -0
- package/dist/shared/src/capabilities/wiki-semantic.js.map +1 -0
- package/dist/{kloudy-mcp/src/rules → shared/src/capabilities}/wiki-writing-rules.d.ts +1 -1
- package/dist/{kloudy-mcp/src/rules → shared/src/capabilities}/wiki-writing-rules.js +1 -1
- package/dist/shared/src/capabilities/wiki-writing-rules.js.map +1 -0
- package/dist/shared/src/capabilities/wiki.d.ts +3 -0
- package/dist/shared/src/capabilities/wiki.js +49 -0
- package/dist/shared/src/capabilities/wiki.js.map +1 -0
- package/dist/shared/src/config.d.ts +2 -4
- package/dist/shared/src/config.js +2 -13
- package/dist/shared/src/config.js.map +1 -1
- package/dist/shared/src/{api-a → knowledge}/client.d.ts +4 -4
- package/dist/shared/src/{api-a → knowledge}/client.js +24 -30
- package/dist/shared/src/knowledge/client.js.map +1 -0
- package/dist/shared/src/knowledge/types.d.ts +22 -0
- package/dist/shared/src/knowledge/types.js.map +1 -0
- package/dist/shared/src/state-store.d.ts +20 -18
- package/dist/shared/src/state-store.js +18 -18
- package/dist/shared/src/state-store.js.map +1 -1
- package/docs/http-deployment.md +283 -0
- package/docs/http-mcp.md +29 -27
- package/docs/local-mcp.md +38 -55
- package/package.json +1 -1
- package/dist/kloudy-mcp/src/rules/wiki-writing-rules.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/account.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/account.js +0 -13
- package/dist/kloudy-mcp/src/tools/account.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/archive.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/archive.js +0 -107
- package/dist/kloudy-mcp/src/tools/archive.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/blog.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/blog.js +0 -34
- package/dist/kloudy-mcp/src/tools/blog.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/catalog.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/characters.d.ts +0 -5
- package/dist/kloudy-mcp/src/tools/characters.js +0 -20
- package/dist/kloudy-mcp/src/tools/characters.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/community.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/community.js +0 -31
- package/dist/kloudy-mcp/src/tools/community.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/documents.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/documents.js +0 -30
- package/dist/kloudy-mcp/src/tools/documents.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/knowledge.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/knowledge.js +0 -12
- package/dist/kloudy-mcp/src/tools/knowledge.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/links.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/links.js +0 -15
- package/dist/kloudy-mcp/src/tools/links.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/registry.d.ts +0 -4
- package/dist/kloudy-mcp/src/tools/registry.js +0 -23
- package/dist/kloudy-mcp/src/tools/registry.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/shared.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/taxonomy.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/taxonomy.js +0 -26
- package/dist/kloudy-mcp/src/tools/taxonomy.js.map +0 -1
- package/dist/kloudy-mcp/src/tools/wiki.d.ts +0 -3
- package/dist/kloudy-mcp/src/tools/wiki.js +0 -49
- package/dist/kloudy-mcp/src/tools/wiki.js.map +0 -1
- package/dist/shared/src/api-a/client.js.map +0 -1
- package/dist/shared/src/api-a/types.d.ts +0 -22
- package/dist/shared/src/api-a/types.js.map +0 -1
- /package/dist/shared/src/{api-a → knowledge}/types.js +0 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# kloudy-mcp
|
|
2
2
|
|
|
3
|
-
Kloudy 的本地 stdio 与远程 Streamable HTTP MCP
|
|
3
|
+
Kloudy 的本地 stdio 与远程 Streamable HTTP MCP 服务。它只通过 HTTPS 调用 Kloudy API-X;RAG 由 API-X 转发到本地 Agent Server,MCP 不直接连接数据库、向量库、Agent Server 或 Kloudy 内容仓库。
|
|
4
4
|
|
|
5
5
|
## 使用
|
|
6
6
|
|
|
@@ -12,13 +12,13 @@ Kloudy 的本地 stdio 与远程 Streamable HTTP MCP 服务。它通过 HTTPS
|
|
|
12
12
|
npx -y kloudy-mcp --version
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
启动本地 MCP:
|
|
16
16
|
|
|
17
17
|
```bash
|
|
18
18
|
npx -y kloudy-mcp serve
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
调用业务工具前,通过浏览器 OAuth 登录并选择固定的 Agent Character:
|
|
22
22
|
|
|
23
23
|
```bash
|
|
24
24
|
npx -y kloudy-mcp login
|
|
@@ -36,7 +36,7 @@ npx -y kloudy-mcp logout
|
|
|
36
36
|
codex mcp add kloudy -- npx -y kloudy-mcp serve
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
`serve`、`login` 和 `logout` 面向本地单用户客户端。Kloudy 自有 Agent 的生产主路径是常驻 `serve-http` 的内部 `/internal/mcp`:API-G
|
|
39
|
+
`serve`、`login` 和 `logout` 面向本地单用户客户端。Kloudy 自有 Agent 的生产主路径是常驻 `serve-http` 的内部 `/internal/mcp`:API-G 使用独立服务身份,并为每个协议请求携带绑定单个 Agent Character 的 OAuth Access Token。`serve-request` 保留为每 Run 独立进程的诊断和显式回滚路径。三种入口调用同一个工具注册和 Schema,因此新增能力只需在 MCP 契约中实现一次,是否向模型开放仍由各 Agent 的工具政策决定。
|
|
40
40
|
|
|
41
41
|
远程服务使用:
|
|
42
42
|
|
|
@@ -44,8 +44,8 @@ codex mcp add kloudy -- npx -y kloudy-mcp serve
|
|
|
44
44
|
kloudy-mcp serve-http
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
`serve-http` 提供公开 OAuth `/mcp`、受信服务身份 `/internal/mcp`、路径型 OAuth Protected Resource Metadata 和本机健康接口。它不读取本地登录文件;两个 MCP 入口都把
|
|
47
|
+
`serve-http` 提供公开 OAuth `/mcp`、受信服务身份 `/internal/mcp`、路径型 OAuth Protected Resource Metadata 和本机健康接口。它不读取本地登录文件;两个 MCP 入口都把 OAuth Access Token限制在当前请求内存中,且使用彼此独立的认证方式。协议、身份和全部配置项见 [Streamable HTTP 说明](docs/http-mcp.md);使用仅依赖正式 npm 包的最小项目部署到 Linux,见 [HTTP MCP 独立项目部署](docs/http-deployment.md)。
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
默认连接线上 API-X `https://shape.kloudy.cn/api-x`、网页 `https://shape.kloudy.cn` 和 Resource `https://shape.kloudy.cn/mcp`。可通过 `KLOUDY_API_X_BASE_URL`、`KLOUDY_WEB_BASE_URL` 和 `KLOUDY_MCP_OAUTH_RESOURCE_URL` 显式配置本地客户端的服务、网页和 OAuth Resource 地址;HTTP MCP 服务另用 `KLOUDY_MCP_PUBLIC_URL` 配置自身 Resource。
|
|
50
50
|
|
|
51
|
-
`
|
|
51
|
+
`wiki_semantic_search` 需要登录,通过 API-X `/agent/knowledge/wiki/semantic-search` 返回索引版本、Wiki 证据片段和来源 URL;最终知识回答由 MCP 客户端根据证据生成,证据不足时应明确拒答。账号私有读取和写入工具也需要登录。Community 评论会立即公开发布,但只能删除当前 Agent Character 自己发布的评论;Blog 工具只能操作草稿;Archive 和 Wiki 投稿需要管理员审核后才会发布。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function registerCapabilityTools(server, registry) {
|
|
2
|
+
for (const capability of registry.list()) {
|
|
3
|
+
const { name, config } = capability;
|
|
4
|
+
const { policy } = config;
|
|
5
|
+
server.registerTool(name, {
|
|
6
|
+
title: policy.title,
|
|
7
|
+
description: config.description,
|
|
8
|
+
inputSchema: config.inputSchema,
|
|
9
|
+
annotations: {
|
|
10
|
+
readOnlyHint: policy.readOnly,
|
|
11
|
+
destructiveHint: policy.risk === 'draft-delete' || policy.risk === 'public-delete',
|
|
12
|
+
idempotentHint: policy.idempotent,
|
|
13
|
+
openWorldHint: true,
|
|
14
|
+
},
|
|
15
|
+
_meta: {
|
|
16
|
+
'kloudy/apiOperation': policy.apiOperation,
|
|
17
|
+
'kloudy/allowedCharacterTypes': [...policy.allowedCharacterTypes],
|
|
18
|
+
'kloudy/minimumPermission': policy.minimumPermission,
|
|
19
|
+
'kloudy/risk': policy.risk,
|
|
20
|
+
'kloudy/publicContentEffect': policy.publicContentEffect,
|
|
21
|
+
'kloudy/timeoutMs': policy.timeoutMs,
|
|
22
|
+
'kloudy/maxResultBytes': policy.maxResultBytes,
|
|
23
|
+
'kloudy/domain': config.domain,
|
|
24
|
+
...(config.retrievalMode ? { 'kloudy/retrievalMode': config.retrievalMode } : {}),
|
|
25
|
+
...(config.resultKind ? { 'kloudy/resultKind': config.resultKind } : {}),
|
|
26
|
+
},
|
|
27
|
+
}, async (input) => toMcpResult(await registry.invoke(name, input)));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function toMcpResult(outcome) {
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: 'text', text: JSON.stringify(outcome.value, null, 2) }],
|
|
33
|
+
structuredContent: outcome.value,
|
|
34
|
+
...(outcome.isError ? { isError: true } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=capability-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capability-adapter.js","sourceRoot":"","sources":["../../../src/capability-adapter.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,QAA4B;IACrF,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC;QACpC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE;YACxB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE;gBACX,YAAY,EAAE,MAAM,CAAC,QAAQ;gBAC7B,eAAe,EAAE,MAAM,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe;gBAClF,cAAc,EAAE,MAAM,CAAC,UAAU;gBACjC,aAAa,EAAE,IAAI;aACpB;YACD,KAAK,EAAE;gBACL,qBAAqB,EAAE,MAAM,CAAC,YAAY;gBAC1C,8BAA8B,EAAE,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC;gBACjE,0BAA0B,EAAE,MAAM,CAAC,iBAAiB;gBACpD,aAAa,EAAE,MAAM,CAAC,IAAI;gBAC1B,4BAA4B,EAAE,MAAM,CAAC,mBAAmB;gBACxD,kBAAkB,EAAE,MAAM,CAAC,SAAS;gBACpC,uBAAuB,EAAE,MAAM,CAAC,cAAc;gBAC9C,eAAe,EAAE,MAAM,CAAC,MAAM;gBAC9B,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjF,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACzE;SACF,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,OAA0B;IAC7C,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAClF,iBAAiB,EAAE,OAAO,CAAC,KAAK;QAChC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -50,12 +50,12 @@ async function main() {
|
|
|
50
50
|
const config = loadConfig();
|
|
51
51
|
const api = new ApiXClient(config, new FileStateStore(config.stateDirectory), fetch, `kloudy-mcp/${KLOUDY_MCP_VERSION}`, 'local-mcp');
|
|
52
52
|
const result = await loginWithBrowser(api, config);
|
|
53
|
-
stderr.write(`
|
|
53
|
+
stderr.write(`Kloudy OAuth authorization completed for client ${result.clientId}.\n`);
|
|
54
54
|
return;
|
|
55
55
|
}
|
|
56
56
|
case 'logout':
|
|
57
57
|
await createApiClient().logout();
|
|
58
|
-
stderr.write('Logged out of Kloudy
|
|
58
|
+
stderr.write('Logged out of Kloudy and revoked the local OAuth token family.\n');
|
|
59
59
|
return;
|
|
60
60
|
case 'help':
|
|
61
61
|
case '--help':
|
|
@@ -84,11 +84,11 @@ function helpText() {
|
|
|
84
84
|
'',
|
|
85
85
|
'Optional environment:',
|
|
86
86
|
' KLOUDY_API_X_BASE_URL Override the default https://shape.kloudy.cn/api-x address',
|
|
87
|
-
' KLOUDY_API_A_BASE_URL Override the default https://shape.kloudy.cn/api-a address',
|
|
88
87
|
' KLOUDY_WEB_BASE_URL Override the default https://shape.kloudy.cn address',
|
|
88
|
+
' KLOUDY_MCP_OAUTH_RESOURCE_URL OAuth Resource for local client login and token refresh',
|
|
89
89
|
' KLOUDY_MCP_HTTP_HOST serve-http listen host (default 127.0.0.1)',
|
|
90
90
|
' KLOUDY_MCP_HTTP_PORT serve-http listen port (default 12176)',
|
|
91
|
-
' KLOUDY_MCP_PUBLIC_URL OAuth resource URL (production: https://kloudy.cn/mcp)',
|
|
91
|
+
' KLOUDY_MCP_PUBLIC_URL OAuth resource URL (production: https://shape.kloudy.cn/mcp)',
|
|
92
92
|
' KLOUDY_MCP_AUTHORIZATION_SERVER_URL OAuth authorization server issuer',
|
|
93
93
|
' KLOUDY_MCP_AUTH_CONTEXT_URL Trusted internal token context endpoint',
|
|
94
94
|
' KLOUDY_MCP_AUTH_CONTEXT_SERVICE_TOKEN Service token for that endpoint',
|
|
@@ -98,7 +98,7 @@ function helpText() {
|
|
|
98
98
|
'serve-http starts the remote Streamable HTTP resource server and requires OAuth/resource',
|
|
99
99
|
'configuration. It never reads or writes the local state file.',
|
|
100
100
|
'',
|
|
101
|
-
'Login opens a browser and requires an Agent Character. It is
|
|
101
|
+
'Login opens a browser and requires an Agent Character. It is required for business API calls.',
|
|
102
102
|
'',
|
|
103
103
|
].join('\n');
|
|
104
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KnowledgeApiClient } from '../../shared/src/knowledge/client.js';
|
|
2
2
|
import { ApiXClient } from '../../shared/src/api-x/client.js';
|
|
3
3
|
import { type AppConfig } from '../../shared/src/config.js';
|
|
4
4
|
import type { StateStore } from '../../shared/src/state-store.js';
|
|
5
5
|
export declare function createClients(stateStore: StateStore, clientKind: string, config?: AppConfig): {
|
|
6
6
|
api: ApiXClient;
|
|
7
|
-
knowledge:
|
|
7
|
+
knowledge: KnowledgeApiClient;
|
|
8
8
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KnowledgeApiClient } from '../../shared/src/knowledge/client.js';
|
|
2
2
|
import { ApiXClient } from '../../shared/src/api-x/client.js';
|
|
3
3
|
import { loadConfig } from '../../shared/src/config.js';
|
|
4
4
|
import { KLOUDY_MCP_VERSION } from './version.js';
|
|
@@ -6,7 +6,7 @@ export function createClients(stateStore, clientKind, config = loadConfig()) {
|
|
|
6
6
|
const userAgent = `kloudy-mcp/${KLOUDY_MCP_VERSION}`;
|
|
7
7
|
return {
|
|
8
8
|
api: new ApiXClient(config, stateStore, fetch, userAgent, clientKind),
|
|
9
|
-
knowledge: new
|
|
9
|
+
knowledge: new KnowledgeApiClient(config, stateStore, fetch, userAgent, clientKind),
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
12
|
//# sourceMappingURL=clients.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../../../src/clients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"clients.js","sourceRoot":"","sources":["../../../src/clients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAkB,MAAM,4BAA4B,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,aAAa,CAC3B,UAAsB,EACtB,UAAkB,EAClB,SAAoB,UAAU,EAAE;IAEhC,MAAM,SAAS,GAAG,cAAc,kBAAkB,EAAE,CAAC;IACrD,OAAO;QACL,GAAG,EAAE,IAAI,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC;QACrE,SAAS,EAAE,IAAI,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC;KACpF,CAAC;AACJ,CAAC"}
|
|
@@ -9,10 +9,11 @@ const authContextResponseSchema = z.object({
|
|
|
9
9
|
scopes: z.array(z.string().min(1).max(128)).max(64),
|
|
10
10
|
expiresAt: z.number().int().positive(),
|
|
11
11
|
resource: z.string().url(),
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
principalType: z.literal('oauth_agent'),
|
|
13
|
+
grantId: z.string().min(1),
|
|
14
|
+
character: z.object({
|
|
15
15
|
characterId: z.string().min(1).max(4096),
|
|
16
|
+
characterType: z.literal('agent'),
|
|
16
17
|
}),
|
|
17
18
|
});
|
|
18
19
|
const AUTH_IDENTITY_KEY = 'kloudyRequestIdentity';
|
|
@@ -60,7 +61,7 @@ export class HttpAuthContextVerifier {
|
|
|
60
61
|
throw invalidToken();
|
|
61
62
|
let stateStore;
|
|
62
63
|
try {
|
|
63
|
-
stateStore = new RequestStateStore(
|
|
64
|
+
stateStore = new RequestStateStore({ accessToken: token });
|
|
64
65
|
}
|
|
65
66
|
catch {
|
|
66
67
|
throw invalidToken();
|
|
@@ -82,9 +83,7 @@ export function requestStateFromAuthInfo(authInfo) {
|
|
|
82
83
|
const value = identity;
|
|
83
84
|
try {
|
|
84
85
|
return new RequestStateStore({
|
|
85
|
-
|
|
86
|
-
deviceId: String(value.deviceId ?? ''),
|
|
87
|
-
characterId: String(value.characterId ?? ''),
|
|
86
|
+
accessToken: String(value.accessToken ?? ''),
|
|
88
87
|
});
|
|
89
88
|
}
|
|
90
89
|
catch {
|
|
@@ -99,9 +98,7 @@ export function requestStateFromInternalHeaders(headers, expectedServiceToken) {
|
|
|
99
98
|
throw invalidToken();
|
|
100
99
|
try {
|
|
101
100
|
return new RequestStateStore({
|
|
102
|
-
|
|
103
|
-
deviceId: singleHeader(headers['k-device-id']) ?? '',
|
|
104
|
-
characterId: singleHeader(headers['k-character-id']) ?? '',
|
|
101
|
+
accessToken: singleHeader(headers['k-oauth-access-token']) ?? '',
|
|
105
102
|
});
|
|
106
103
|
}
|
|
107
104
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-auth.js","sourceRoot":"","sources":["../../../src/http-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAGpE,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAC9E,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC1B,
|
|
1
|
+
{"version":3,"file":"http-auth.js","sourceRoot":"","sources":["../../../src/http-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { WikiSemanticApi } from '../../shared/src/knowledge/types.js';
|
|
3
3
|
import type { KloudyApi } from '../../shared/src/api-x/types.js';
|
|
4
|
-
export declare function createMcpServer(api: KloudyApi,
|
|
4
|
+
export declare function createMcpServer(api: KloudyApi, wikiSemantic: WikiSemanticApi): McpServer;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KLOUDY_CAPABILITY_INSTRUCTIONS } from '../../shared/src/capabilities/instructions.js';
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
-
import {
|
|
3
|
+
import { createCapabilityRegistry } from '../../shared/src/capabilities/registry.js';
|
|
4
|
+
import { registerCapabilityTools } from './capability-adapter.js';
|
|
4
5
|
import { KLOUDY_MCP_VERSION } from './version.js';
|
|
5
|
-
export function createMcpServer(api,
|
|
6
|
+
export function createMcpServer(api, wikiSemantic) {
|
|
6
7
|
const server = new McpServer({ name: 'kloudy-mcp', version: KLOUDY_MCP_VERSION }, {
|
|
7
|
-
instructions:
|
|
8
|
+
instructions: KLOUDY_CAPABILITY_INSTRUCTIONS,
|
|
8
9
|
});
|
|
9
|
-
|
|
10
|
+
registerCapabilityTools(server, createCapabilityRegistry(api, wikiSemantic));
|
|
10
11
|
return server;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../../src/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,8BAA8B,EAAE,MAAM,+CAA+C,CAAC;AAC/F,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,UAAU,eAAe,CAAC,GAAc,EAAE,YAA6B;IAC3E,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,EACnD;QACE,YAAY,EAAE,8BAA8B;KAC7C,CACF,CAAC;IAEF,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC7E,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const KLOUDY_MCP_VERSION = "0.1.
|
|
1
|
+
export declare const KLOUDY_MCP_VERSION = "0.1.10";
|
|
2
2
|
export declare function getVersionCommandOutput(command: string, args: string[]): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC;AAE3C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjE,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,IAAc;IACrE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACrD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,4BAA4B,CAAC,CAAC;IAC7E,OAAO,GAAG,kBAAkB,IAAI,CAAC;AACnC,CAAC"}
|
|
@@ -7,8 +7,7 @@ export declare class ApiXError extends Error {
|
|
|
7
7
|
constructor(message: string, code: string, retryable: boolean);
|
|
8
8
|
}
|
|
9
9
|
export interface LoginResult {
|
|
10
|
-
|
|
11
|
-
characterId: string;
|
|
10
|
+
clientId: string;
|
|
12
11
|
}
|
|
13
12
|
export declare class ApiXClient implements KloudyApi {
|
|
14
13
|
private readonly config;
|
|
@@ -16,11 +15,10 @@ export declare class ApiXClient implements KloudyApi {
|
|
|
16
15
|
private readonly fetchImpl;
|
|
17
16
|
private readonly clientIdentity;
|
|
18
17
|
private readonly clientKind;
|
|
19
|
-
private deviceRegistration;
|
|
20
18
|
constructor(config: AppConfig, stateStore: StateStore, fetchImpl?: typeof fetch, clientIdentity?: string, clientKind?: string);
|
|
21
|
-
ensureDevice(): Promise<string>;
|
|
22
19
|
hasSession(): Promise<boolean>;
|
|
23
|
-
|
|
20
|
+
registerOAuthClient(redirectUri: string): Promise<string>;
|
|
21
|
+
exchangeAgentAuthorization(clientId: string, code: string, codeVerifier: string, redirectUri: string): Promise<LoginResult>;
|
|
24
22
|
logout(): Promise<void>;
|
|
25
23
|
getCapabilities(runId: string): Promise<import("./types.js").AgentCapabilities>;
|
|
26
24
|
getAccountContext(runId: string): Promise<import("./types.js").AccountContext>;
|
|
@@ -101,7 +99,8 @@ export declare class ApiXClient implements KloudyApi {
|
|
|
101
99
|
openBlogDraft(articleId: string, runId: string): Promise<import("./types.js").BlogDraft>;
|
|
102
100
|
updateBlogDraftContent(articleId: string, content: string, runId: string): Promise<import("./types.js").BlogDraftContent>;
|
|
103
101
|
private contributionAction;
|
|
104
|
-
private registerDevice;
|
|
105
102
|
private request;
|
|
106
103
|
private requestWithHeaders;
|
|
104
|
+
private ensureAccessToken;
|
|
105
|
+
private oauthRequest;
|
|
107
106
|
}
|
|
@@ -16,7 +16,6 @@ export class ApiXClient {
|
|
|
16
16
|
fetchImpl;
|
|
17
17
|
clientIdentity;
|
|
18
18
|
clientKind;
|
|
19
|
-
deviceRegistration;
|
|
20
19
|
constructor(config, stateStore, fetchImpl = fetch, clientIdentity = 'kloudy-agent-tools', clientKind = 'local-mcp') {
|
|
21
20
|
this.config = config;
|
|
22
21
|
this.stateStore = stateStore;
|
|
@@ -24,47 +23,39 @@ export class ApiXClient {
|
|
|
24
23
|
this.clientIdentity = clientIdentity;
|
|
25
24
|
this.clientKind = clientKind;
|
|
26
25
|
}
|
|
27
|
-
async ensureDevice() {
|
|
28
|
-
const existing = await this.stateStore.read();
|
|
29
|
-
if (existing.deviceId)
|
|
30
|
-
return existing.deviceId;
|
|
31
|
-
if (this.stateStore.scope === 'request') {
|
|
32
|
-
throw new ApiXError('Request-scoped Kloudy identity is incomplete', 'request_identity_invalid', false);
|
|
33
|
-
}
|
|
34
|
-
if (!this.deviceRegistration) {
|
|
35
|
-
this.deviceRegistration = this.registerDevice().finally(() => {
|
|
36
|
-
this.deviceRegistration = undefined;
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
return this.deviceRegistration;
|
|
40
|
-
}
|
|
41
26
|
async hasSession() {
|
|
42
|
-
return Boolean((await this.stateStore.read()).
|
|
27
|
+
return Boolean((await this.stateStore.read()).accessToken);
|
|
28
|
+
}
|
|
29
|
+
async registerOAuthClient(redirectUri) {
|
|
30
|
+
const value = await this.oauthRequest('/oauth/register', {
|
|
31
|
+
client_name: this.clientIdentity,
|
|
32
|
+
redirect_uris: [redirectUri],
|
|
33
|
+
grant_types: ['authorization_code', 'refresh_token'],
|
|
34
|
+
response_types: ['code'],
|
|
35
|
+
scope: 'mcp:tools',
|
|
36
|
+
application_type: 'native',
|
|
37
|
+
token_endpoint_auth_method: 'none',
|
|
38
|
+
});
|
|
39
|
+
if (!isRecord(value) || typeof value.client_id !== 'string') {
|
|
40
|
+
throw new ApiXError('OAuth client registration returned an invalid response', 'oauth_client_invalid', false);
|
|
41
|
+
}
|
|
42
|
+
return value.client_id;
|
|
43
43
|
}
|
|
44
|
-
async exchangeAgentAuthorization(code, codeVerifier, redirectUri) {
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
includeDevice: true,
|
|
49
|
-
// 授权码已绑定当前设备,设备失效时必须重新开始浏览器授权。
|
|
50
|
-
retryInvalidDevice: false,
|
|
51
|
-
includeSession: false,
|
|
44
|
+
async exchangeAgentAuthorization(clientId, code, codeVerifier, redirectUri) {
|
|
45
|
+
const value = await this.oauthRequest('/oauth/token', {
|
|
46
|
+
grant_type: 'authorization_code', client_id: clientId, code, code_verifier: codeVerifier,
|
|
47
|
+
redirect_uri: redirectUri, resource: this.config.mcpResourceUrl.toString(),
|
|
52
48
|
});
|
|
53
|
-
const
|
|
54
|
-
await this.stateStore.
|
|
55
|
-
|
|
56
|
-
sessionToken: parsed.tokenId,
|
|
57
|
-
userId: parsed.userId,
|
|
58
|
-
characterId: parsed.characterId,
|
|
59
|
-
}));
|
|
60
|
-
return { userId: parsed.userId, characterId: parsed.characterId };
|
|
49
|
+
const token = parseOAuthToken(value);
|
|
50
|
+
await this.stateStore.write({ version: 2, clientId, ...token });
|
|
51
|
+
return { clientId };
|
|
61
52
|
}
|
|
62
53
|
async logout() {
|
|
63
54
|
const state = await this.stateStore.read();
|
|
64
|
-
if (!state.
|
|
55
|
+
if (!state.accessToken)
|
|
65
56
|
return;
|
|
66
57
|
try {
|
|
67
|
-
await this.
|
|
58
|
+
await this.oauthRequest('/oauth/revoke', { token: state.refreshToken ?? state.accessToken, client_id: state.clientId });
|
|
68
59
|
}
|
|
69
60
|
finally {
|
|
70
61
|
await this.stateStore.clearSession();
|
|
@@ -274,7 +265,7 @@ export class ApiXClient {
|
|
|
274
265
|
throw new ApiXError('Wiki search text is required', 'wiki_query_required', false);
|
|
275
266
|
const query = paginationQuery(input);
|
|
276
267
|
query.set('query', input.query);
|
|
277
|
-
return this.request('/wiki/search', { query, runId, toolName: '
|
|
268
|
+
return this.request('/wiki/search', { query, runId, toolName: 'wiki_entry_search' });
|
|
278
269
|
}
|
|
279
270
|
async getWiki(entryId, runId) {
|
|
280
271
|
return this.request(`/wiki/entries/${encodeWikiPath(entryId)}`, { runId, toolName: 'wiki_get' });
|
|
@@ -441,28 +432,12 @@ export class ApiXClient {
|
|
|
441
432
|
toolName,
|
|
442
433
|
});
|
|
443
434
|
}
|
|
444
|
-
async registerDevice() {
|
|
445
|
-
const data = await this.request('/account/devices', {
|
|
446
|
-
method: 'POST',
|
|
447
|
-
includeDevice: false,
|
|
448
|
-
retryInvalidDevice: false,
|
|
449
|
-
});
|
|
450
|
-
const deviceId = typeof data === 'object' && data !== null && 'deviceId' in data ? data.deviceId : undefined;
|
|
451
|
-
if (typeof deviceId !== 'string' || deviceId.length === 0) {
|
|
452
|
-
throw new ApiXError('Kloudy device registration returned an invalid response', 'device_response_invalid', false);
|
|
453
|
-
}
|
|
454
|
-
await this.stateStore.update((state) => ({ ...state, deviceId }));
|
|
455
|
-
return deviceId;
|
|
456
|
-
}
|
|
457
435
|
async request(path, options = {}) {
|
|
458
436
|
return (await this.requestWithHeaders(path, options)).data;
|
|
459
437
|
}
|
|
460
438
|
async requestWithHeaders(path, options = {}) {
|
|
461
|
-
const
|
|
462
|
-
|
|
463
|
-
await this.ensureDevice();
|
|
464
|
-
const state = await this.stateStore.read();
|
|
465
|
-
const url = new URL(`${this.config.apiXBaseUrl.pathname}${path}`, this.config.apiXBaseUrl.origin);
|
|
439
|
+
const state = await this.ensureAccessToken();
|
|
440
|
+
const url = new URL(`${this.config.apiXBaseUrl.pathname.replace(/\/+$/, '')}${path}`, this.config.apiXBaseUrl.origin);
|
|
466
441
|
if (options.query)
|
|
467
442
|
url.search = options.query.toString();
|
|
468
443
|
const headers = new Headers({
|
|
@@ -475,12 +450,9 @@ export class ApiXClient {
|
|
|
475
450
|
headers.set('X-Agent-Tool', options.toolName);
|
|
476
451
|
headers.set('X-Agent-Tool-Call-ID', randomUUID());
|
|
477
452
|
}
|
|
478
|
-
if (
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
headers.set('K-Character-ID', state.characterId);
|
|
482
|
-
if (options.includeSession !== false && state.sessionToken)
|
|
483
|
-
headers.set('Cookie', `k_token_id=${state.sessionToken}`);
|
|
453
|
+
if (!state.accessToken)
|
|
454
|
+
throw new ApiXError('Kloudy OAuth login is required', 'oauth_login_required', false);
|
|
455
|
+
headers.set('Authorization', `Bearer ${state.accessToken}`);
|
|
484
456
|
if (options.body !== undefined)
|
|
485
457
|
headers.set('Content-Type', 'application/json');
|
|
486
458
|
const controller = new AbortController();
|
|
@@ -507,21 +479,8 @@ export class ApiXClient {
|
|
|
507
479
|
}
|
|
508
480
|
const envelope = await parseEnvelope(response);
|
|
509
481
|
if (!response.ok || envelope.success === false) {
|
|
510
|
-
if (
|
|
511
|
-
|
|
512
|
-
throw mapApiError(response.status, envelope);
|
|
513
|
-
await this.stateStore.clearDevice();
|
|
514
|
-
await this.ensureDevice();
|
|
515
|
-
return this.requestWithHeaders(path, { ...options, retryInvalidDevice: false });
|
|
516
|
-
}
|
|
517
|
-
if (envelope.code === 'need_user_token' &&
|
|
518
|
-
options.includeSession !== false &&
|
|
519
|
-
Boolean(state.sessionToken)) {
|
|
520
|
-
// 上游已经明确拒绝当前 User Token。清理账号会话以允许重新授权,
|
|
521
|
-
// 但保留匿名设备,使公开查询仍可继续使用。
|
|
522
|
-
if (this.stateStore.scope === 'local')
|
|
523
|
-
await this.stateStore.clearSession();
|
|
524
|
-
}
|
|
482
|
+
if (response.status === 401 && this.stateStore.scope === 'local')
|
|
483
|
+
await this.stateStore.clearSession();
|
|
525
484
|
throw mapApiError(response.status, envelope);
|
|
526
485
|
}
|
|
527
486
|
if (envelope.success !== true || !('data' in envelope)) {
|
|
@@ -529,6 +488,39 @@ export class ApiXClient {
|
|
|
529
488
|
}
|
|
530
489
|
return { data: envelope.data, headers: response.headers };
|
|
531
490
|
}
|
|
491
|
+
async ensureAccessToken() {
|
|
492
|
+
const state = await this.stateStore.read();
|
|
493
|
+
if (state.accessToken && (!state.expiresAt || state.expiresAt > Math.floor(Date.now() / 1000) + 30))
|
|
494
|
+
return state;
|
|
495
|
+
if (this.stateStore.scope === 'request' || !state.refreshToken || !state.clientId)
|
|
496
|
+
return state;
|
|
497
|
+
const value = await this.oauthRequest('/oauth/token', {
|
|
498
|
+
grant_type: 'refresh_token', client_id: state.clientId, refresh_token: state.refreshToken,
|
|
499
|
+
resource: this.config.mcpResourceUrl.toString(), scope: 'mcp:tools',
|
|
500
|
+
});
|
|
501
|
+
const token = parseOAuthToken(value);
|
|
502
|
+
const next = { version: 2, clientId: state.clientId, ...token };
|
|
503
|
+
await this.stateStore.write(next);
|
|
504
|
+
return next;
|
|
505
|
+
}
|
|
506
|
+
async oauthRequest(path, body) {
|
|
507
|
+
const response = await this.fetchImpl(new URL(`${this.config.apiXBaseUrl.pathname.replace(/\/+$/, '')}${path}`, this.config.apiXBaseUrl.origin), {
|
|
508
|
+
method: 'POST', headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(body),
|
|
509
|
+
signal: AbortSignal.timeout(this.config.requestTimeoutMs),
|
|
510
|
+
});
|
|
511
|
+
if (path === '/oauth/revoke' && response.ok)
|
|
512
|
+
return {};
|
|
513
|
+
let value;
|
|
514
|
+
try {
|
|
515
|
+
value = await response.json();
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
value = undefined;
|
|
519
|
+
}
|
|
520
|
+
if (!response.ok)
|
|
521
|
+
throw new ApiXError('Kloudy OAuth request was rejected', 'oauth_request_rejected', response.status >= 500);
|
|
522
|
+
return value;
|
|
523
|
+
}
|
|
532
524
|
}
|
|
533
525
|
function encodeWikiPath(entryId) {
|
|
534
526
|
return encodePathSegments(entryId);
|
|
@@ -609,19 +601,14 @@ function mapApiError(status, envelope) {
|
|
|
609
601
|
return new ApiXError('Kloudy archive item was not found', upstreamCode, false);
|
|
610
602
|
return new ApiXError('Kloudy API rejected the request', upstreamCode ?? 'api_request_rejected', false);
|
|
611
603
|
}
|
|
612
|
-
function
|
|
613
|
-
if (!isRecord(value) || typeof value.
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
typeof
|
|
620
|
-
value.character.characterType !== 'agent' ||
|
|
621
|
-
value.tokenId.length === 0) {
|
|
622
|
-
throw new ApiXError('Kloudy authorization did not return an Agent Character', 'login_response_invalid', false);
|
|
623
|
-
}
|
|
624
|
-
return { tokenId: value.tokenId, userId, characterId };
|
|
604
|
+
function parseOAuthToken(value) {
|
|
605
|
+
if (!isRecord(value) || typeof value.access_token !== 'string' || typeof value.refresh_token !== 'string' ||
|
|
606
|
+
typeof value.expires_in !== 'number') {
|
|
607
|
+
throw new ApiXError('Kloudy OAuth token response was invalid', 'oauth_token_invalid', false);
|
|
608
|
+
}
|
|
609
|
+
return { accessToken: value.access_token, refreshToken: value.refresh_token,
|
|
610
|
+
expiresAt: Math.floor(Date.now() / 1000) + value.expires_in,
|
|
611
|
+
scopes: typeof value.scope === 'string' ? value.scope.split(' ') : ['mcp:tools'] };
|
|
625
612
|
}
|
|
626
613
|
function isRecord(value) {
|
|
627
614
|
return typeof value === 'object' && value !== null;
|