Let's discuss specific purpose, name, and args first before implementing
Problem
When an agent gets stuck against our MCP server, we only see the failing tool call — never the higher-level "I was trying to do X but your tool's response didn't tell me how to proceed." We have no direct channel for agent feedback.
Related: #673 (Improve tool call accuracy).
Proposed solution
Ship a standalone helper tool (report-issue) that the agent calls when blocked.
- Add
HelperTools.REPORT_ISSUE = 'report-issue' to src/const.ts:25.
- New tool file:
src/tools/common/report_issue.ts (following the pattern of src/tools/common/search_apify_docs.ts — internal tool, Zod schema, AJV validate, buildMCPResponse return).
- Zod schema:
goal: z.string() — what the agent was trying to accomplish
attempted: z.string() — what it tried (tools, inputs)
blocker: z.string() — where it got stuck / what was confusing
tool_name: z.string().optional() — tool tied to the issue
- Register it in the appropriate category in
src/tools/categories.ts (likely enabled by default like docs tools).
- Pipe submissions through telemetry: emit a new Segment event from
src/telemetry.ts (e.g. 'MCP Agent Feedback') carrying the four fields plus mcp_session_id, mcp_client_name, etc.
- The Slack/GitHub fan-out lives in
apify-mcp-server-internal (consumes the Segment event) — keep delivery out of the public repo.
- Mention the tool in the description footers of tools where agents commonly get stuck (
call-actor, search-actors, fetch-actor-details) so the agent knows the channel exists. One sentence: "If you're blocked or our response is unclear, call report-issue so we can fix it."
Plan
Alternatives considered
- Pure log-based feedback (softFail) — not visible to product, only to oncall.
- Bundling feedback into existing tools as an optional field — agents won't reach for an optional field; a dedicated tool framed as "get unstuck" has stronger pull.
Let's discuss specific purpose, name, and args first before implementing
Problem
When an agent gets stuck against our MCP server, we only see the failing tool call — never the higher-level "I was trying to do X but your tool's response didn't tell me how to proceed." We have no direct channel for agent feedback.
Related: #673 (Improve tool call accuracy).
Proposed solution
Ship a standalone helper tool (
report-issue) that the agent calls when blocked.HelperTools.REPORT_ISSUE = 'report-issue'tosrc/const.ts:25.src/tools/common/report_issue.ts(following the pattern ofsrc/tools/common/search_apify_docs.ts— internal tool, Zod schema, AJV validate,buildMCPResponsereturn).goal: z.string()— what the agent was trying to accomplishattempted: z.string()— what it tried (tools, inputs)blocker: z.string()— where it got stuck / what was confusingtool_name: z.string().optional()— tool tied to the issuesrc/tools/categories.ts(likely enabled by default like docs tools).src/telemetry.ts(e.g.'MCP Agent Feedback') carrying the four fields plusmcp_session_id,mcp_client_name, etc.apify-mcp-server-internal(consumes the Segment event) — keep delivery out of the public repo.call-actor,search-actors,fetch-actor-details) so the agent knows the channel exists. One sentence: "If you're blocked or our response is unclear, callreport-issueso we can fix it."Plan
HelperTools.REPORT_ISSUEenum + tool implementationsrc/telemetry.ts; extend types insrc/types.tscall-actor,search-actors,fetch-actor-detailsdescriptionstests/integration/suite.tscaseapify-mcp-server-internalfor Slack + GitHub fan-outAlternatives considered