{"_id":"@carry-dream/clawer-ticket-server","_rev":"3-f65805835c9472e3d47b3427691005fc","name":"@carry-dream/clawer-ticket-server","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@carry-dream/clawer-ticket-server","version":"1.0.0","keywords":["mcp","model-context-protocol","ticket"],"author":{"name":"Carry3033"},"license":"ISC","_id":"@carry-dream/clawer-ticket-server@1.0.0","maintainers":[{"name":"carry-dream","email":"carry3033@qq.com"}],"homepage":"https://github.com/CarryAiTeam/clawer-ticket-server#readme","bugs":{"url":"https://github.com/CarryAiTeam/clawer-ticket-server/issues"},"bin":{"clawer-ticket-server":"dist/index.js"},"dist":{"shasum":"613dbc247a8127f79ad8aec0f9dcd899fd2b6a2f","tarball":"https://registry.npmjs.org/@carry-dream/clawer-ticket-server/-/clawer-ticket-server-1.0.0.tgz","fileCount":23,"integrity":"sha512-e6ClF11fmgQO4zr3TjmA00yLJkfeePj9D7WEbkxpMHwIltrC0XaxCqSTq5eoP1YHabrByqqS9EZbf3EaxPoeEQ==","signatures":[{"sig":"MEQCICO82EbK9KQOEyDkrzCoCvWBKFiPZ29fvfVN1Ab0FbSlAiAkdZW9r3z/7dFE9yvJtVEKU5e9M24iG7B8jLmwuT767g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127547},"main":"./dist/index.js","type":"module","engines":{"node":">=20"},"gitHead":"fd2e06da0e0661df252fd5f11a72c63fcb891f56","scripts":{"dev":"tsx src/index.ts","test":"npm run build && tsx test/package/npm-package.test.ts && tsx test/config/config-examples.test.ts && tsx test/integration/providers/ones/ones-provider.test.ts && tsx test/mcp/ticket-tools.test.ts && tsx test/mcp/stdio.test.ts","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepack":"npm run build"},"_npmUser":{"name":"carry-dream","email":"carry3033@qq.com"},"repository":{"url":"git+https://github.com/CarryAiTeam/clawer-ticket-server.git","type":"git"},"_npmVersion":"11.13.0","description":"Generic ticket-ingestion MCP server","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^4.4.3","playwright-core":"^1.62.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","typescript":"^7.0.2","@types/node":"^26.1.2"},"_npmOperationalInternal":{"tmp":"tmp/clawer-ticket-server_1.0.0_1786005441113_0.7174665414569934","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@carry-dream/clawer-ticket-server","version":"1.0.1","keywords":["mcp","model-context-protocol","ticket"],"author":{"name":"Carry3033"},"license":"ISC","_id":"@carry-dream/clawer-ticket-server@1.0.1","maintainers":[{"name":"carry-dream","email":"carry3033@qq.com"}],"homepage":"https://github.com/CarryAiTeam/clawer-ticket-server#readme","bugs":{"url":"https://github.com/CarryAiTeam/clawer-ticket-server/issues"},"bin":{"clawer-ticket-server":"dist/index.js"},"dist":{"shasum":"ae72a631f47f26e2f068088348595aed70014bd8","tarball":"https://registry.npmjs.org/@carry-dream/clawer-ticket-server/-/clawer-ticket-server-1.0.1.tgz","fileCount":33,"integrity":"sha512-X1AqcqWYQaoVvYJB9G1kz3sb6CUC99HkkMSETNedVfQReNE6QklYmjqjzYln2I4cV6LY9ekvZJuQDgUeJZ6xcw==","signatures":[{"sig":"MEUCIEYU1zv8c2PE/VA4GZotzNWgA7lOMCbMTRfDQWQYSnAyAiEA1DcjNCTboYlzLQhTKz1pfKkBpL1O/OF0p9X8yvhyx28=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":181151},"main":"./dist/index.js","type":"module","engines":{"node":">=20"},"gitHead":"5d415e5b671f70db662f193624ec05313f9e9a04","scripts":{"dev":"tsx src/index.ts","test":"npm run build && tsx test/package/npm-package.test.ts && tsx test/config/config-examples.test.ts && tsx test/integration/providers/ones/ones-provider.test.ts && tsx test/mcp/ticket-search-intent.test.ts && tsx test/mcp/ticket-tools.test.ts && tsx test/mcp/stdio.test.ts && tsx test/skills/ones-ticket-mcp-skill.test.ts","build":"tsc -p tsconfig.json","start":"node dist/index.js","prepack":"npm run build"},"_npmUser":{"name":"carry-dream","email":"carry3033@qq.com"},"repository":{"url":"git+https://github.com/CarryAiTeam/clawer-ticket-server.git","type":"git"},"_npmVersion":"11.13.0","description":"Generic ticket-ingestion MCP server","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^4.4.3","playwright-core":"^1.62.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.1","typescript":"^7.0.2","@types/node":"^26.1.2"},"_npmOperationalInternal":{"tmp":"tmp/clawer-ticket-server_1.0.1_1786674932930_0.9371413522303864","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@carry-dream/clawer-ticket-server","version":"1.0.2","description":"Generic ticket-ingestion MCP server","main":"./dist/index.js","bin":{"clawer-ticket-server":"dist/index.js"},"publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"engines":{"node":">=20"},"repository":{"type":"git","url":"git+https://github.com/CarryAiTeam/clawer-ticket-server.git"},"bugs":{"url":"https://github.com/CarryAiTeam/clawer-ticket-server/issues"},"scripts":{"build":"tsc -p tsconfig.json","dev":"tsx src/index.ts","start":"node dist/index.js","prepack":"npm run build","test":"npm run build && tsx test/package/npm-package.test.ts && tsx test/config/config-examples.test.ts && tsx test/integration/providers/ones/ones-provider.test.ts && tsx test/mcp/ticket-search-intent.test.ts && tsx test/mcp/ticket-tools.test.ts && tsx test/mcp/large-ticket-export-confirmation.test.ts && tsx test/mcp/stdio.test.ts && tsx test/skills/ones-ticket-mcp-skill.test.ts"},"keywords":["mcp","model-context-protocol","ticket"],"author":{"name":"Carry3033"},"license":"ISC","type":"module","dependencies":{"@modelcontextprotocol/sdk":"^1.30.0","playwright-core":"^1.62.0","zod":"^4.4.3"},"devDependencies":{"@types/node":"^26.1.2","tsx":"^4.23.1","typescript":"^7.0.2"},"gitHead":"2835a63befbb81895e79c3d1a758924cbe32f334","_id":"@carry-dream/clawer-ticket-server@1.0.2","homepage":"https://github.com/CarryAiTeam/clawer-ticket-server#readme","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-XcDvC8wzkX723tabUIIChKEXF/D38/h3Ysl3E0jFMkpailZRguhfHLE1S/f081+w1ERjO6QICst/YFt185uunA==","shasum":"4146ae79681a6d1d922e3b541729bba923e23ea8","tarball":"https://registry.npmjs.org/@carry-dream/clawer-ticket-server/-/clawer-ticket-server-1.0.2.tgz","fileCount":33,"unpackedSize":189951,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDZAKYIwVsg8uwGb0NjB/MLXrxhW74amK7oXk+60hcbuAiBrAYx9oq81T7LtZiJRLsJJlXDHzYiozpK6Lgsf7MymZQ=="}]},"_npmUser":{"name":"carry-dream","email":"carry3033@qq.com"},"directories":{},"maintainers":[{"name":"carry-dream","email":"carry3033@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/clawer-ticket-server_1.0.2_1787811415207_0.19729506816336784"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-06T08:37:20.865Z","modified":"2026-08-27T06:16:55.569Z","1.0.0":"2026-08-06T08:37:21.281Z","1.0.1":"2026-08-14T02:35:33.084Z","1.0.2":"2026-08-27T06:16:55.357Z"},"bugs":{"url":"https://github.com/CarryAiTeam/clawer-ticket-server/issues"},"author":{"name":"Carry3033"},"license":"ISC","homepage":"https://github.com/CarryAiTeam/clawer-ticket-server#readme","keywords":["mcp","model-context-protocol","ticket"],"repository":{"type":"git","url":"git+https://github.com/CarryAiTeam/clawer-ticket-server.git"},"description":"Generic ticket-ingestion MCP server","maintainers":[{"name":"carry-dream","email":"carry3033@qq.com"}],"readme":"# Clawer Ticket MCP\r\n\r\n面向 ONES Project 的受控工单 MCP，提供扁平摘要搜索、单项详情和显式本地导出。\r\n\r\n## V1 工具面\r\n\r\n本项目提供以下 6 个工具：\r\n\r\n| 工具 | 用途 |\r\n| --- | --- |\r\n| \\`ticket_browser_connect\\` | 为 browser profile 打开临时、可见的 Chrome 会话。 |\r\n| \\`ticket_browser_disconnect\\` | 关闭临时浏览器并丢弃内存登录态。 |\r\n| \\`ticket_connection_status\\` | 对 profile 执行小型只读授权探测。 |\r\n| \\`ticket_search\\` | 只读搜索扁平工单摘要。 |\r\n| \\`ticket_get\\` | 只读读取一张工单的有界详情、评论和附件元数据。 |\r\n| \\`ticket_export\\` | 显式预览或直接写入完整工单 bundle，并下载关联媒体。 |\r\n\r\n## Codex Skill\r\n\r\nSkill 源文件位于 `skills/ones-ticket-mcp/`。它是随 npm 包发布的版本化资产，但不位于 Codex 的项目级自动发现目录；检出仓库或安装 npm 包本身都不会自动启用它。需要使用时，用户应显式将该目录复制或建立链接到目标项目的 `.agents/skills/ones-ticket-mcp/`，或自己的用户级 Skill 目录。\r\n\r\n对于 browser profile，用户的读取请求、导出 `plan` 请求或明确本地下载请求即视为自动连接授权：如果首次调用发现会话未就绪，服务会直接打开临时浏览器、执行已配置的 `browser.autoLogin` 并重试原始调用，不要求额外回复“连接 ONES”。自动登录已提交但会话仍在结算时，服务会返回可重试的 `AUTHORIZATION_PENDING`，不会把它称为 MFA、验证码或 SSO。只有由本次恢复实际创建且已授权的临时会话，才会在成功、失败或取消后自动关闭；显式 `ticket_browser_connect` 创建的会话会保留给实际需要人工操作的页面，并由调用方显式断开。只有 ONES 实际显示 MFA、验证码、SSO 或其他人工挑战时，才需要在可见窗口操作。明确的本地下载指令是写入授权；但查询结果超过 50 条时，服务会先冻结范围并要求确认，避免意外写入大批量内容。\r\n\r\n该 Skill 为调用方提供参数构造与流程引导，不替代服务端的 schema、项目白名单、cursor 或 selection 校验。当前不提供自动安装器；后续若需要将多个 Skill 和 MCP 连接作为一个产品分发，再以 Plugin 取代这一显式安装步骤。\r\n\r\n## 三类中文意图\r\n\r\n- “查看、查阅、查询、列出 ONES 工单”只调用 `ticket_search`，默认是当前用户负责且未完成的列表。\r\n- “查看详情、查阅某工单详情”调用 `ticket_get`，不落盘、不下载二进制媒体。\r\n- “获取、下载到本地、导出、保存到本地、获取到本地”调用 `ticket_export`，一次完整写入详情、图片和附件；只有同一请求明确说计划、预览或先看看导出范围时才返回 `plan`。\r\n- 用户给出 `209488` 这类纯数字工单号时，Skill 会先自动搜索并精确匹配 `number`，再用服务端返回的内部 `id` 读取详情。\r\n\r\n“下载/导出/保存”优先级高于“查看”；“获取”会按其查询条件下载完整本地内容。\r\n\r\n## 搜索\r\n\r\n`ticket_search` 固定按 `createTime DESC` 返回摘要。它使用两个正交参数和一层受控 AND 筛选：\r\n\r\n- `scope`：`self`（默认，负责人包含当前用户）或 `project`（仅在明确请求所有人/整个项目时使用）。\r\n- `state`：`open`（默认，状态类型不包含 `done`）、`active`、`done` 或 `all`（包含已完成）。\r\n- 筛选字段包括标题包含、工作项类型稳定 ID 和状态类型 `in/notIn`；`scope: \"self\"` 由服务端自动加入当前负责人条件。\r\n\r\n因此“获取 ONES 工单”“获取我的待办”“获取我未完成的工单”使用 `scope: \"self\", state: \"open\"` 查询导出；“获取所有 ONES”“获取 ONES 所有工单”使用 `scope: \"self\", state: \"all\"` 查询导出。具体状态名称（如“新建”）写入导出查询的 `statuses`；只有“所有人的、全员、整个项目”等明确范围词才使用 `scope: \"project\"`。\r\n\r\n示例：\r\n\r\n\\`\\`\\`json\r\n{\r\n  \"scope\": \"self\",\r\n  \"state\": \"all\",\r\n  \"where\": {\r\n    \"all\": [\r\n      { \"field\": \"title\", \"op\": \"contains\", \"value\": \"111\" },\r\n      { \"field\": \"issueType\", \"op\": \"in\", \"values\": [\"<stable-issue-type-id>\"] }\r\n    ]\r\n  },\r\n  \"page\": { \"size\": 20 }\r\n}\r\n\\`\\`\\`\r\n\r\n响应中的 `page.nextCursor` 是服务端签发、内存保存的 opaque token。续页使用该 cursor，并保持相同 profile、scope、state、筛选和页大小；ONES 的 `after`、原始 GraphQL、`filterGroup`、view URL、项目筛选、其他负责人、OR/嵌套组和自定义排序均不属于公开输入面。\r\n\r\n## 查询导出\r\n\r\n单张导出传 `ticket`；查询导出传与 `ticket_search` 相同的 `query`（query 不含 `page`）。\r\n\r\n“获取工单”调用 `ticket_export({ query, mode: \"write\", media: \"download\" })`；具体状态名称可传 `query.statuses`。服务以固定每页 50 条的内部 cursor 分页完整冻结选择，不向调用方暴露 page。选择为 1–50 条时会在该调用中完整写入；选择为 51–2,000 条时返回零写入的 `EXPORT_CONFIRMATION_REQUIRED`，其中包含 `selection`。向用户展示数量并取得明确确认后，使用完全相同的 query、media 和 selection 再次调用 `ticket_export`，服务会重新枚举、校验未漂移并完整导出全部选择。只说“查看、查阅、查询、列出”时使用只读工具。\r\n\r\n只有用户明确要求预览时，才调用 \\`ticket_export({ query, mode: \"plan\" })\\`。计划会返回 \\`selection\\`，后续“按刚才计划导出”需将完全相同的查询、\\`selection\\` 与 media 回传给 \\`mode: \"write\"\\`；数量或有序 ID 集合变化时返回 \\`SELECTION_CHANGED\\`，不会静默扩大写入范围。\\`media: \"metadata\"\\` 是用户明确要求“不要附件/图片、仅元数据”时的降级选项，不能用于普通“获取”。\r\n\r\n服务端默认 `storage.exportLimits.autoDownloadThreshold` 为 50，`maxItems` 为 2,000（同步导出的硬上限，配置超过 2,000 会明确报错，不会截断）。超过硬上限返回 `EXPORT_LIMIT_EXCEEDED`，不会静默只写入第一页。`mode: \"plan\"` 仍是完整、可能耗时但无写入的计划。查询 `write` 最多并行 3 个工位：每个工位完成一张工单的详情读取、附件下载与原子 bundle 提交后，立即领取下一张，因此不会混写也不必等待整批。授权错误会先停止补位并等待已在途工位收束，再创建临时会话重试整次操作。`exports` 和 `failedTickets` 仍按查询顺序返回，`completedTickets` 则报告真实完成顺序。取消后不再补领下一张；30 秒只是进度观察阈值，并非强制杀掉正在处理的下载。确认仅授权工单范围，媒体预算和局部失败语义保持不变。\r\n\r\n## 配置与安全\r\n\r\n从 \\`config/\\` 复制浏览器或 GraphQL 示例到受 Git 忽略的本机位置，并通过 \\`CLAWER_TICKET_CONFIG_PATH\\` 指向它。\r\n\r\n- GraphQL profile 使用 \\`secretRef\\` 从启动进程环境读取只读凭据；JSON 和工具参数都不能包含 token。\r\n- Browser profile 可选 \\`browser.executablePath\\` 和本机 \\`browser.autoLogin\\`。MFA、验证码、SSO 和其他人工挑战必须在可见窗口中完成。\r\n- \\`allowedProjects\\` 是受控范围；项目范围查询要求非空白名单，应用层和 ONES adapter 都会校验返回项；空白名单会返回 \\`SOURCE_NOT_ALLOWED\\`。\r\n- 临时附件 URL、浏览器 Cookie 和原始 ONES 响应不会持久化或作为 MCP 响应返回。\r\n\r\n## 开发与验证\r\n\r\n常用命令：\r\n\r\n\\`\\`\\`bash\r\nnpm run build\r\nnpm test\r\n\\`\\`\\`\r\n\r\n当前设计依据、真实脱敏 ONES 请求 fixture、分页证据和实施记录见 [ticket-tool-surface-design](./.cloudpivot-cli/task-runs/ticket-tool-surface-design/v1-requirements-and-delivery-plan.md)。\r\n","readmeFilename":"README.md"}