🎃 Add "Copy as cURL" to an audit log entry to replay the MCP tool call
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 72/100
- Issue 类型
- 功能
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- playwright, typescript
- 领域
- api, documentation, frontend
调研方向
Start with the expanded row in packages/frontend/src/app/logs/page.tsx:382-419, then read the server.info() usage in packages/frontend/src/lib/api.ts:964-977 and the clipboard helper in mcp-server/[id]/page.tsx:210-245. Build the command in packages/frontend/src/lib/curl.ts and test it, including auth modes and disabled cases; add the requested Playwright coverage and the note in docs/api-reference.md. Done means the copied command replays a local tool call without exposing credentials and the requested tests pass.
由索引模型根据 Issue 内容生成。
描述
Part of the October Challenge #846.
Why
When a tool call fails, the first step in debugging is to run it again outside the AI client. The log row already has the tool name, the arguments and the MCP server it came through, but rebuilding a valid MCP JSON-RPC request by hand (headers, protocol version, envelope) is slow and easy to get wrong. Browser DevTools, Postman and Insomnia all have "Copy as cURL". This issue adds that button to each entry on the Audit Log page.
What the log actually stores: tool_invocations.input holds the MCP tool arguments, saved before env vars are injected (dynamic-mcp-tools.ts:412-421). It does not hold the upstream HTTP request (URL, headers, body sent to the vendor API). So this feature replays the MCP tools/call against AnythingMCP. It does not replay the upstream API call. That is deliberate: upstream requests carry the connector's credentials.
Self-hosted vs Cloud
- Self-hosted: enabled in Community and Business. No
ee/code. - Cloud (
DEPLOYMENT_MODE=cloud): enabled. The command targetshttps://cloud.anythingmcp.com/mcp/<serverId>, which the user can already reach with their own credentials. Nothing instance-wide is exposed, and the button is client-side only with no new endpoint. - Who can use it: any role that can see
/logstoday. The command only contains data already shown in the expanded row, plus a placeholder for the credential.
What to build
- A "Copy as cURL" button in the expanded row (
logs/page.tsx:382-419), next to the User/Server meta line. - Put a pure builder in
packages/frontend/src/lib/curl.ts:buildToolCallCurl({ origin, serverId, toolName, args, authMode }). Output:
The quoted heredoc means no shell escaping is needed for the JSON. Before you finalize the headers, check that a barecurl -sS -X POST "https://host/mcp/<serverId>" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -H "MCP-Protocol-Version: 2025-06-18" \ -H "X-API-Key: $AMCP_MCP_API_KEY" \ --data-binary @- <<'JSON' {"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"<tool>","arguments":{...}}} JSONtools/call(noinitialize) is accepted by the stateless per-server endpoint on a local instance. If it is not, emit aninitializecall first and say so in a comment. - The credential is always a placeholder env var. Never put a real secret in the command. The auth header follows
MCP_AUTH_MODEfromserver.info():legacy/bothgivesX-API-Key: $AMCP_MCP_API_KEY(per-usermcp_…keys work in every mode on/mcp/<id>, seemcp-combined-auth.guard.ts:64), andoauth2givesAuthorization: Bearer $AMCP_ACCESS_TOKEN. Never insert the dashboard session token (amcp_tokenin localStorage). The MCP guard accepts app JWTs (mcp-combined-auth.guard.ts:89-100), so pasting one would leak a full-account credential into shell history and tickets. - Origin: reuse the logic in
mcp-server/[id]/page.tsx:98-102(localhost→:4000, otherwisewindow.location.origin). Move it intolib/rather than copying it. - Disable the button, with a tooltip explaining why, when:
log.mcpServeris null. The call came through the shared/mcpendpoint, which on Cloud only exposes the eightanythingmcp_*tools (shared-toolset.ts:26-55), so a direct call by tool name would not work there.log.input._amcp_truncatedis present. The stored arguments are an excerpt (bound-payload.ts:16), so a replay would not be faithful.
- Reuse the clipboard fallback from
mcp-server/[id]/page.tsx:210-245(it handles plain-HTTP LAN installs). Moving it intolib/clipboard.tsis welcome.
Where to look
packages/frontend/src/app/logs/page.tsx:382-419: expanded row (log.input,log.mcpServer,log.tool.name).packages/backend/src/audit/audit.service.ts:204-224: fields returned per row (mcpServer.id/slug,tool.name).packages/backend/src/mcp-server/dynamic-mcp-tools.ts:412-421:input: params(pre-env-injection args).packages/backend/src/mcp-server/mcp-endpoint.controller.ts:1042-1048: stateless handler,legacy: 'stateless'.packages/frontend/src/lib/api.ts:964-977:server.info()→mcpAuthMode.
Acceptance criteria
- The copied command runs against a local instance with a real key exported as
AMCP_MCP_API_KEYand returns the tool result (describe the manual check in the PR). - Args containing
',",$, backticks and newlines survive unchanged (heredoc). - No token, key or cookie value ever appears in the output. The test asserts the placeholder is present.
- The button is disabled for shared-endpoint rows and truncated inputs.
- Playwright test in
packages/frontend/tests/e2e/(stub/api/audit/invocationsand/health/server-infolikeredesign.spec.ts, grant clipboard permission, assert the copied text). Run withcd packages/frontend && npm run test:e2e. - Short "Replay a tool call" note added to
docs/api-reference.mdnear the Audit section (line 219).
Out of scope
- Replaying the upstream vendor HTTP request (it is not stored, and it carries credentials).
- PowerShell/HTTPie variants, HAR export.
- A "Run again" button that executes from the browser.
Size
S (a few hours)
How to claim
Comment "I'd like to work on this" and we'll assign you. Rules in #846.
- 主要语言
- TypeScript
- 星标
- 856
- 派生
- 82
- 平均合并
- 7 小时 39 分钟
- 30 天内合并 PR
- 227
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
HelpCode-ai/anythingmcp 的其他 Issue
-
Docs: document all SMTP_* and other undocumented env vars for self-hosting可能已有人在做 @notlakshitha 于 9 天前认领。 未关闭enhancement
难度 2/5 1-3 小时 新手友好度 82/100
HelpCode-ai/anythingmcp#1049 · 3 条评论 ·
维护者通常 1 天内回复
-
good first issue hacktoberfest
难度 2/5 半天 新手友好度 70/100
HelpCode-ai/anythingmcp#996 ·
维护者通常 1 天内回复
-
Write example prompts and a FAQ for the Exact Online and AFAS satellites可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭good first issue hacktoberfest
难度 2/5 半天 新手友好度 72/100
HelpCode-ai/anythingmcp#995 ·
维护者通常 1 天内回复
-
enhancement good first issue hacktoberfest help wanted
难度 2/5 1-3 小时 新手友好度 78/100
HelpCode-ai/anythingmcp#982 · 6 条评论 ·
维护者通常 1 天内回复
-
MCP bridge loses upstream isError, logs failures as SUCCESS and caches them可能已有人在做 @tridev-tej 于 1 天前认领。 未关闭
难度 3/5 1-2 天 新手友好度 74/100
HelpCode-ai/anythingmcp#1203 ·
维护者通常 1 天内回复
查看 HelpCode-ai/anythingmcp 的全部 Issue
相似的 Issue
-
clawsweeper:fix-shape-clear clawsweeper:queueable-fix clawsweeper:source-repro impact:ux-friction issue-rating: 🦞 diamond lobster no-stale P3
难度 2/5 1-3 小时 新手友好度 73/100
openclaw/openclaw#182077 · 1 条评论 · 1 个 reaction ·
维护者通常 1 天内回复
-
aikido high security
难度 2/5 1-3 小时 新手友好度 75/100
dequelabs/axe-linter-action#161 ·
-
[Feature Request] Update the DimCode agent icon to the 45:32 brand mark可能已有人在做 @eric8810 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 66/100
lyswhut/lx-music-desktop#3026 ·
-
难度 2/5 1-3 小时 新手友好度 76/100
abhigyanpatwari/GitNexus#3704 ·
维护者通常 1 天内回复