Codecast
ยท v4.1.0
Stream coding agent sessions (Claude Code, Codex, Gemini CLI, etc.) to a Discord channel in real-time via webhook. Use when invoking coding agents and wanting transparent, observable dev sessions โ no black box. Parses Claude Code's stream-json output into clean formatted Discord messages showing tool calls, file writes, bash commands, and results with zero AI token burn. Use when asked to "stream to Discord", "relay agent output", or "make dev sessions visible".
โ ๏ธ Hazard Flags
๐ Capabilities
Execution
- โ Shell execution
- โ Code execution
- โ Install dependencies
- โ Persistence
- Privilege: user
Filesystem
- โ Read workspace
- โ Write workspace
- โ Read home
- โ Write home
- โ Read system
- โ Delete
Network
- Egress: any
- โ Ingress
Credentials
- โ Environment vars
- โ Credential files
- โ Browser data
- โ Keychain
Actions
๐ Containment
Level: maximum
- SANDBOX_CONTAINER: Code execution capability
- LOG_ACTIONS: Audit trail for all actions
โก Risks
Mitigation: Block keychain access or use isolated environment.
Mitigation: Add proper exit conditions or limits to loops
Mitigation: Avoid accessing system directories unless absolutely necessary.
Mitigation: Validate and sanitize all user inputs before using in commands
Mitigation: Provide clear, detailed description of skill functionality
Mitigation: Minimize access to environment variables
Want a deeper analysis?
This report was generated by static analysis. Get an LLM-powered deep review with behavioral reasoning and attack surface mapping.
๐ง Deep Analysis โ $5.00๐จ Incident Response
Kill switch: Stop the agent process
Containment: Review logs for unexpected actions
Recovery: Depends on skill capabilities
๐ Raw SSDS JSON click to expand
{
"meta": {
"document_id": "ssds:auto:codecast:4.1.0",
"ssds_version": "0.2.0",
"scanner_version": "0.4.0+fe6fd9123d50",
"created_at": "2026-03-05T12:13:45.622Z",
"created_by": {
"agent": "safeagentskills-cli/generate-ssds"
},
"language": "en",
"notes": "Auto-generated SSDS. Manual review recommended."
},
"skill": {
"name": "Codecast",
"version": "4.1.0",
"format": "agent_skill",
"description": "Stream coding agent sessions (Claude Code, Codex, Gemini CLI, etc.) to a Discord channel in real-time via webhook. Use when invoking coding agents and wanting transparent, observable dev sessions โ no black box. Parses Claude Code's stream-json output into clean formatted Discord messages showing tool calls, file writes, bash commands, and results with zero AI token burn. Use when asked to \"stream to Discord\", \"relay agent output\", or \"make dev sessions visible\".",
"publisher": "unknown",
"source": {
"channel": "local"
},
"artifact": {
"sha256": "3b47991c422f1a86107e158bdf796b7e01e51dcff6777465337b0322b62d568c",
"hash_method": "files_sorted"
}
},
"capabilities": {
"execution": {
"can_exec_shell": true,
"can_exec_code": false,
"privilege_level": "user",
"can_install_deps": false,
"can_persist": false
},
"filesystem": {
"reads_workspace": true,
"reads_user_home": true,
"reads_system": false,
"writes_workspace": true,
"writes_user_home": true,
"writes_system": false,
"can_delete": true
},
"network": {
"egress": "any",
"ingress": false
},
"credentials": {
"reads_env_vars": true,
"reads_credential_files": true,
"reads_browser_data": false,
"reads_keychain": true
},
"services": [
{
"service": "messaging",
"operations": [
"read",
"write"
]
}
],
"actions": {
"can_send_messages": false,
"can_post_public": false,
"can_purchase": false,
"can_transfer_money": false,
"can_deploy": false,
"can_delete_external": false
},
"prompt_injection_surfaces": [
"web"
],
"content_types": [
"general"
]
},
"hazards": {
"hdac": {
"H": 4,
"D": 4,
"A": 2,
"C": 1
},
"flags": [
"EXEC",
"FS_READ_WORKSPACE",
"FS_READ_USER",
"FS_WRITE_WORKSPACE",
"FS_WRITE_USER",
"FS_DELETE",
"NET_EGRESS_ANY",
"CREDS_ENV",
"CREDS_FILES",
"CREDS_KEYCHAIN",
"PI_WEB"
],
"custom_flags": [
{
"code": "CRED_KEYCHAIN",
"name": "Keychain Access",
"description": "Accesses system keychain in: scripts/dev-relay.sh, scripts/discord-bridge.py"
},
{
"code": "FILE_DELETE",
"name": "File Deletion",
"description": "Can delete files in: scripts/dev-relay.sh, scripts/discord-bridge.py, scripts/review-pr.sh"
},
{
"code": "RESOURCE_ABUSE",
"name": "Resource Abuse Risk",
"description": "RESOURCE_ABUSE_INFINITE_LOOP detected: Infinite loop without clear exit condition"
},
{
"code": "TOOL_ABUSE",
"name": "Unauthorized Tool Use",
"description": "MCP_SYS_CRITICAL_ACCESS, MCP_SYS_FILE_DESTRUCTION: Access to critical system directories"
},
{
"code": "SOCIAL_ENGINEERING",
"name": "Social Engineering Risk",
"description": "SOCIAL_ENG_VAGUE_DESCRIPTION: Skill description is too vague or missing"
},
{
"code": "COMMAND_INJECTION",
"name": "Command Injection Risk",
"description": "COMMAND_INJECTION_USER_INPUT, MCP_SQL_BLIND: User input used in command substitution - potential injection risk"
},
{
"code": "DATA_EXFILTRATION",
"name": "Data Exfiltration Risk",
"description": "DATA_EXFIL_ENV_VARS: Reading environment variables that may contain secrets"
}
],
"confidence": {
"level": "medium",
"basis": [
"static_analysis"
],
"notes": "Detected 7 security patterns (18 vendored rule hits). Review recommended."
},
"rationale": {
"H": "H4: Critical: Privilege escalation or malware detected",
"D": "D4: Critical: Credential theft or data exfiltration",
"A": "A2: Service integrations detected",
"C": "C1: General content"
}
},
"containment": {
"level": "maximum",
"required": [
{
"control": "SANDBOX_CONTAINER",
"reason": "Code execution capability"
}
],
"recommended": [
{
"control": "LOG_ACTIONS",
"reason": "Audit trail for all actions"
}
],
"uncontained_risk": "Risk level depends on manual review of actual capabilities."
},
"risks": {
"risks": [
{
"risk": "Keychain/credential store access in: scripts/dev-relay.sh, scripts/discord-bridge.py",
"severity": "high",
"mitigation": "Block keychain access or use isolated environment."
},
{
"risk": "Resource abuse detected: RESOURCE_ABUSE_INFINITE_LOOP",
"severity": "high",
"mitigation": "Add proper exit conditions or limits to loops"
},
{
"risk": "Unauthorized tool use: MCP_SYS_CRITICAL_ACCESS, MCP_SYS_FILE_DESTRUCTION",
"severity": "critical",
"mitigation": "Avoid accessing system directories unless absolutely necessary."
},
{
"risk": "Command injection risk: COMMAND_INJECTION_USER_INPUT, MCP_SQL_BLIND",
"severity": "high",
"mitigation": "Validate and sanitize all user inputs before using in commands"
},
{
"risk": "Social engineering indicators: SOCIAL_ENG_VAGUE_DESCRIPTION",
"severity": "low",
"mitigation": "Provide clear, detailed description of skill functionality"
},
{
"risk": "Data exfiltration patterns: DATA_EXFIL_ENV_VARS",
"severity": "medium",
"mitigation": "Minimize access to environment variables"
}
],
"limitations": [
"Static analysis only - runtime behavior not verified"
]
},
"incident_response": {
"kill_switch": [
"Stop the agent process"
],
"containment": [
"Review logs for unexpected actions"
],
"recovery": [
"Depends on skill capabilities"
]
},
"evidence": [
{
"evidence_id": "EV:file-1",
"type": "file_excerpt",
"title": "README.md",
"file_path": "README.md"
},
{
"evidence_id": "EV:file-2",
"type": "file_excerpt",
"title": "scripts/codecast-watch.sh",
"file_path": "scripts/codecast-watch.sh"
},
{
"evidence_id": "EV:file-3",
"type": "file_excerpt",
"title": "scripts/dev-relay.sh",
"file_path": "scripts/dev-relay.sh"
},
{
"evidence_id": "EV:file-4",
"type": "file_excerpt",
"title": "scripts/discord-bridge.py",
"file_path": "scripts/discord-bridge.py"
},
{
"evidence_id": "EV:file-5",
"type": "file_excerpt",
"title": "scripts/parallel-tasks.sh",
"file_path": "scripts/parallel-tasks.sh"
},
{
"evidence_id": "EV:file-6",
"type": "file_excerpt",
"title": "scripts/parse-stream.py",
"file_path": "scripts/parse-stream.py"
},
{
"evidence_id": "EV:file-7",
"type": "file_excerpt",
"title": "scripts/platforms/__init__.py",
"file_path": "scripts/platforms/__init__.py"
},
{
"evidence_id": "EV:file-8",
"type": "file_excerpt",
"title": "scripts/platforms/discord.py",
"file_path": "scripts/platforms/discord.py"
},
{
"evidence_id": "EV:file-9",
"type": "file_excerpt",
"title": "scripts/review-pr.sh",
"file_path": "scripts/review-pr.sh"
},
{
"evidence_id": "EV:file-10",
"type": "file_excerpt",
"title": "scripts/strip-ansi.sh",
"file_path": "scripts/strip-ansi.sh"
},
{
"evidence_id": "EV:cisco-1",
"type": "file_excerpt",
"title": "MCP_SYS_CRITICAL_ACCESS [HIGH] scripts/codecast-watch.sh:1: #!/bin/bash",
"file_path": "scripts/codecast-watch.sh"
},
{
"evidence_id": "EV:cisco-2",
"type": "file_excerpt",
"title": "COMMAND_INJECTION_USER_INPUT [MEDIUM] scripts/dev-relay.sh:78: SCRIPT_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"",
"file_path": "scripts/dev-relay.sh"
},
{
"evidence_id": "EV:cisco-3",
"type": "file_excerpt",
"title": "MCP_SYS_FILE_DESTRUCTION [CRITICAL] scripts/dev-relay.sh:176: find /tmp -maxdepth 1 -name 'dev-relay.*' -type d -mtime +7 -exec rm -rf {} + 2>",
"file_path": "scripts/dev-relay.sh"
},
{
"evidence_id": "EV:cisco-4",
"type": "file_excerpt",
"title": "MCP_SYS_CRITICAL_ACCESS [HIGH] scripts/dev-relay.sh:1: #!/bin/bash",
"file_path": "scripts/dev-relay.sh"
},
{
"evidence_id": "EV:cisco-5",
"type": "file_excerpt",
"title": "DATA_EXFIL_ENV_VARS [MEDIUM] scripts/discord-bridge.py:45: token = os.environ.get(\"CODECAST_BOT_TOKEN\", \"\")",
"file_path": "scripts/discord-bridge.py"
},
{
"evidence_id": "EV:cisco-6",
"type": "file_excerpt",
"title": "RESOURCE_ABUSE_INFINITE_LOOP [HIGH] scripts/discord-bridge.py:438: while True:",
"file_path": "scripts/discord-bridge.py"
},
{
"evidence_id": "EV:cisco-7",
"type": "file_excerpt",
"title": "MCP_SQL_BLIND [HIGH] scripts/discord-bridge.py:154: time.sleep(1)",
"file_path": "scripts/discord-bridge.py"
},
{
"evidence_id": "EV:cisco-8",
"type": "file_excerpt",
"title": "COMMAND_INJECTION_USER_INPUT [MEDIUM] scripts/parallel-tasks.sh:34: SCRIPT_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"",
"file_path": "scripts/parallel-tasks.sh"
},
{
"evidence_id": "EV:cisco-9",
"type": "file_excerpt",
"title": "MCP_SYS_CRITICAL_ACCESS [HIGH] scripts/parallel-tasks.sh:1: #!/bin/bash",
"file_path": "scripts/parallel-tasks.sh"
},
{
"evidence_id": "EV:cisco-10",
"type": "file_excerpt",
"title": "MCP_SQL_BLIND [HIGH] scripts/parse-stream.py:77: time.sleep(0.5)",
"file_path": "scripts/parse-stream.py"
}
]
}