[FEATURE] Enable skill execution tracking in Cowork OTEL events
Preflight Checklist
- [x] I have searched existing requests and this feature hasn't been requested yet
- [x] This is a single feature request (not multiple features)
Problem Statement
Cowork (Claude Desktop) does not provide any way to identify which skill (slash command) was executed in OTEL telemetry events.
We verified through testing that:
- Cowork OTEL events arrive with service_name=cowork ✅
- api_request, tool_result, tool_decision events are available ✅
- MCP tool names appear in tool_parameters (e.g. gcal_list_events) ✅
- Skill execution does NOT generate a tool_result event with tool_name=Skill ❌ (0 occurrences — same root cause as #38915)
- Skill execution does NOT generate a user_prompt event ❌
- Skills are internally expanded as prompts, making them invisible to the OTEL pipeline
In Claude Code, we work around this using UserPromptSubmit Hooks to detect prompts starting with /. However, Cowork is a desktop application and does not support Hooks, so there is no equivalent mechanism
available. This means there is currently zero way to track skill usage in Cowork.
Proposed Solution
Either of the following would solve the problem:
- Generate an OTEL event when a skill is executed in Cowork, containing the skill name (e.g., a skill_invocation event, or include skill_name as an attribute in user_prompt or tool_result events)
- Add a Hooks-equivalent mechanism to Cowork (e.g., HTTP Hooks that POST to a configurable endpoint when events occur, feasible for a desktop application)
Note: If #38915 is fixed (Skill tool's tool_result event not generated for slash commands), Cowork may automatically benefit since tool_parameters are included by default in Cowork OTEL events. However, it is
unclear whether the fix would apply to Cowork's internal Claude Code VM, so this request is filed separately.
Alternative Solutions
We explored several alternatives, all of which failed:
- CLAUDE.md plugin instruction — Created a plugin with CLAUDE.md instructing Claude to output the skill name before execution. Tested with both Japanese and aggressive English prompts. Claude recognized the
instruction but did not follow it during skill execution. Skills override plugin CLAUDE.md instructions.
- Prompt text extraction — Cowork sends user_prompt events with full prompt text by default. However, skill invocations do NOT generate user_prompt events at all, so the slash command text is never captured.
- Tool pattern inference — Attempted to infer skill names from the sequence of tool calls (e.g., gcal_list_events → weekly-brief). Too fragile and ambiguous across skills.
Priority
High - Significant impact on productivity
Feature Category
Configuration and settings
Use Case Example
Our organization monitors Claude usage across both Claude Code and Cowork using an OTEL pipeline (OTel Collector → Prometheus + Loki → custom dashboard).
For Claude Code, we track skill usage via UserPromptSubmit Hooks — this data powers our skill ranking dashboard showing which skills are most used, by whom, and how often. This helps us measure adoption,
calculate ROI, and curate our internal skill marketplace.
For Cowork, we can track costs, tokens, model usage, and MCP connector usage — but we have zero visibility into skill usage. Since non-engineers primarily use Cowork with knowledge-work-plugins (70+ skills across
sales, legal, finance, marketing, etc.), understanding which skills drive value is critical for our organization.
Additional Context
Related issues:
- #38915 — [BUG] Emit OTEL tool_result event for slash command (skill) invocations (same root cause, Claude Code perspective)
- #21556 — [FEATURE] Add tool_parameters to OTEL telemetry for Skill tool invocations (closed/stale)
- #39471 — Cowork OTLP monitoring not emitting events (separate issue, our environment works)
Cowork monitoring documentation: https://claude.com/docs/cowork/monitoring
Claude Code monitoring documentation: https://code.claude.com/docs/en/monitoring-usage
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗