makecindy / makecindy/cindy

cindy_browser screenshot 应返回 image content block,而不是 JSON 文本

Open
#1,824 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
2.7k
Forks
395
Avg merge
21h 48m
Merged PRs (30d)
776

Description

## Problem

浏览器 runtime 的 `screenshot` action 会返回 PNG 的 Base64 数据与 `mimeType`,但 `cindy_browser` MCP 当前把所有 runtime 结果统一执行 `JSON.stringify`,再作为单个 `text` content block 返回。

因此模型收到的不是可直接视觉识别的图片,而是一大段包含 Base64 的 JSON 文本。截图稍大时,这段文本还会触发 `MAX_RESULT_BYTES = 200_000` 的结果截断,导致 Base64 不完整,既不能作为视觉输入,也无法再解码成有效图片。

工具注册层已经支持 `{ type: 'image', data, mimeType }`,但 screenshot 路径没有使用这一能力。

## Reproduction

1. 打开一个可被 `cindy_browser` 控制的页面,并取得 `targetId`。
2. 调用 `cindy_browser` 的 `screenshot` action。
3. 检查 MCP 返回内容。

## Actual

返回形态类似:

```json
{
"content": [
{
"type": "text",
"text": "{...\"mimeType\":\"image/png\",\"data\":\"\"...}"
}
]
}
```

较大的截图会被通用文本结果的 200KB 上限截断。

## Expected

`screenshot` 成功时,应把图片作为 MCP image content block 返回,例如:

```json
{
"content": [
{
"type": "image",
"data": "",
"mimeType": "image/png"
}
]
}
```

如需保留 `targetId`、尺寸或字节数等元数据,可以额外返回一个精简的 text block,但不应在文本中重复整段 Base64。

## Acceptance criteria

- [ ] `screenshot` 成功结果至少包含一个合法的 `image` content block。
- [ ] 图片 Base64 不再经过通用 JSON 文本序列化和 200KB 文本截断。
- [ ] 可选元数据与图片内容分离,且不重复携带完整 Base64。
- [ ] screenshot 失败时仍返回可读的 text error,并正确设置 `isError`。
- [ ] 增加测试,验证截图结果会作为模型视觉输入返回,并覆盖超过 200KB 的图片。

## Relevant code

- `packages/lizi-mcps/src/browser/tools.ts`
- `packages/lizi-mcps/src/browser/tool-registry.ts`
- `apps/desktop/src/main/mcp-integrations/browser-backend/rsb-webview-backend.ts`

## Related

- #1823 跟踪 Maker preview 与全局浏览器 backend 路由不一致的问题。本 Issue 只处理 screenshot 的 MCP 内容包装,不处理标签发现或 backend 选择。

Contributor guide

Open the contributing guide

Research direction

Start in packages/lizi-mcps/src/browser/tools.ts and trace screenshot results through tool-registry.ts, then inspect the backend adapter in apps/desktop/src/main/mcp-integrations/browser-backend/rsb-webview-backend.ts. Add or update tests for image content, metadata separation, errors, and images over 200KB. Done means successful screenshots return an intact MCP image block without text truncation, while failures remain readable errors with isError set.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
api, tooling
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
76/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.