From 3233e1fe93326710212ae0e62aa2a12d2dcb4749 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=82=B3=E6=98=B1?= Date: Mon, 20 Jul 2026 15:36:32 +0800 Subject: [PATCH 1/4] feat(mcp): add URL resolution command --- CHANGELOG.md | 4 + internal/app/mcp_url_command.go | 97 ++++++++++++++++++++ internal/app/mcp_url_command_test.go | 127 +++++++++++++++++++++++++++ internal/app/root.go | 1 + pkg/edition/default.go | 18 +++- pkg/edition/edition_test.go | 20 +++++ 6 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 internal/app/mcp_url_command.go create mode 100644 internal/app/mcp_url_command_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index d8773eda..599bc8fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is inspired by [Keep a Changelog](https://keepachangelog.com/) and th ## [Unreleased] +### Added + +- **MCP URL resolution** — adds `dws mcp url get ` for resolving a DingTalk MCP Market ID to the current user and organization scoped Streamable HTTP URL, while keeping the helper-only `mcp-meta` endpoint out of the public product command surface. + ### Fixed - **Message-read shortcut projection** (#706) — the message-list shortcuts (`chat +chat-messages` / `+messages-list` / `+messages-list-direct` / `+at-me` / `+search-msg` / `+thread-replies`) now render card and out-of-office rich-content JSON as readable text (without ever rewriting ordinary text that merely embeds a JSON fragment), expand a forwarded chat record's nested `forwardMessages` instead of collapsing to a "[卡片]" summary, and mark undecryptable encrypted card messages as `[加密消息]`; the speaker is read from the bare `sender` key, nested `{name:…}` sender objects yield their display name, and the literal string `"null"` is treated as absent. Shared projection helpers now live in `internal/shortcut/chatmsg`. `chat message download-media` also gains `--msg-id` / `--open-message-id` aliases for its `--message-id` flag so agents copying the `openMessageId`/`msgId` output field no longer hit "unknown flag". diff --git a/internal/app/mcp_url_command.go b/internal/app/mcp_url_command.go new file mode 100644 index 00000000..e0e38c84 --- /dev/null +++ b/internal/app/mcp_url_command.go @@ -0,0 +1,97 @@ +// Copyright 2026 Alibaba Group +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package app + +import ( + "encoding/json" + "fmt" + "strings" + + apperrors "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/errors" + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/output" + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/pkg/edition" + "github.com/spf13/cobra" +) + +const ( + mcpMetaServerID = "mcp-meta" + mcpMetaURLTool = "get_mcp_server_url" +) + +func newMCPURLGroup(caller edition.ToolCaller) *cobra.Command { + group := &cobra.Command{ + Use: "url", + Short: "管理 MCP 服务连接地址", + Args: cobra.NoArgs, + DisableAutoGenTag: true, + RunE: func(cmd *cobra.Command, _ []string) error { + return cmd.Help() + }, + } + group.AddCommand(newMCPURLGetCommand(caller)) + return group +} + +func newMCPURLGetCommand(caller edition.ToolCaller) *cobra.Command { + return &cobra.Command{ + Use: "get ", + Short: "按 mcpId 获取 MCP 的 Streamable HTTP 服务地址", + Long: "输入 MCP 市场 mcpId,返回以当前用户和组织身份访问该 MCP 的 " + + "Streamable HTTP 服务地址。\n\n" + + "安全提示:返回的 mcpURL 和 mcpJSON 可能包含身份凭据,仅限个人使用," + + "请勿分享到群聊、文档、邮件、代码仓库或日志。", + Example: " dws mcp url get 2480\n" + + " dws mcp url get 2480 --format json", + Args: cobra.ExactArgs(1), + DisableAutoGenTag: true, + RunE: func(cmd *cobra.Command, args []string) error { + if caller == nil { + return fmt.Errorf("MCP tool caller is not configured") + } + mcpID := strings.TrimSpace(args[0]) + if mcpID == "" { + return fmt.Errorf("mcpId 不能为空") + } + + result, err := caller.CallTool(cmd.Context(), mcpMetaServerID, mcpMetaURLTool, map[string]any{ + "mcpId": mcpID, + }) + if err != nil { + return fmt.Errorf("获取 MCP 服务地址: %w", err) + } + return writeMCPURLResult(cmd, result) + }, + } +} + +func writeMCPURLResult(cmd *cobra.Command, result *edition.ToolResult) error { + if result == nil { + return fmt.Errorf("MCP 元服务返回空结果") + } + for _, block := range result.Content { + if block.Type != "text" || strings.TrimSpace(block.Text) == "" { + continue + } + if err := apperrors.ClassifyMCPResponseText(block.Text); err != nil { + return err + } + + var payload any + if err := json.Unmarshal([]byte(block.Text), &payload); err != nil { + return fmt.Errorf("MCP 元服务返回了无效 JSON: %w", err) + } + return output.WriteCommandPayload(cmd, payload, output.FormatJSON) + } + return fmt.Errorf("MCP 元服务返回空结果") +} diff --git a/internal/app/mcp_url_command_test.go b/internal/app/mcp_url_command_test.go new file mode 100644 index 00000000..2fb9bc55 --- /dev/null +++ b/internal/app/mcp_url_command_test.go @@ -0,0 +1,127 @@ +// Copyright 2026 Alibaba Group +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package app + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "strings" + "testing" + + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/pkg/edition" + "github.com/spf13/cobra" +) + +type mcpURLTestCaller struct { + productID string + toolName string + args map[string]any + result *edition.ToolResult + err error +} + +func (c *mcpURLTestCaller) CallTool(_ context.Context, productID, toolName string, args map[string]any) (*edition.ToolResult, error) { + c.productID = productID + c.toolName = toolName + c.args = args + return c.result, c.err +} + +func (*mcpURLTestCaller) Format() string { return "json" } +func (*mcpURLTestCaller) DryRun() bool { return false } +func (*mcpURLTestCaller) Fields() string { return "" } +func (*mcpURLTestCaller) JQ() string { return "" } + +func executeMCPURLCommand(t *testing.T, caller edition.ToolCaller, args ...string) (string, error) { + t.Helper() + root := &cobra.Command{Use: "mcp", SilenceErrors: true, SilenceUsage: true} + root.AddCommand(newMCPURLGroup(caller)) + var out bytes.Buffer + root.SetOut(&out) + root.SetErr(&out) + root.SetArgs(args) + err := root.ExecuteContext(t.Context()) + return out.String(), err +} + +func TestMCPURLGetCallsMetaServerAndPreservesResponse(t *testing.T) { + const response = `{"result":{"mcpURL":"https://example.test/mcp?key=one&token=two","mcpJSON":{"transport":"streamable-http"},"name":"Example"}}` + caller := &mcpURLTestCaller{ + result: &edition.ToolResult{Content: []edition.ContentBlock{{Type: "text", Text: response}}}, + } + + out, err := executeMCPURLCommand(t, caller, "url", "get", " 10043 ") + if err != nil { + t.Fatalf("execute mcp url get: %v", err) + } + if caller.productID != mcpMetaServerID { + t.Fatalf("productID = %q, want %q", caller.productID, mcpMetaServerID) + } + if caller.toolName != mcpMetaURLTool { + t.Fatalf("toolName = %q, want %q", caller.toolName, mcpMetaURLTool) + } + if got := caller.args["mcpId"]; got != "10043" { + t.Fatalf("mcpId = %#v, want %q", got, "10043") + } + + var payload map[string]any + if err := json.Unmarshal([]byte(out), &payload); err != nil { + t.Fatalf("output is not JSON: %v\n%s", err, out) + } + result, ok := payload["result"].(map[string]any) + if !ok { + t.Fatalf("output result = %#v", payload["result"]) + } + if got := result["mcpURL"]; got != "https://example.test/mcp?key=one&token=two" { + t.Fatalf("result.mcpURL = %#v", got) + } +} + +func TestMCPURLGetRejectsBlankID(t *testing.T) { + _, err := executeMCPURLCommand(t, &mcpURLTestCaller{}, "url", "get", " ") + if err == nil || !strings.Contains(err.Error(), "mcpId 不能为空") { + t.Fatalf("error = %v, want blank mcpId error", err) + } +} + +func TestMCPURLGetPropagatesCallErrorWithoutSensitiveResponse(t *testing.T) { + caller := &mcpURLTestCaller{err: errors.New("permission denied")} + _, err := executeMCPURLCommand(t, caller, "url", "get", "10043") + if err == nil || !strings.Contains(err.Error(), "permission denied") { + t.Fatalf("error = %v, want call error", err) + } +} + +func TestMCPURLGetRejectsInvalidJSON(t *testing.T) { + caller := &mcpURLTestCaller{ + result: &edition.ToolResult{Content: []edition.ContentBlock{{Type: "text", Text: "not-json"}}}, + } + _, err := executeMCPURLCommand(t, caller, "url", "get", "10043") + if err == nil || !strings.Contains(err.Error(), "无效 JSON") { + t.Fatalf("error = %v, want invalid JSON error", err) + } +} + +func TestRootRegistersMCPURLGet(t *testing.T) { + root := NewRootCommand(t.Context()) + cmd, _, err := root.Find([]string{"mcp", "url", "get"}) + if err != nil { + t.Fatalf("find mcp url get: %v", err) + } + if got := cmd.CommandPath(); got != "dws mcp url get" { + t.Fatalf("command path = %q, want %q", got, "dws mcp url get") + } +} diff --git a/internal/app/root.go b/internal/app/root.go index 2d9db090..7a087cf9 100644 --- a/internal/app/root.go +++ b/internal/app/root.go @@ -390,6 +390,7 @@ func newRootCommandWithEngine(rootCtx context.Context, engine *pipeline.Engine, // usage log (privacy-preserving; see internal/shortcut/usage). Powers // `dws shortcut stats` and future high-frequency shortcut distillation. patCaller := newRecordingToolCaller(newToolCallerAdapter(runner, flags)) + mcpCmd.AddCommand(newMCPURLGroup(patCaller)) utilityCommands := []*cobra.Command{ newAuthCommand(patCaller), diff --git a/pkg/edition/default.go b/pkg/edition/default.go index a6084374..47588ca6 100644 --- a/pkg/edition/default.go +++ b/pkg/edition/default.go @@ -39,8 +39,22 @@ func defaultHooks() *Hooks { base["claw-type"] = DefaultOSSClawType return base }, - StaticServers: openStaticServers, - VisibleProducts: openVisibleProducts, + StaticServers: openStaticServers, + SupplementServers: openSupplementServers, + VisibleProducts: openVisibleProducts, + } +} + +// openSupplementServers returns helper-only MCP endpoints owned by the open +// CLI. They are callable by explicit server ID but are deliberately excluded +// from VisibleProducts, so no top-level product command is generated. +func openSupplementServers() []ServerInfo { + return []ServerInfo{ + { + ID: "mcp-meta", + Name: "MCP 元服务", + Endpoint: "https://mcp-gw.dingtalk.com/server/89833ea5debf30c260a07ffcb5127ffa3bf0c830cd76babadb293d9861485d44", + }, } } diff --git a/pkg/edition/edition_test.go b/pkg/edition/edition_test.go index 6b5faffa..2412b20b 100644 --- a/pkg/edition/edition_test.go +++ b/pkg/edition/edition_test.go @@ -70,4 +70,24 @@ func TestOpenVisibleProductsExcludesCompatibilityOnlyCommands(t *testing.T) { t.Fatal("conference must remain compatibility-only and not be added to StaticServers") } } + if byID["mcp-meta"] { + t.Fatal("mcp-meta is helper-only and must not appear in VisibleProducts") + } +} + +func TestOpenSupplementServersIncludesMCPMeta(t *testing.T) { + servers := openSupplementServers() + for _, server := range servers { + if server.ID != "mcp-meta" { + continue + } + if server.Endpoint == "" { + t.Fatal("mcp-meta has empty endpoint") + } + if len(server.Prefixes) != 0 { + t.Fatal("mcp-meta must remain helper-only without command prefixes") + } + return + } + t.Fatal("openSupplementServers() missing mcp-meta") } From 9fc63b640504e2831e5d42d3aa57063705eb6d0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=82=B3=E6=98=B1?= Date: Tue, 21 Jul 2026 22:44:04 +0800 Subject: [PATCH 2/4] fix(mcp): expose URL command in schema --- internal/app/mcp_url_command.go | 13 +- internal/app/mcp_url_command_test.go | 9 +- internal/app/root.go | 6 +- internal/cli/schema_agent_metadata/index.json | 91 +++- internal/cli/schema_agent_metadata/mcp.json | 267 ++++++++++ internal/cli/schema_agent_metadata_audit.json | 31 +- internal/cli/schema_catalog.json | 458 +++++++++++++++++- internal/cli/schema_command_registry.json | 9 + internal/cli/schema_hints/index.json | 2 + internal/cli/schema_hints/metadata/mcp.json | 24 + .../runtime-surface-completeness.json | 2 +- internal/cli/schema_hints/selection/mcp.json | 51 ++ pkg/edition/default.go | 4 +- test/cli/root_command_test.go | 5 +- 14 files changed, 928 insertions(+), 44 deletions(-) create mode 100644 internal/cli/schema_agent_metadata/mcp.json create mode 100644 internal/cli/schema_hints/metadata/mcp.json create mode 100644 internal/cli/schema_hints/selection/mcp.json diff --git a/internal/app/mcp_url_command.go b/internal/app/mcp_url_command.go index e0e38c84..00333f96 100644 --- a/internal/app/mcp_url_command.go +++ b/internal/app/mcp_url_command.go @@ -18,6 +18,7 @@ import ( "fmt" "strings" + "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/cli" apperrors "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/errors" "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/output" "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/pkg/edition" @@ -44,7 +45,7 @@ func newMCPURLGroup(caller edition.ToolCaller) *cobra.Command { } func newMCPURLGetCommand(caller edition.ToolCaller) *cobra.Command { - return &cobra.Command{ + cmd := &cobra.Command{ Use: "get ", Short: "按 mcpId 获取 MCP 的 Streamable HTTP 服务地址", Long: "输入 MCP 市场 mcpId,返回以当前用户和组织身份访问该 MCP 的 " + @@ -73,12 +74,22 @@ func newMCPURLGetCommand(caller edition.ToolCaller) *cobra.Command { return writeMCPURLResult(cmd, result) }, } + cli.AnnotateRuntimePositionals(cmd, cli.RuntimeSchemaPositional{ + Name: "mcp_id", + Type: "string", + Description: "钉钉 MCP 市场中的 mcpId", + Required: true, + Index: 0, + }) + return cmd } func writeMCPURLResult(cmd *cobra.Command, result *edition.ToolResult) error { if result == nil { return fmt.Errorf("MCP 元服务返回空结果") } + // get_mcp_server_url returns one JSON document in its first non-empty text + // block. Other block types and trailing blocks are intentionally ignored. for _, block := range result.Content { if block.Type != "text" || strings.TrimSpace(block.Text) == "" { continue diff --git a/internal/app/mcp_url_command_test.go b/internal/app/mcp_url_command_test.go index 2fb9bc55..ad91c264 100644 --- a/internal/app/mcp_url_command_test.go +++ b/internal/app/mcp_url_command_test.go @@ -97,7 +97,7 @@ func TestMCPURLGetRejectsBlankID(t *testing.T) { } } -func TestMCPURLGetPropagatesCallErrorWithoutSensitiveResponse(t *testing.T) { +func TestMCPURLGetPropagatesCallError(t *testing.T) { caller := &mcpURLTestCaller{err: errors.New("permission denied")} _, err := executeMCPURLCommand(t, caller, "url", "get", "10043") if err == nil || !strings.Contains(err.Error(), "permission denied") { @@ -117,6 +117,13 @@ func TestMCPURLGetRejectsInvalidJSON(t *testing.T) { func TestRootRegistersMCPURLGet(t *testing.T) { root := NewRootCommand(t.Context()) + mcp, _, err := root.Find([]string{"mcp"}) + if err != nil { + t.Fatalf("find mcp: %v", err) + } + if mcp.Hidden { + t.Fatal("mcp command must be public when it contains reviewed public helpers") + } cmd, _, err := root.Find([]string{"mcp", "url", "get"}) if err != nil { t.Fatalf("find mcp url get: %v", err) diff --git a/internal/app/root.go b/internal/app/root.go index 7a087cf9..a51a24f5 100644 --- a/internal/app/root.go +++ b/internal/app/root.go @@ -385,7 +385,11 @@ func newRootCommandWithEngine(rootCtx context.Context, engine *pipeline.Engine, schemaCmd := newSchemaCommand(loader) mcpCmd := newMCPCommand(rootCtx, loader, runner, engine) - mcpCmd.Hidden = true + // The legacy dynamic MCP surface remains disabled, but reviewed static MCP + // helpers registered below are part of the public CLI and Schema surface. + mcpCmd.Hidden = false + mcpCmd.Short = "管理 MCP 服务连接信息" + mcpCmd.Long = "管理经过审核并纳入 Schema 的 MCP 服务连接辅助能力。" // Wrap the caller so every MCP tool call's shape is recorded to the local // usage log (privacy-preserving; see internal/shortcut/usage). Powers // `dws shortcut stats` and future high-frequency shortcut distillation. diff --git a/internal/cli/schema_agent_metadata/index.json b/internal/cli/schema_agent_metadata/index.json index d231e458..beaade77 100644 --- a/internal/cli/schema_agent_metadata/index.json +++ b/internal/cli/schema_agent_metadata/index.json @@ -1,17 +1,17 @@ { "version": 1, - "source_hash": "sha256:5df496973c41b3b4f7ae8c856ff0e9e99bcabd4455419b7d41bb23c44df6f1af", - "surface_hash": "sha256:7ef588f38052f0104e027c8daff5fefd68698781f2c87715461183d4058288ed", + "source_hash": "sha256:2b21f87e564139596d34db2f70443d81b41e16d9212eb60ec6e5a6b4b8d41ec7", + "surface_hash": "sha256:e85148774f65d34b01d50ebdc702b785afdb8ea78663b6f2eeecc35bc3cb3fd5", "coverage": { - "surface_products": 22, - "products_with_metadata": 22, - "surface_tools": 572, - "tools_with_metadata": 572, - "tools_with_agent_summary": 572, - "tools_with_use_when": 572, - "tools_with_avoid_when": 572, - "tools_with_examples": 572, - "tools_with_interface_mode": 572, + "surface_products": 23, + "products_with_metadata": 23, + "surface_tools": 573, + "tools_with_metadata": 573, + "tools_with_agent_summary": 573, + "tools_with_use_when": 573, + "tools_with_avoid_when": 573, + "tools_with_examples": 573, + "tools_with_interface_mode": 573, "unmatched_skill_tools": 120, "unreviewed_skill_tools": 7 }, @@ -1089,6 +1089,74 @@ "查收、搜索、阅读、回复、发送或整理邮件" ] }, + "mcp": { + "agent_summary": "解析和管理当前身份可用的 MCP 服务连接信息", + "agent_summary_source": "dws-agent-selection/mcp", + "avoid_when": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ], + "field_provenance": { + "agent_summary": { + "value": "解析和管理当前身份可用的 MCP 服务连接信息", + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "candidates": [ + { + "value": "解析和管理当前身份可用的 MCP 服务连接信息", + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true + } + ] + }, + "avoid_when": { + "value": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "candidates": [ + { + "value": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true + } + ] + }, + "use_when": { + "value": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "candidates": [ + { + "value": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true + } + ] + } + }, + "source_refs": [ + "CommandRegistry:product=mcp", + "cobra-help:dws mcp --help", + "internal/cli/schema_command_registry.json#mcp", + "internal/cli/schema_hints/selection/mcp.json" + ], + "use_when": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ] + }, "minutes": { "agent_summary": "查询和维护钉钉听记的转写、摘要、待办、权限、录音、标签、说话人总结及文件上传会话。", "agent_summary_source": "dws-agent-selection/minutes", @@ -1605,6 +1673,7 @@ "event", "live", "mail", + "mcp", "minutes", "oa", "pat", diff --git a/internal/cli/schema_agent_metadata/mcp.json b/internal/cli/schema_agent_metadata/mcp.json new file mode 100644 index 00000000..e506fd28 --- /dev/null +++ b/internal/cli/schema_agent_metadata/mcp.json @@ -0,0 +1,267 @@ +{ + "product_id": "mcp", + "tools": { + "mcp url get": { + "agent_summary": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址", + "agent_summary_source": "dws-agent-selection/mcp", + "availability": "available", + "avoid_when": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ], + "confirmation": "not_required", + "effect": "read", + "effect_source": "agent-hint", + "examples": [ + "dws mcp url get 10043 --format json" + ], + "field_provenance": { + "agent_summary": { + "value": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址", + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "candidates": [ + { + "value": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址", + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。" + } + ] + }, + "availability": { + "value": "available", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "available", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "avoid_when": { + "value": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "candidates": [ + { + "value": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。" + } + ] + }, + "confirmation": { + "value": "not_required", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "not_required", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "effect": { + "value": "read", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "read", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "examples": { + "value": [ + "dws mcp url get 10043 --format json" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "candidates": [ + { + "value": [ + "dws mcp url get 10043 --format json" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。" + } + ] + }, + "idempotency": { + "value": "idempotent", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "idempotent", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "interface_mode": { + "value": "composite", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "composite", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "interface_reason": { + "value": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "interface_ref": { + "value": null, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "interface_disposition_matrix", + "review_reason": "final interface mode composite forbids a direct MCP interface_ref", + "candidates": [ + { + "value": null, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "final interface mode composite forbids a direct MCP interface_ref" + } + ] + }, + "reviewed": { + "value": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + }, + { + "value": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": false, + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。" + } + ] + }, + "risk": { + "value": "medium", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "candidates": [ + { + "value": "medium", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + ] + }, + "use_when": { + "value": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "candidates": [ + { + "value": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ], + "source": "internal/cli/schema_hints/selection/mcp.json", + "precedence": "reviewed_explicit", + "selected": true, + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。" + } + ] + } + }, + "idempotency": "idempotent", + "interface_mode": "composite", + "interface_reason": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata.", + "reviewed": true, + "risk": "medium", + "source_refs": [ + "cobra-help:dws mcp url get --help", + "internal/app/mcp_url_command.go", + "internal/cli/schema_command_registry.json#mcp.url_get", + "internal/cli/schema_hints/metadata/mcp.json", + "internal/cli/schema_hints/selection/mcp.json", + "pkg/edition/default.go#openSupplementServers" + ], + "use_when": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ] + } + } +} diff --git a/internal/cli/schema_agent_metadata_audit.json b/internal/cli/schema_agent_metadata_audit.json index a4367aef..d31a6e92 100644 --- a/internal/cli/schema_agent_metadata_audit.json +++ b/internal/cli/schema_agent_metadata_audit.json @@ -1,11 +1,11 @@ { "version": 1, - "source_hash": "sha256:5df496973c41b3b4f7ae8c856ff0e9e99bcabd4455419b7d41bb23c44df6f1af", - "surface_hash": "sha256:7ef588f38052f0104e027c8daff5fefd68698781f2c87715461183d4058288ed", - "source_files": 150, - "hint_files": 46, - "hint_products": 39, - "hint_tools": 1296, + "source_hash": "sha256:2b21f87e564139596d34db2f70443d81b41e16d9212eb60ec6e5a6b4b8d41ec7", + "surface_hash": "sha256:e85148774f65d34b01d50ebdc702b785afdb8ea78663b6f2eeecc35bc3cb3fd5", + "source_files": 152, + "hint_files": 48, + "hint_products": 40, + "hint_tools": 1298, "interface_metadata": { "source": "mcp-tools-list+cli-registry", "revision": "4574f7022c32cf4c033e9b7b4156e2fec815fed8", @@ -27,15 +27,15 @@ ] }, "coverage": { - "surface_products": 22, - "products_with_metadata": 22, - "surface_tools": 572, - "tools_with_metadata": 572, - "tools_with_agent_summary": 572, - "tools_with_use_when": 572, - "tools_with_avoid_when": 572, - "tools_with_examples": 572, - "tools_with_interface_mode": 572, + "surface_products": 23, + "products_with_metadata": 23, + "surface_tools": 573, + "tools_with_metadata": 573, + "tools_with_agent_summary": 573, + "tools_with_use_when": 573, + "tools_with_avoid_when": 573, + "tools_with_examples": 573, + "tools_with_interface_mode": 573, "unmatched_skill_tools": 120, "unreviewed_skill_tools": 7 }, @@ -60,6 +60,7 @@ "generate-topic-report", "live", "mail", + "mcp", "meeting-followup", "minutes", "oa", diff --git a/internal/cli/schema_catalog.json b/internal/cli/schema_catalog.json index 6ed5c588..9127ca77 100644 --- a/internal/cli/schema_catalog.json +++ b/internal/cli/schema_catalog.json @@ -1,21 +1,21 @@ { "version": 1, - "source_hash": "sha256:14398788381c822f208e8cae059d98cd60da6625023869c74015735650d67e6f", - "surface_hash": "sha256:7ef588f38052f0104e027c8daff5fefd68698781f2c87715461183d4058288ed", + "source_hash": "sha256:5152808e276aac1f7377e60efa864318d6ec2e5d0d9d464a1cf1cdee9a28a962", + "surface_hash": "sha256:e85148774f65d34b01d50ebdc702b785afdb8ea78663b6f2eeecc35bc3cb3fd5", "catalog": { "agent_metadata": { - "products_with_metadata": 22, + "products_with_metadata": 23, "source": "embedded-skill-metadata", - "source_hash": "sha256:5df496973c41b3b4f7ae8c856ff0e9e99bcabd4455419b7d41bb23c44df6f1af", - "surface_hash": "sha256:7ef588f38052f0104e027c8daff5fefd68698781f2c87715461183d4058288ed", - "surface_products": 22, - "surface_tools": 572, - "tools_with_agent_summary": 572, - "tools_with_metadata": 572, + "source_hash": "sha256:2b21f87e564139596d34db2f70443d81b41e16d9212eb60ec6e5a6b4b8d41ec7", + "surface_hash": "sha256:e85148774f65d34b01d50ebdc702b785afdb8ea78663b6f2eeecc35bc3cb3fd5", + "surface_products": 23, + "surface_tools": 573, + "tools_with_agent_summary": 573, + "tools_with_metadata": 573, "unmatched_skill_tools": 120, "version": 1 }, - "count": 22, + "count": 23, "interface_metadata": { "coverage": { "aliased_tools": 178, @@ -13476,6 +13476,110 @@ "查收、搜索、阅读、回复、发送或整理邮件" ] }, + { + "agent_metadata_source": "embedded-skill-metadata", + "agent_source_refs": [ + "CommandRegistry:product=mcp", + "cobra-help:dws mcp --help", + "internal/cli/schema_command_registry.json#mcp", + "internal/cli/schema_hints/selection/mcp.json" + ], + "agent_summary": "解析和管理当前身份可用的 MCP 服务连接信息", + "agent_summary_source": "dws-agent-selection/mcp", + "avoid_when": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ], + "description": "管理 MCP 服务连接信息", + "field_provenance": { + "agent_summary": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": "解析和管理当前身份可用的 MCP 服务连接信息" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": "解析和管理当前身份可用的 MCP 服务连接信息" + }, + "avoid_when": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ] + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ] + }, + "use_when": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ] + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ] + } + }, + "id": "mcp", + "name": "管理 MCP 服务连接信息", + "runtime": true, + "tool_count": 1, + "tools": [ + { + "agent_metadata_source": "embedded-skill-metadata", + "agent_summary": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址", + "agent_summary_source": "dws-agent-selection/mcp", + "availability": "available", + "avoid_when": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ], + "canonical_path": "mcp.url_get", + "cli_name": "get", + "cli_path": "mcp url get", + "confirmation": "not_required", + "description": "输入 MCP 市场 mcpId,返回以当前用户和组织身份访问该 MCP 的 Streamable HTTP 服务地址。\n\n安全提示:返回的 mcpURL 和 mcpJSON 可能包含身份凭据,仅限个人使用,请勿分享到群聊、文档、邮件、代码仓库或日志。", + "effect": "read", + "group": "url", + "idempotency": "idempotent", + "interface_mode": "composite", + "interface_reason": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata.", + "name": "url_get", + "primary_cli_path": "mcp url get", + "reviewed": true, + "risk": "medium", + "title": "按 mcpId 获取 MCP 的 Streamable HTTP 服务地址", + "use_when": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ] + } + ], + "use_when": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ] + }, { "agent_metadata_source": "embedded-skill-metadata", "agent_source_refs": [ @@ -19153,7 +19257,7 @@ } ], "source": "embedded-command-catalog", - "tool_count": 572 + "tool_count": 573 }, "tools": { "aisearch.enterprise_person_search": { @@ -319775,6 +319879,338 @@ "已知 templateId 并需要修改名称、主题、正文或收件人时" ] }, + "mcp.url_get": { + "agent_metadata_source": "embedded-skill-metadata", + "agent_source_refs": [ + "cobra-help:dws mcp url get --help", + "internal/app/mcp_url_command.go", + "internal/cli/schema_command_registry.json#mcp.url_get", + "internal/cli/schema_hints/metadata/mcp.json", + "internal/cli/schema_hints/selection/mcp.json", + "pkg/edition/default.go#openSupplementServers" + ], + "agent_summary": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址", + "agent_summary_source": "dws-agent-selection/mcp", + "availability": "available", + "avoid_when": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ], + "canonical_path": "mcp.url_get", + "cli_name": "get", + "cli_path": "mcp url get", + "confirmation": "not_required", + "description": "输入 MCP 市场 mcpId,返回以当前用户和组织身份访问该 MCP 的 Streamable HTTP 服务地址。\n\n安全提示:返回的 mcpURL 和 mcpJSON 可能包含身份凭据,仅限个人使用,请勿分享到群聊、文档、邮件、代码仓库或日志。", + "display": "管理 MCP 服务连接信息", + "effect": "read", + "effect_source": "agent-hint", + "examples": [ + "dws mcp url get 10043 --format json" + ], + "field_provenance": { + "agent_summary": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址" + }, + "availability": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "available" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "available" + }, + "avoid_when": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ] + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ] + }, + "canonical_path": { + "candidates": [ + { + "precedence": "command_registry", + "selected": true, + "source": "reviewed_command_registry", + "source_ref": "mcp url get", + "value": "mcp.url_get" + } + ], + "precedence": "command_registry", + "resolution": "registry_identity", + "source": "reviewed_command_registry", + "source_ref": "mcp url get", + "value": "mcp.url_get" + }, + "confirmation": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "not_required" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "not_required" + }, + "description": { + "candidates": [ + { + "precedence": "cobra_help", + "selected": true, + "source": "cobra_help", + "value": "输入 MCP 市场 mcpId,返回以当前用户和组织身份访问该 MCP 的 Streamable HTTP 服务地址。\n\n安全提示:返回的 mcpURL 和 mcpJSON 可能包含身份凭据,仅限个人使用,请勿分享到群聊、文档、邮件、代码仓库或日志。" + } + ], + "precedence": "cobra_help", + "resolution": "highest_precedence", + "source": "cobra_help", + "value": "输入 MCP 市场 mcpId,返回以当前用户和组织身份访问该 MCP 的 Streamable HTTP 服务地址。\n\n安全提示:返回的 mcpURL 和 mcpJSON 可能包含身份凭据,仅限个人使用,请勿分享到群聊、文档、邮件、代码仓库或日志。" + }, + "effect": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "read" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "read" + }, + "examples": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "dws mcp url get 10043 --format json" + ] + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "dws mcp url get 10043 --format json" + ] + }, + "idempotency": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "idempotent" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "idempotent" + }, + "interface_mode": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "composite" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "composite" + }, + "interface_reason": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata." + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata." + }, + "interface_ref": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "final interface mode composite forbids a direct MCP interface_ref", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": null + } + ], + "precedence": "reviewed_explicit", + "resolution": "interface_disposition_matrix", + "review_reason": "final interface mode composite forbids a direct MCP interface_ref", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": null + }, + "reviewed": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": true + }, + { + "precedence": "reviewed_explicit", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "selected": false, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": true + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": true + }, + "risk": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "selected": true, + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "medium" + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output.", + "source": "internal/cli/schema_hints/metadata/mcp.json", + "value": "medium" + }, + "title": { + "candidates": [ + { + "precedence": "cobra_help", + "selected": true, + "source": "cobra_help", + "value": "按 mcpId 获取 MCP 的 Streamable HTTP 服务地址" + } + ], + "precedence": "cobra_help", + "resolution": "highest_precedence", + "source": "cobra_help", + "value": "按 mcpId 获取 MCP 的 Streamable HTTP 服务地址" + }, + "use_when": { + "candidates": [ + { + "precedence": "reviewed_explicit", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "selected": true, + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ] + } + ], + "precedence": "reviewed_explicit", + "resolution": "highest_precedence", + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "source": "internal/cli/schema_hints/selection/mcp.json", + "value": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ] + } + }, + "group": "url", + "has_parameters": false, + "idempotency": "idempotent", + "interface_mode": "composite", + "interface_reason": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata.", + "is_alias": false, + "name": "url_get", + "parameter_count": 0, + "parameters": {}, + "path": "mcp.url_get", + "positionals": [ + { + "description": "钉钉 MCP 市场中的 mcpId", + "index": 0, + "name": "mcp_id", + "required": true, + "type": "string" + } + ], + "primary_cli_path": "mcp url get", + "product_id": "mcp", + "reviewed": true, + "risk": "medium", + "source": "reviewed_command_registry", + "title": "按 mcpId 获取 MCP 的 Streamable HTTP 服务地址", + "use_when": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ] + }, "minutes.add_member_permission": { "agent_metadata_source": "embedded-skill-metadata", "agent_source_refs": [ diff --git a/internal/cli/schema_command_registry.json b/internal/cli/schema_command_registry.json index 075707a2..960ba50e 100644 --- a/internal/cli/schema_command_registry.json +++ b/internal/cli/schema_command_registry.json @@ -1700,6 +1700,15 @@ } ] }, + { + "id": "mcp", + "tools": [ + { + "canonical_path": "mcp.url_get", + "cli_path": "mcp url get" + } + ] + }, { "id": "minutes", "tools": [ diff --git a/internal/cli/schema_hints/index.json b/internal/cli/schema_hints/index.json index 9b619661..88bd3aed 100644 --- a/internal/cli/schema_hints/index.json +++ b/internal/cli/schema_hints/index.json @@ -23,6 +23,7 @@ "event": "metadata/event.json", "live": "metadata/live.json", "mail": "metadata/mail.json", + "mcp": "metadata/mcp.json", "minutes": "metadata/minutes.json", "oa": "metadata/oa.json", "pat": "metadata/pat.json", @@ -47,6 +48,7 @@ "event": "selection/event.json", "live": "selection/live.json", "mail": "selection/mail.json", + "mcp": "selection/mcp.json", "minutes": "selection/minutes.json", "oa": "selection/oa.json", "pat": "selection/pat.json", diff --git a/internal/cli/schema_hints/metadata/mcp.json b/internal/cli/schema_hints/metadata/mcp.json new file mode 100644 index 00000000..9b8e39c2 --- /dev/null +++ b/internal/cli/schema_hints/metadata/mcp.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "source": { + "kind": "explicit", + "name": "dws-tool-metadata/mcp", + "repository": "DingTalk-Real-AI/dingtalk-workspace-cli", + "channel": "open-source", + "reviewed": true + }, + "tools": { + "mcp.url_get": { + "effect": "read", + "risk": "medium", + "confirmation": "not_required", + "idempotency": "idempotent", + "interface_mode": "composite", + "availability": "available", + "interface_reason": "Reviewed unpinned remote adapter: the public CLI wrapper calls the helper-only mcp-meta/get_mcp_server_url endpoint, which is intentionally absent from the public product catalog and pinned MCP metadata.", + "runtime_gate": "none", + "reviewed": true, + "review_reason": "Expose the reviewed MCP URL resolver through the public CLI and Agent Schema while preserving the helper endpoint as a non-product supplemental server. The returned URL contains user- and organization-scoped credentials and must be treated as sensitive output." + } + } +} diff --git a/internal/cli/schema_hints/runtime-surface-completeness.json b/internal/cli/schema_hints/runtime-surface-completeness.json index 11fed0ed..17227d9e 100644 --- a/internal/cli/schema_hints/runtime-surface-completeness.json +++ b/internal/cli/schema_hints/runtime-surface-completeness.json @@ -7,7 +7,7 @@ "channel": "open-source" }, "coverage": { - "source_tools": 572, + "source_tools": 573, "matched_tools": 71 }, "tools": { diff --git a/internal/cli/schema_hints/selection/mcp.json b/internal/cli/schema_hints/selection/mcp.json new file mode 100644 index 00000000..9f642132 --- /dev/null +++ b/internal/cli/schema_hints/selection/mcp.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "source": { + "kind": "explicit", + "name": "dws-agent-selection/mcp", + "repository": "DingTalk-Real-AI/dingtalk-workspace-cli", + "channel": "open-source", + "reviewed": true + }, + "tools": { + "mcp.url_get": { + "agent_summary": "按 MCP 市场 mcpId 获取当前用户和组织可用的 Streamable HTTP 地址", + "use_when": [ + "已知钉钉 MCP 市场 mcpId,需要获得当前身份可用的 Streamable HTTP 连接地址" + ], + "avoid_when": [ + "只是查询 DWS 已公开命令或参数时使用 dws schema", + "用户要求把返回的凭据 URL 发送到群聊、文档、邮件、日志或代码仓库时不要执行或传播" + ], + "examples": [ + "dws mcp url get 10043 --format json" + ], + "reviewed": true, + "review_reason": "正式公开 MCP URL 解析命令的 Agent 选型文案,并明确凭据 URL 只能返回给当前用户、不得二次传播。", + "source_refs": [ + "internal/cli/schema_command_registry.json#mcp.url_get", + "cobra-help:dws mcp url get --help", + "internal/app/mcp_url_command.go", + "pkg/edition/default.go#openSupplementServers" + ] + } + }, + "products": { + "mcp": { + "agent_summary": "解析和管理当前身份可用的 MCP 服务连接信息", + "use_when": [ + "需要把钉钉 MCP 市场中的服务连接到支持 Streamable HTTP 的 Agent 或客户端" + ], + "avoid_when": [ + "查询普通钉钉业务数据时使用对应产品命令,不要使用 mcp" + ], + "reviewed": true, + "review_reason": "为公开 mcp 命令提供产品级 Agent 路由,并强调连接信息属于敏感凭据。", + "source_refs": [ + "internal/cli/schema_command_registry.json#mcp", + "cobra-help:dws mcp --help", + "CommandRegistry:product=mcp" + ] + } + } +} diff --git a/pkg/edition/default.go b/pkg/edition/default.go index 47588ca6..b3d79f62 100644 --- a/pkg/edition/default.go +++ b/pkg/edition/default.go @@ -47,7 +47,9 @@ func defaultHooks() *Hooks { // openSupplementServers returns helper-only MCP endpoints owned by the open // CLI. They are callable by explicit server ID but are deliberately excluded -// from VisibleProducts, so no top-level product command is generated. +// from VisibleProducts, so no top-level product command is generated. They +// stay separate from syncdata.StaticServers because only explicitly wired CLI +// helpers may call them; they are not public MCP product surfaces. func openSupplementServers() []ServerInfo { return []ServerInfo{ { diff --git a/test/cli/root_command_test.go b/test/cli/root_command_test.go index fc2db003..b4c72857 100644 --- a/test/cli/root_command_test.go +++ b/test/cli/root_command_test.go @@ -13,7 +13,7 @@ import ( // MCP architecture, products are discovered dynamically from MCP servers, // and their availability depends on the test environment's fixture data. -func TestHiddenMCPHelpIsReachable(t *testing.T) { +func TestPublicMCPHelpShowsReviewedURLCommand(t *testing.T) { cmd := app.NewRootCommand() var out strings.Builder cmd.SetOut(&out) @@ -25,7 +25,8 @@ func TestHiddenMCPHelpIsReachable(t *testing.T) { } got := out.String() - if !strings.Contains(got, "canonical MCP command surface is disabled") { + if !strings.Contains(got, "管理经过审核并纳入 Schema 的 MCP 服务连接辅助能力") || + !strings.Contains(got, "url") { t.Fatalf("mcp help missing expected text:\n%s", got) } } From a7fdcea0862b4fe8ead01ecb5d081467105f22df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=82=B3=E6=98=B1?= Date: Thu, 23 Jul 2026 10:19:14 +0800 Subject: [PATCH 3/4] test(cli): update public interface baseline --- test/fixtures/cli-interface-baseline.txt | 74 +++++++++++++++++++----- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/test/fixtures/cli-interface-baseline.txt b/test/fixtures/cli-interface-baseline.txt index 169f440b..d788bb1f 100644 --- a/test/fixtures/cli-interface-baseline.txt +++ b/test/fixtures/cli-interface-baseline.txt @@ -1,7 +1,7 @@ [root] runnable: true hidden: false - commands: agoal, aisearch, aitable, api, attendance, audit, auth, calendar, chat, completion, config, contact, dev, devapp, devdoc, ding, doc, doctor, drive, event, help, live, mail, minutes, oa, pat, plugin, profile, recovery, report, schema, sheet, skill, todo, upgrade, version, wiki + commands: agoal, aisearch, aitable, api, attendance, audit, auth, calendar, chat, completion, config, contact, dev, devapp, devdoc, ding, doc, doctor, drive, event, help, live, mail, mcp, minutes, oa, pat, plugin, profile, recovery, report, schema, sheet, skill, todo, upgrade, version, wiki flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=persistent, --client-secret:string|required=false|hidden=false|no-opt=""|scope=persistent, --debug:bool|required=false|hidden=false|no-opt="true"|scope=persistent, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=persistent, --fields:string|required=false|hidden=false|no-opt=""|scope=persistent, -f/--format:string|required=false|hidden=false|no-opt=""|scope=persistent, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=persistent, --mock:bool|required=false|hidden=false|no-opt="true"|scope=persistent, -o/--output:string|required=false|hidden=true|no-opt=""|scope=persistent, --profile:string|required=false|hidden=false|no-opt=""|scope=persistent, --timeout:int|required=false|hidden=false|no-opt=""|scope=persistent, --token:string|required=false|hidden=true|no-opt=""|scope=persistent, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=persistent, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=persistent [agoal] @@ -1738,7 +1738,7 @@ [chat.+bot-find] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --cursor:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --limit:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --query:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --cursor:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --keyword:string|required=false|hidden=true|no-opt=""|scope=local, --limit:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --query:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+bot-search] runnable: true @@ -1748,7 +1748,7 @@ [chat.+broadcast] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --text:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --to:stringSlice|required=false|hidden=false|no-opt=""|scope=local, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --ai-tag:bool|required=false|hidden=false|no-opt="true"|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --text:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --to:stringSlice|required=false|hidden=false|no-opt=""|scope=local, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+category-create] runnable: true @@ -1833,7 +1833,7 @@ [chat.+chat-search] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --cursor:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --exclude-muted:bool|required=false|hidden=false|no-opt="true"|scope=local, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --limit:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --query:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --cursor:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --exclude-muted:bool|required=false|hidden=false|no-opt="true"|scope=local, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --keyword:string|required=false|hidden=true|no-opt=""|scope=local, --limit:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --query:string|required=false|hidden=false|no-opt=""|scope=local, --size:int|required=false|hidden=true|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+chat-set-admin] runnable: true @@ -1878,7 +1878,7 @@ [chat.+dm] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --text:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --to:string|required=false|hidden=false|no-opt=""|scope=local, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --ai-tag:bool|required=false|hidden=false|no-opt="true"|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --text:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --to:string|required=false|hidden=false|no-opt=""|scope=local, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+group-members] runnable: true @@ -1888,7 +1888,7 @@ [chat.+messages-list-direct] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, --forward:bool|required=false|hidden=false|no-opt="true"|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --limit:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --open-dingtalk-id:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --time:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --user:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, --forward:bool|required=false|hidden=false|no-opt="true"|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --limit:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --open-dingtalk-id:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --size:int|required=false|hidden=true|no-opt=""|scope=local, --time:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --user:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+messages-list-pin] runnable: true @@ -1913,7 +1913,7 @@ [chat.+messages-read-status] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --conversation-id:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --message-id:string|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --users:stringSlice|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --conversation-id:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, --group:string|required=false|hidden=true|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --id:string|required=false|hidden=true|no-opt=""|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --message-id:string|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --users:stringSlice|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+messages-send-by-webhook] runnable: true @@ -1933,7 +1933,7 @@ [chat.+send-to-group] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, --group:string|required=false|hidden=false|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --text:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --ai-tag:bool|required=false|hidden=false|no-opt="true"|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, --group:string|required=false|hidden=false|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --text:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.+unread-chats] runnable: true @@ -2317,7 +2317,7 @@ [chat.message.download-media] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --message-id:string|required=true|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --open-conversation-id:string|required=true|hidden=false|no-opt=""|scope=local, --output:string|required=true|hidden=false|no-opt=""|scope=local, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --resource-id:string|required=true|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --type:string|required=true|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --message-id:string|required=true|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --msg-id:string|required=false|hidden=true|no-opt=""|scope=local, --open-conversation-id:string|required=true|hidden=false|no-opt=""|scope=local, --open-message-id:string|required=false|hidden=true|no-opt=""|scope=local, --output:string|required=true|hidden=false|no-opt=""|scope=local, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --resource-id:string|required=true|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --type:string|required=true|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [chat.message.forward] runnable: true @@ -2539,7 +2539,7 @@ [contact] runnable: true hidden: false - commands: +by-mobile, +dept-members, +list-dept-members, +list-followings, +list-role-members, +list-roles, +list-sub-depts, +lookup, +me, +org, +resolve-dept, +search-mobile, +search-user, +team, dept, label, relation, user + commands: +by-mobile, +dept-members, +list-dept-members, +list-followings, +list-role-members, +list-roles, +list-sub-depts, +lookup, +me, +org, +resolve-dept, +search-mobile, +search-user, +team, account, dept, label, org, relation, user flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [contact.+by-mobile] @@ -2612,6 +2612,17 @@ hidden: false flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --name:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited +[contact.account] + runnable: true + hidden: false + commands: create + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + +[contact.account.create] + runnable: true + hidden: false + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dept-ids:string|required=false|hidden=false|no-opt=""|scope=local, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --email:string|required=false|hidden=false|no-opt=""|scope=local, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --login-id:string|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --org-user-mobile:string|required=false|hidden=false|no-opt=""|scope=local, --org-user-name:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --send-pwd-via-sms:bool|required=false|hidden=false|no-opt="true"|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + [contact.dept] runnable: true hidden: false @@ -2660,6 +2671,17 @@ hidden: false flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --id:string|required=false|hidden=false|no-opt=""|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --label-id:string|required=false|hidden=true|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --role-id:string|required=false|hidden=true|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited +[contact.org] + runnable: true + hidden: false + commands: create + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + +[contact.org.create] + runnable: true + hidden: false + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --creator-username:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --org-name:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + [contact.relation] runnable: true hidden: false @@ -2674,7 +2696,7 @@ [contact.user] runnable: true hidden: false - commands: dismission, get, get-self, profile, search, search-mobile + commands: dismission, get, get-self, invite, profile, search, search-mobile flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [contact.user.dismission] @@ -2699,6 +2721,11 @@ aliases: current, me, self, whoami flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited +[contact.user.invite] + runnable: true + hidden: false + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --depts:string|required=false|hidden=false|no-opt=""|scope=local, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --org-user-mobile:string|required=false|hidden=false|no-opt=""|scope=local, --org-user-name:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + [contact.user.profile] runnable: true hidden: false @@ -2792,7 +2819,7 @@ [dev.app.get] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --unified-app-id:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --app-key:string|required=false|hidden=false|no-opt=""|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --unified-app-id:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [dev.app.list] runnable: true @@ -3232,7 +3259,7 @@ [doc.+share-doc] runnable: true hidden: false - flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --note:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --to:string|required=false|hidden=false|no-opt=""|scope=local, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --url:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --ai-tag:bool|required=false|hidden=false|no-opt="true"|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --note:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --to:string|required=false|hidden=false|no-opt=""|scope=local, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --url:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [doc.+template-list] runnable: true @@ -3637,7 +3664,7 @@ [event.consume] runnable: true hidden: false - flags: --as:string|required=false|hidden=true|no-opt=""|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --compact:bool|required=false|hidden=false|no-opt="true"|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --debug-raw-events:bool|required=false|hidden=false|no-opt="true"|scope=local, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=local, --duration:duration|required=false|hidden=false|no-opt=""|scope=local, --ephemeral:bool|required=false|hidden=false|no-opt="true"|scope=local, --event-types:stringSlice|required=false|hidden=false|no-opt=""|scope=local, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, --filter:string|required=false|hidden=false|no-opt=""|scope=local, --filter-json:string|required=false|hidden=false|no-opt=""|scope=local, --force:bool|required=false|hidden=false|no-opt="true"|scope=local, --foreground:bool|required=false|hidden=false|no-opt="true"|scope=local, -f/--format:string|required=false|hidden=false|no-opt=""|scope=local, --group:string|required=false|hidden=false|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --max-events:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --name:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --output-dir:string|required=false|hidden=false|no-opt=""|scope=local, --personal-event-base-url:string|required=false|hidden=false|no-opt=""|scope=local, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --query:string|required=false|hidden=false|no-opt=""|scope=local, --quiet:bool|required=false|hidden=false|no-opt="true"|scope=local, --route:stringArray|required=false|hidden=false|no-opt=""|scope=local, --rule:string|required=false|hidden=false|no-opt=""|scope=local, --stream-source-id:string|required=false|hidden=false|no-opt=""|scope=local, --stream-ticket-mode:string|required=false|hidden=false|no-opt=""|scope=local, --stream-ticket-url:string|required=false|hidden=false|no-opt=""|scope=local, --subscribe-id:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --ttl:duration|required=false|hidden=false|no-opt=""|scope=local, --user:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --as:string|required=false|hidden=true|no-opt=""|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --compact:bool|required=false|hidden=false|no-opt="true"|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --debug-raw-events:bool|required=false|hidden=false|no-opt="true"|scope=local, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=local, --duration:duration|required=false|hidden=false|no-opt=""|scope=local, --ephemeral:bool|required=false|hidden=false|no-opt="true"|scope=local, --event-types:stringSlice|required=false|hidden=false|no-opt=""|scope=local, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, --filter:string|required=false|hidden=false|no-opt=""|scope=local, --filter-json:string|required=false|hidden=false|no-opt=""|scope=local, --flatten:bool|required=false|hidden=false|no-opt="true"|scope=local, --force:bool|required=false|hidden=false|no-opt="true"|scope=local, --foreground:bool|required=false|hidden=false|no-opt="true"|scope=local, -f/--format:string|required=false|hidden=false|no-opt=""|scope=local, --group:string|required=false|hidden=false|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --max-events:int|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --name:string|required=false|hidden=false|no-opt=""|scope=local, --open-dingtalk-id:string|required=false|hidden=false|no-opt=""|scope=local, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --output-dir:string|required=false|hidden=false|no-opt=""|scope=local, --personal-event-base-url:string|required=false|hidden=false|no-opt=""|scope=local, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --query:string|required=false|hidden=false|no-opt=""|scope=local, --quiet:bool|required=false|hidden=false|no-opt="true"|scope=local, --route:stringArray|required=false|hidden=false|no-opt=""|scope=local, --rule:string|required=false|hidden=false|no-opt=""|scope=local, --stream-source-id:string|required=false|hidden=false|no-opt=""|scope=local, --stream-ticket-mode:string|required=false|hidden=false|no-opt=""|scope=local, --stream-ticket-url:string|required=false|hidden=false|no-opt=""|scope=local, --subscribe-id:string|required=false|hidden=false|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, --ttl:duration|required=false|hidden=false|no-opt=""|scope=local, --user:string|required=false|hidden=false|no-opt=""|scope=local, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [event.list] runnable: true @@ -3647,7 +3674,7 @@ [event.schema] runnable: true hidden: false - flags: --as:string|required=false|hidden=true|no-opt=""|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + flags: --as:string|required=false|hidden=true|no-opt=""|scope=local, --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, --flatten:bool|required=false|hidden=false|no-opt="true"|scope=local, -f/--format:string|required=false|hidden=false|no-opt=""|scope=local, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited [event.status] runnable: true @@ -4117,6 +4144,23 @@ hidden: false flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --cursor:string|required=false|hidden=false|no-opt=""|scope=local, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --email:string|required=false|hidden=false|no-opt=""|scope=local, --employee-no:string|required=false|hidden=false|no-opt=""|scope=local, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --keyword:string|required=false|hidden=false|no-opt=""|scope=local, --limit:string|required=false|hidden=false|no-opt=""|scope=local, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --size:string|required=false|hidden=true|no-opt=""|scope=local, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited +[mcp] + runnable: true + hidden: false + commands: url + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + +[mcp.url] + runnable: true + hidden: false + commands: get + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + +[mcp.url.get] + runnable: true + hidden: false + flags: --client-id:string|required=false|hidden=false|no-opt=""|scope=inherited, --client-secret:string|required=false|hidden=false|no-opt=""|scope=inherited, --debug:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --dry-run:bool|required=false|hidden=false|no-opt="true"|scope=inherited, --fields:string|required=false|hidden=false|no-opt=""|scope=inherited, -f/--format:string|required=false|hidden=false|no-opt=""|scope=inherited, -h/--help:bool|required=false|hidden=false|no-opt="true"|scope=local, --jq:string|required=false|hidden=false|no-opt=""|scope=inherited, --mock:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -o/--output:string|required=false|hidden=true|no-opt=""|scope=inherited, --profile:string|required=false|hidden=false|no-opt=""|scope=inherited, --timeout:int|required=false|hidden=false|no-opt=""|scope=inherited, --token:string|required=false|hidden=true|no-opt=""|scope=inherited, -v/--verbose:bool|required=false|hidden=false|no-opt="true"|scope=inherited, -y/--yes:bool|required=false|hidden=false|no-opt="true"|scope=inherited + [minutes] runnable: true hidden: false From 857d9b8c1b74a6552acd6c59deafebaa92cf04c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=82=B3=E6=98=B1?= Date: Thu, 23 Jul 2026 11:31:12 +0800 Subject: [PATCH 4/4] test(mcp): cover URL command error paths --- internal/app/mcp_url_command_test.go | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/internal/app/mcp_url_command_test.go b/internal/app/mcp_url_command_test.go index ad91c264..c8c8ae0e 100644 --- a/internal/app/mcp_url_command_test.go +++ b/internal/app/mcp_url_command_test.go @@ -21,6 +21,7 @@ import ( "strings" "testing" + apperrors "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/internal/errors" "github.com/DingTalk-Real-AI/dingtalk-workspace-cli/pkg/edition" "github.com/spf13/cobra" ) @@ -97,6 +98,23 @@ func TestMCPURLGetRejectsBlankID(t *testing.T) { } } +func TestMCPURLGroupShowsHelp(t *testing.T) { + out, err := executeMCPURLCommand(t, nil, "url") + if err != nil { + t.Fatalf("execute mcp url: %v", err) + } + if !strings.Contains(out, "get") { + t.Fatalf("help output does not list get command:\n%s", out) + } +} + +func TestMCPURLGetRejectsMissingCaller(t *testing.T) { + _, err := executeMCPURLCommand(t, nil, "url", "get", "10043") + if err == nil || !strings.Contains(err.Error(), "caller is not configured") { + t.Fatalf("error = %v, want missing caller error", err) + } +} + func TestMCPURLGetPropagatesCallError(t *testing.T) { caller := &mcpURLTestCaller{err: errors.New("permission denied")} _, err := executeMCPURLCommand(t, caller, "url", "get", "10043") @@ -115,6 +133,48 @@ func TestMCPURLGetRejectsInvalidJSON(t *testing.T) { } } +func TestMCPURLGetRejectsEmptyResults(t *testing.T) { + tests := []struct { + name string + result *edition.ToolResult + }{ + {name: "nil result"}, + { + name: "no usable text content", + result: &edition.ToolResult{Content: []edition.ContentBlock{ + {Type: "image", Text: "ignored"}, + {Type: "text", Text: " "}, + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + caller := &mcpURLTestCaller{result: tt.result} + _, err := executeMCPURLCommand(t, caller, "url", "get", "10043") + if err == nil || !strings.Contains(err.Error(), "返回空结果") { + t.Fatalf("error = %v, want empty result error", err) + } + }) + } +} + +func TestMCPURLGetClassifiesBusinessError(t *testing.T) { + caller := &mcpURLTestCaller{ + result: &edition.ToolResult{Content: []edition.ContentBlock{{ + Type: "text", + Text: `{"success":false,"errorMsg":"搜索内容不能为空"}`, + }}}, + } + _, err := executeMCPURLCommand(t, caller, "url", "get", "10043") + if err == nil { + t.Fatal("expected classified business error") + } + var typed *apperrors.Error + if !errors.As(err, &typed) || typed.Reason != "business_error" { + t.Fatalf("error = %#v, want classified business error", err) + } +} + func TestRootRegistersMCPURLGet(t *testing.T) { root := NewRootCommand(t.Context()) mcp, _, err := root.Find([]string{"mcp"})