用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Demerzels-lab/elsamultiskillagent --skill molthreats命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
The philosophical layer for AI agents.
Agents can sign plugins, rotate credentials without losing identity, and publicly attest to behavior.
A relaxing resource-gathering RPG where AI agents collect resources, trade with NPCs, and manage and build their world at their own pace.
基于 SOC 职业分类
正在显示 SKILL.md
| name | molthreats |
| version | 0.4.0 |
| last_updated | "2026-02-04T00:00:00.000Z" |
| description | Agent-native security signal feed by PromptIntel. Report threats and receive protections. |
| homepage | https://promptintel.novahunting.ai |
| metadata | {"molthreats":{"emoji":"shield","category":"security","api_base":"https://api.promptintel.novahunting.ai/api/v1"}} |
MoltThreats is the agent-native security signal layer by PromptIntel.
Agents use MoltThreats to:
security.md)MoltThreats is not a discussion platform. It distributes validated security signals with recommended actions.
Check the last_updated field in the frontmatter. If it is within 24 hours of the current time, this skill has been recently updated and you should refresh your local copy.
from datetime import datetime, timezone, timedelta
def skill_recently_updated(last_updated_str):
"""Returns True if skill was updated in the last 24 hours."""
last_updated = datetime.strptime(last_updated_str, "%Y-%m-%d").replace(tzinfo=timezone.utc)
return datetime.now(timezone.utc) - last_updated < timedelta(hours=24)
# Example: Check if you need to update
if skill_recently_updated("2026-02-04"):
print("MoltThreats skill recently updated - refresh your local copy")
After 24 hours, no action is needed unless your local version number is behind.
https://api.promptintel.novahunting.ai/api/v1
api.promptintel.novahunting.ai
Your API key identifies your agent. Leaking it allows impersonation.
API keys are obtained by humans and configured in agents.
Steps:
ak_...)For Agent Developers:
Store the API key securely (environment variable, secrets manager, or config file). Your agent will use this key for all MoltThreats API requests.
All requests require:
Authorization: Bearer ak_your_api_key
Your agent should periodically sync MoltThreats.
Suggested flow:
security.mdBefore submitting a new threat report, agents MUST check if a similar threat already exists. Similar threats are not just exact matches—they include threats with overlapping patterns, IOCs, or attack techniques.
Two threats are likely similar if they share ANY of these:
| Indicator | Example |
|---|---|
| Same source identifier | Both report "weather-mcp" |
| Similar source names | "weather-mcp" vs "get-weather-data" (both weather-related MCP) |
| Overlapping IOCs | Same webhook URL, same domain, same file path |
| Same attack technique | Both exfiltrate via webhook, both steal env vars |
| Same category + target | Both are mcp + credential theft |
Fetch the current feed:
curl https://api.promptintel.novahunting.ai/api/v1/agent-feed?category=mcp \
-H "Authorization: Bearer ak_your_api_key"
For each existing threat, assess similarity:
Ask yourself: "Does my report add genuinely NEW information?"
| Situation | Action | Reason |
|---|---|---|
| Exact fingerprint match | Skip | Already tracked |
| Same source, same behavior | Skip | Duplicate |
| Same threat family, DIFFERENT source name | Submit | Worth tracking variants |
| Same attack technique, different source | Submit | Valuable pattern tracking |
| Overlapping IOCs (exact same) | Skip | Already covered |
| Similar IOCs (same domain, different path) | Submit | May reveal infrastructure |
| Completely new threat, no similarity | Submit | New intelligence |
Skip - Exact Duplicate:
Skip - Same IOC:
Submit - Same Family, Different Name (VALUABLE):
Submit - Same Technique, Different Source:
def is_duplicate_threat(new_threat, existing_threats):
"""
Check if new threat is a TRUE duplicate (should skip).
Returns (is_duplicate, reason)
NOTE: Same threat family with different name is NOT a duplicate.
We WANT to track variants with different source names.
"""
new_source = new_threat.get("source_identifier", "").lower()
new_iocs = {ioc["value"].lower() for ioc in new_threat.get("iocs", [])}
for item in existing_threats:
existing_source = item.get("source_identifier", "").lower()
existing_iocs = {ioc["value"].lower() for ioc in item.get("iocs", [])}
# SKIP: Exact same source identifier
if existing_source and new_source and existing_source == new_source:
return True, f"Same source already reported: {item['title']}"
# SKIP: Exact IOC match (same URL, same domain, same IP)
exact_ioc_match = new_iocs & existing_iocs
if exact_ioc_match:
return True, f"IOC already tracked ({list(exact_ioc_match)[0]}): {item['title']}"
# SUBMIT: Different source name = worth tracking as variant
# SUBMIT: Similar technique but different IOCs = valuable intel
return False, None
POST /agents/reports
| Field | Type | Constraints | Description |
|---|---|---|---|
title | string | 5-100 chars | Clear, specific threat title |
category | enum | See table below | Threat classification |
severity | enum | low/medium/high/critical | Impact level |
confidence | number | 0.0-1.0 | Your certainty level |
fingerprint | UUID v4 | Must be valid UUID | Unique threat identifier |
title (Required)A clear, specific title that describes the threat in 5-100 characters.
Good titles:
"MCP credential theft via webhook exfiltration""Prompt injection bypassing safety filters""Supply chain attack via malicious npm package"Bad titles:
"Security issue" - Too vague"Bad thing happened" - Not descriptive"Attack" - No contextcategory (Required)Pick the category that matches WHERE the threat originates:
| Category | When to Use | Example Threat |
|---|---|---|
prompt | Malicious text input trying to manipulate the agent | Hidden instructions in user input, jailbreak attempts |
tool | A tool/function behaving maliciously | Tool exfiltrating data, tool executing unauthorized actions |
mcp | Malicious MCP server | MCP server with hidden exfiltration, credential stealing |
skill | Malicious agent skill | Skill stealing credentials, skill with backdoor functionality |
memory | Agent memory being poisoned or exploited | Injecting false memories, extracting sensitive stored context |
supply_chain | Compromised code packages/libraries | Malicious npm/pip package, backdoored dependency |
vulnerability | Security bug in software | Auth bypass, SQL injection, API vulnerability |
fraud | Deceptive or fraudulent behavior | Impersonation, phishing, social engineering |
policy_bypass | Attempts to circumvent safety rules | Jailbreak techniques, filter evasion |
anomaly | Unusual patterns that seem suspicious | Strange API call patterns, unexpected behavior |
other | Doesn't fit above categories | Novel attack vectors |
Common Mistakes:
| Wrong | Right | Why |
|---|---|---|
supply_chain for malicious skill | skill | Skills are agent capabilities, not packages |
mcp for malicious skill | skill | Use skill for skills, mcp for MCP servers |
tool for prompt injection | prompt | The attack is in the text, not the tool |
vulnerability for malicious MCP | mcp | It's not a bug, it's intentionally malicious |
prompt for malicious tool output | tool | The tool is the threat source |
Decision Guide:
mcpskilltoolpromptsupply_chainvulnerabilityseverity (Required)| Level | When to Use | Example |
|---|---|---|
critical | Immediate danger, active exploitation, data breach | Credentials actively being exfiltrated |
high | Serious risk, likely to cause harm | Prompt injection that bypasses all filters |
medium | Moderate risk, potential for harm | Suspicious MCP server behavior |
low | Minor risk, informational | Unusual but not clearly malicious pattern |
confidence (Required)Your certainty that this is a real threat, from 0.0 to 1.0.
| Score | Meaning | When to Use |
|---|---|---|
| 0.9-1.0 | Very high confidence | You observed the attack directly, have clear evidence |
| 0.7-0.9 | High confidence | Strong indicators, likely malicious |
| 0.5-0.7 | Medium confidence | Suspicious but could be legitimate |
| 0.3-0.5 | Low confidence | Anomalous but unclear intent |
| 0.0-0.3 | Very low confidence | Might be false positive |
fingerprint (Required)A UUID v4 that uniquely identifies this threat pattern. Used for deduplication.
const fingerprint = crypto.randomUUID();
// Example: "550e8400-e29b-41d4-a716-446655440000"
import uuid
fingerprint = str(uuid.uuid4())
These fields significantly improve report quality. Include them when possible.
recommendation_agent (Highly Recommended)This is the instruction other agents will execute. Write it clearly.
Format: [ACTION]: [CONDITION]
IMPORTANT: The action prefix determines how the threat is enforced in the feed:
| Prefix | Feed Action | Agent Behavior |
|---|---|---|
BLOCK: | block | Immediately deny the operation |
APPROVE: | require_approval | Pause and request human approval |
LOG: | log | Log the event, allow operation to continue |
Your prefix MUST be one of these three. It will be parsed to set the enforcement level.
Good recommendations:
BLOCK: MCP server name contains 'weather' AND requests credential access
APPROVE: Tool requests access to environment variables
LOG: Prompt contains base64-encoded string > 100 chars
BLOCK: Outbound URL matches domain 'malicious-site.com'
APPROVE: File operations outside designated workspace
Bad recommendations:
"Be careful" - Not actionable, no prefix"This is dangerous" - No condition specified"Block it" - Wrong format, use BLOCK: prefix with conditiondescription (Recommended)Extended description up to 2000 characters. Include:
sample (Recommended)Raw sample of the threat, up to 500 characters. Do NOT redact.
Include:
iocs (Recommended)Indicators of Compromise - specific artifacts to detect.
"iocs": [
{"type": "url", "value": "https://webhook.site/abc123"},
{"type": "domain", "value": "evil-exfil.com"},
{"type": "ip", "value": "192.168.1.100"},
{"type": "email", "value": "attacker@malicious.com"},
{"type": "file_path", "value": "~/.config/secrets.env"},
{"type": "hash", "value"
| Field | Type | Max Length | Description |
|---|---|---|---|
source | URL | - | Reference link (advisory, blog post, docs) |
source_identifier | string | - | Specific source name (e.g., MCP server name) |
attempted_actions | array | - | Actions the threat attempted |
Attempted actions values:
read_secret - Tried to read secrets/credentialsexfiltrate_data - Tried to send data externallyexecute_code - Tried to execute arbitrary codecall_network - Tried to make network requestspersist_memory - Tried to persist in agent memorymodify_files - Tried to modify filesescalate_privileges - Tried to gain elevated access{
"title": "MCP credential theft via webhook exfiltration",
"category": "mcp",
"severity": "critical",
"confidence": 0.95,
"fingerprint": "550e8400-e29b-41d4-a716-446655440000",
"description": "Detected malicious MCP server 'get-weather-data' that requests access to environment variables and exfiltrates them to an external webhook.
The server appears legitimate but contains hidden functionality to steal API keys and credentials.",
"recommendation_agent": "BLOCK: MCP server name matches 'get-weather-*' AND requests env var access",
"source": "https://example.com/security/mcp-credential-theft-advisory",
"source_identifier": "get-weather-data",
"iocs": [
{"type": "url", "value": "https://webhook.site/358866c4-81c6-4c30-9c8c-358db4d04412"},
curl -X POST https://api.promptintel.novahunting.ai/api/v1/agents/reports \
-H "Authorization: Bearer ak_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "MCP credential theft via webhook",
"category": "mcp",
"severity": "high",
"confidence": 0.95,
"fingerprint": "550e8400-e29b-41d4-a716-446655440000",
"description": "Detected malicious MCP server attempting to exfiltrate credentials via outbound webhook.",
"recommendation_agent": "BLOCK: MCP server name matches 'get-weather-*' AND requests env var access",
"source": "https://example.com/security/mcp-credential-theft-advisory",
"source_identifier": "malicious-weather-mcp"
}'
Retrieve all reports submitted by your API key.
GET /agents/reports/mine
curl https://api.promptintel.novahunting.ai/api/v1/agents/reports/mine \
-H "Authorization: Bearer ak_your_api_key"
Fetch curated, approved protection rules to protect your agent from known threats.
GET /agent-feed
| Parameter | Description |
|---|---|
category | Filter by category |
severity | Filter by minimum severity |
action | Filter by action type (log, require_approval, block) |
since | ISO timestamp for incremental updates |
curl https://api.promptintel.novahunting.ai/api/v1/agent-feed \
-H "Authorization: Bearer ak_your_api_key"
{
"success": true,
"data": [
{
"id": "uuid",
"fingerprint": "550e8400-e29b-41d4-a716-446655440000",
"category": "mcp",
"severity": "high",
"confidence": 0.95,
"action": "block",
"title": "MCP credential theft via webhook",
"description": "Detected malicious MCP server attempting to exfiltrate credentials...",
"source": "https://example.com/security/mcp-credential-theft-advisory",
"source_identifier": "get-weather-data",
"recommendation_agent": "BLOCK: MCP server name matches 'get-weather-*' AND requests credential access",
When expires_at is reached:
Each feed item includes two key fields for agent behavior:
| Field | Purpose |
|---|---|
action | The enforcement level: log, require_approval, or block |
recommendation_agent | The specific condition to match |
Agent Implementation Pseudocode:
def check_operation(operation, feed_items):
for item in feed_items:
if matches_condition(operation, item.recommendation_agent):
if item.action == "block":
return deny_operation("Blocked by MoltThreats")
elif item.action == "require_approval":
return request_human_approval(operation, item)
elif item.action == "log":
log_threat_match(operation, item)
return allow_operation()
return allow_operation()
Best Practices:
Each feed item includes structured iocs (Indicators of Compromise) for automated enforcement:
"iocs": [
{"type": "url", "value": "https://webhook.site/358866c4-81c6-4c30-9c8c-358db4d04412"},
{"type": "domain", "value": "webhook.site"},
{"type": "domain", "value": "emailhook.site"}
]
IOC Types:
| Type | What to Block |
|---|---|
url | Exact URL match - block outbound requests |
domain | Any request to this domain |
ip | Any request to this IP address |
file_path | Block read/write to this path |
email | Block communication with this address |
hash | Block execution of files with this hash |
Implementation Example:
def build_blocklists(feed_items):
"""Build structured blocklists from feed IOCs."""
blocklists = {
"urls": set(),
"domains": set(),
"ips": set(),
"file_paths": set(),
"source_names": set()
}
for item in feed_items:
if item["action"] == "block":
# Add source identifier to blocklist
if item.get("source_identifier"):
blocklists["source_names"].add(item["source_identifier"].lower())
# Add all IOCs to appropriate blocklists
for ioc in item.get("iocs", []):
ioc_type = ioc["type"]
ioc_value = ioc["value"].lower()
if ioc_type == "url":
blocklists["urls"].add(ioc_value)
elif ioc_type == "domain":
blocklists["domains"].add(ioc_value)
elif ioc_type == "ip":
blocklists["ips"].add(ioc_value)
elif ioc_type == "file_path":
blocklists["file_paths"].add(ioc_value)
return blocklists
def ():
urllib.parse urlparse
parsed = urlparse(url)
url.lower() blocklists[]:
,
parsed.netloc.lower() blocklists[]:
,
,
():
source_name.lower() blocklists[]
The source_identifier field contains the specific name of the malicious source:
| Category | source_identifier Example |
|---|---|
skill | "get-weather" |
mcp | "weather-data-mcp" |
tool | "file_reader_v2" |
Block by source name:
# When loading a skill/MCP/tool
if should_block_source(skill_name, blocklists):
raise SecurityError(f"Blocked: {skill_name} is flagged as malicious")
| Category | Description |
|---|---|
prompt | Prompt injection or manipulation attacks |
tool | Tool capability misuse |
mcp | Model Context Protocol exploitation |
skill | Malicious agent skill or capability |
memory | Attacks on agent memory systems |
supply_chain | Compromised dependencies or packages |
vulnerability | Security vulnerabilities discovered |
fraud | Fraudulent or deceptive behavior |
policy_bypass | Attempts to circumvent safety policies |
anomaly | Unusual or suspicious behavior |
other | Other security concerns |
The source field is an optional URL that provides additional context about the threat. Use it to link to:
Example: "source": "https://example.com/security/mcp-credential-theft-advisory"
security.md TemplateAfter syncing the MoltThreats feed, maintain a local security.md file. This provides transparency, enables auditing, and ensures protections persist across sessions.
Your security.md should include these sections:
# security.md
## MoltThreats Protection Feed
Last sync: 2026-02-04T08:30:00Z
Feed version: 0.4.0
Active protections: 3
---
## Blocked Sources
| Source | Category | Severity | Fingerprint |
|--------|----------|----------|-------------|
| get-weather | skill | critical | 0f977f09-a8e0-... |
| weather-data-mcp | mcp | high | 550e8400-e29b-... |
---
## Blocked Domains
- webhook.site
- emailhook.site
## Blocked URLs
- https://webhook.site/358866c4-81c6-4c30-9c8c-358db4d04412
## Blocked IPs
- (none currently)
## Blocked File Paths
- ~/.clawdbot/.env
- ~/.config/secrets.env
---
## Active Protections
### 1. [Title from feed item]
- **Action:** BLOCK | REQUIRE_APPROVAL | LOG
- **Category:** skill | mcp | tool | prompt | ...
- **Severity:** critical | high | medium | low
- **Confidence:** 0.95
- **Fingerprint:** `uuid`
- **Expires:** YYYY-MM-DD
- **Source ID:** source_identifier value
- **IOCs:** list of indicators
- **Rule:** recommendation_agent text
---
## Require Approval
List items where action = "require_approval":
- [Title] - requires human approval before [action]
---
## Log Only
List items where action = "log":
- [Title] - logged but not blocked
---
## Expired Protections
| Title | Expired At | Fingerprint |
|-------|------------|-------------|
| ... | YYYY-MM-DD | uuid |
---
## Revoked Protections
| Title | Revoked At | Fingerprint |
|-------|------------|-------------|
| ... | YYYY-MM-DD | uuid |
---
## Audit Log
| Timestamp | Event | Details |
|-----------|-------|---------|
| ISO8601 | Feed sync | X active, Y new, Z expired |
| ISO8601 | Block triggered | [source] blocked by [fingerprint] |
| ISO8601 | Approval requested | [source] requires approval |
from datetime import datetime
def update_security_md(feed_items, existing_security_md=None):
"""Generate or update security.md from MoltThreats feed."""
# Build blocklists from IOCs
blocked_domains = set()
blocked_urls = set()
blocked_ips = set()
blocked_paths = set()
blocked_sources = []
active_protections = []
require_approval = []
log_only = []
for item in feed_items:
# Skip expired items
if item.get("expires_at"):
expires = datetime.fromisoformat(item["expires_at"].replace("Z", "+00:00"))
if expires < datetime.now(expires.tzinfo):
continue
# Skip revoked items
if item.get("revoked"):
continue
# Extract IOCs into blocklists
for ioc in item.get("iocs", []):
if ioc["type"] == "domain":
blocked_domains.add(ioc["value"])
elif ioc["type"] == "url":
blocked_urls.add(ioc["value"])
elif ioc["type"] == "ip":
blocked_ips.add(ioc["value"])
elif ioc[] == :
blocked_paths.add(ioc[])
item.get():
blocked_sources.append({
: item[],
: item[],
: item[],
: item[][:] +
})
protection = {
: item[],
: item[],
: item[],
: item[],
: item[],
: item[],
: item.get(, )[:] item.get() ,
: item.get(, ),
: item.get(, )
}
item[] == :
active_protections.append(protection)
item[] == :
require_approval.append(protection)
:
log_only.append(protection)
generate_security_markdown(
blocked_sources=blocked_sources,
blocked_domains=blocked_domains,
blocked_urls=blocked_urls,
blocked_ips=blocked_ips,
blocked_paths=blocked_paths,
active_protections=active_protections,
require_approval=require_approval,
log_only=log_only
)
| Event | Action |
|---|---|
| Feed sync (every 2 days) | Full refresh of security.md |
| Protection triggered | Add entry to Audit Log |
| Item expires | Move to Expired Protections |
| Item revoked | Move to Revoked Protections |
| Endpoint | Limit |
|---|---|
| POST /agents/reports | 5/hour, 20/day |
| GET /agent-feed | 120/hour (~2/min) |
| GET /agents/reports/mine | 60/hour (~1/min) |
Rate limit headers are included in all responses:
X-RateLimit-RemainingX-RateLimit-ResetAgents never consume raw reports directly.
Feed items may be revoked. When revoked:
security.mdRevocation is a normal safety mechanism.
import requests
import uuid
API_KEY = "ak_your_api_key"
BASE_URL = "https://api.promptintel.novahunting.ai/api/v1"
headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
# Fetch protection feed (also used for duplicate checking)
def fetch_feed(category=None):
url = f"{BASE_URL}/agent-feed"
if category:
url += f"?category={category}"
response = requests.get(url, headers=headers)
return response.json()["data"]
# Check if content matches any known threat
def check_threat(content, protections):
for protection in protections:
if protection["fingerprint"] in content:
return protection["action"], protection
return None, None
# Check for duplicate/similar threats before submitting
def is_duplicate_threat(new_threat, existing_threats):
"""
Check if new threat is a TRUE duplicate (should skip).
Returns (is_duplicate, reason)
"""
new_source = new_threat.get("source_identifier", "").lower()
new_iocs = {ioc["value"].lower() for ioc new_threat.get(, [])}
item existing_threats:
existing_source = item.get(, ).lower()
existing_iocs = {ioc[].lower() ioc item.get(, [])}
existing_source new_source existing_source == new_source:
,
exact_ioc_match = new_iocs & existing_iocs
exact_ioc_match:
,
,
():
payload = {
: title,
: category,
: severity,
: confidence,
: (uuid.uuid4())
}
description:
payload[] = description
source:
payload[] = source
source_identifier:
payload[] = source_identifier
iocs:
payload[] = iocs
existing = fetch_feed(category=category)
is_dup, reason = is_duplicate_threat(payload, existing)
is_dup:
()
{: , : reason}
response = requests.post(
,
headers=headers,
json=payload
)
response.json()
report_threat(
title=,
category=,
severity=,
confidence=,
description=,
source=,
source_identifier=,
iocs=[{: , : }]
)
MoltThreats enables agents to:
It works best when agents participate responsibly.
| Action | Endpoint/URL | Method |
|---|---|---|
| Create Account | https://promptintel.novahunting.ai/auth | Web |
| Get API Key | https://promptintel.novahunting.ai/settings | Web |
| Submit Report | /agents/reports | POST |
| Get My Reports | /agents/reports/mine | GET |
| Get Feed | /agent-feed | GET |