{"serverId":"mcp-registry/io.github.maco144/nullcone","tools":[{"name":"check_freshness","fixed":{"name":"check_freshness","description":"\n    Validate that IOC threat intelligence is fresh enough for the named action.\n\n    Call this before any high-risk agent action to ensure the TI snapshot\n    is not stale. The check itself completes in <1ms (no network I/O).\n\n    Action → staleness tier mapping:\n      critical (≤30s):  credential_access, keychain_access, execute_shell, sudo\n      high     (≤120s): load_skill, install_package, network_call, http_request\n      medium   (≤300s): file_write, file_delete, registry_write, env_write\n","inputSchema":{"type":"object","title":"check_freshnessArguments","properties":{"action":{"type":"string","title":"Action","default":"load_skill"},"block_on_stale":{"type":"boolean","title":"Block On Stale","default":false}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":217,"tokensAfter":217},{"name":"check_prompt","fixed":{"name":"check_prompt","description":"\n    Check a prompt or text fragment for known PROMPT IOC patterns.\n\n    Uses an in-memory hash set for sub-1ms token-level querying — no\n    network calls after the cache is warmed. Slides a window of 3, 5, 8,\n    and 10 tokens across the input and checks each window's canonical\n    SHA256 against the PROMPT IOC feed.\n\n    This is the primary real-time prompt injection detection endpoint.\n    Call it on every user-supplied prompt before passing to the LLM.\n\n    Args:\n        text:      The prom","inputSchema":{"type":"object","title":"check_promptArguments","required":["text"],"properties":{"text":{"type":"string","title":"Text"},"auto_warm":{"type":"boolean","title":"Auto Warm","default":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":211,"tokensAfter":211},{"name":"check_prompt_batch","fixed":{"name":"check_prompt_batch","description":"\n    Check multiple prompts for PROMPT IOC patterns in a single call.\n\n    More efficient than calling check_prompt() in a loop — tokenization\n    overhead is amortized and the cache reference is shared.\n\n    Args:\n        texts: List of prompt strings to check\n\n    Returns:\n        One result dict per input text, in the same order.\n    ","inputSchema":{"type":"object","title":"check_prompt_batchArguments","required":["texts"],"properties":{"texts":{"type":"array","items":{"type":"string"},"title":"Texts"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":159,"tokensAfter":159},{"name":"get_new_threats","fixed":{"name":"get_new_threats","description":"\n    Drain the live push-subscription buffer of threats received since the\n    last call. Zero-polling — threats are delivered via SpacetimeDB WebSocket\n    subscription and buffered server-side.\n\n    Use this instead of poll_since() when you need sub-second latency without\n    maintaining your own WebSocket connection. The MCP server maintains the\n    subscription; you just drain the buffer on demand.\n\n    Args:\n        drain: If True (default), clear the buffer after returning. Set False\n     ","inputSchema":{"type":"object","title":"get_new_threatsArguments","properties":{"drain":{"type":"boolean","title":"Drain","default":true}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":193,"tokensAfter":193},{"name":"get_stats","fixed":{"name":"get_stats","description":"\n    Return aggregate statistics for the threat intelligence database.\n\n    Includes total signatures, known malware families, active agents,\n    and total detection events.\n    ","inputSchema":{"type":"object","title":"get_statsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":83,"tokensAfter":83},{"name":"is_ioc_revoked","fixed":{"name":"is_ioc_revoked","description":"\n    Check whether an IOC has been revoked. O(1) in-process lookup.\n\n    Use this before acting on any cached threat intelligence to ensure the\n    IOC has not been retracted since it was loaded.\n\n    Args:\n        value_hash: SHA256 of {ioc_type}:{value.lower()}.\n\n    Returns:\n        revoked: bool\n        event:   Revocation event details if revoked, null otherwise.\n    ","inputSchema":{"type":"object","title":"is_ioc_revokedArguments","required":["value_hash"],"properties":{"value_hash":{"type":"string","title":"Value Hash"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":164,"tokensAfter":164},{"name":"list_families","fixed":{"name":"list_families","description":"\n    Return all known malware families in the intelligence database.\n\n    Each entry includes the family name, description, and category. Use\n    family_threats(family_name) to retrieve the IOCs for a specific family.\n    ","inputSchema":{"type":"object","title":"list_familiesArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"list_revocations","fixed":{"name":"list_revocations","description":"\n    List recent IOC revocations, newest first.\n\n    Args:\n        limit:       Maximum number of revocations to return (default 50).\n        since_hours: Only return revocations newer than this many hours ago.\n                     0 = no time filter (return all retained).\n\n    Returns:\n        revocations: List of revocation event dicts.\n        total:       Total revocations in the registry.\n        stats:       Counts by reason.\n    ","inputSchema":{"type":"object","title":"list_revocationsArguments","properties":{"limit":{"type":"integer","title":"Limit","default":50},"since_hours":{"type":"number","title":"Since Hours","default":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"list_subscriptions","fixed":{"name":"list_subscriptions","description":"\n    List all active stateful push subscriptions on this MCP server instance.\n\n    Returns metadata for each subscription (not the buffered IOCs themselves).\n    Useful for inspecting what agents are currently subscribed and what\n    filters they have configured.\n    ","inputSchema":{"type":"object","title":"list_subscriptionsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":113,"tokensAfter":113},{"name":"lookup_ioc","fixed":{"name":"lookup_ioc","description":"\n    Look up a threat signature by its exact IOC value.\n\n    Returns the full signature record if found, including severity, family,\n    detection count, and false positive votes.\n\n    Args:\n        value: The exact IOC value to search for (e.g. \"evil.example.com\")\n    ","inputSchema":{"type":"object","title":"lookup_iocArguments","required":["value"],"properties":{"value":{"type":"string","title":"Value"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":128,"tokensAfter":128},{"name":"prompt_cache_stats","fixed":{"name":"prompt_cache_stats","description":"\n    Return PROMPT IOC cache statistics: size, hit rate, latency, refresh status.\n\n    Use this to verify the cache is warmed and healthy before relying on\n    check_prompt() for real-time detection.\n    ","inputSchema":{"type":"object","title":"prompt_cache_statsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":95,"tokensAfter":95},{"name":"registry_monitor_stats","fixed":{"name":"registry_monitor_stats","description":"\n    Return MCP registry monitoring statistics.\n\n    Shows how many tool definitions are tracked, how many have been flagged,\n    and the current drift detection rate.\n    ","inputSchema":{"type":"object","title":"registry_monitor_statsArguments","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"revoke_ioc","fixed":{"name":"revoke_ioc","description":"\n    Revoke an IOC by its value hash, pushing the expiration event to all\n    active subscriptions in real-time.\n\n    Call this when an IOC is determined to be a false positive, expired, or\n    superseded. Subscribed agents receive the revocation event on their next\n    drain_subscription() call with event_type=\"revocation\".\n\n    Args:\n        value_hash: SHA256 of {ioc_type}:{value.lower()} — same format as\n                    IOC.value_hash(). Obtainable from list_revocations() or\n            ","inputSchema":{"type":"object","title":"revoke_iocArguments","required":["value_hash"],"properties":{"reason":{"type":"string","title":"Reason","default":"false_positive"},"ioc_type":{"type":"string","title":"Ioc Type","default":""},"value_hash":{"type":"string","title":"Value Hash"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":233,"tokensAfter":233},{"name":"search_by_type","fixed":{"name":"search_by_type","description":"\n    Return threat signatures filtered by IOC type.\n\n    Useful for pulling all known-bad IPs, all malicious domains, all\n    malicious AI skill hashes, etc.\n\n    Args:\n        ioc_type:     One of: hash_md5, hash_sha1, hash_sha256, ip, ip_port,\n                      domain, url, yara, email, mutex, filepath, asn, ja3,\n                      imphash, cve, prompt, skill\n        limit:        Max results to return (1-1000). Default 50.\n        min_severity: Minimum severity (0-10). Default 0 (all).","inputSchema":{"type":"object","title":"search_by_typeArguments","required":["ioc_type"],"properties":{"limit":{"type":"integer","title":"Limit","default":50},"ioc_type":{"type":"string","title":"Ioc Type"},"min_severity":{"type":"integer","title":"Min Severity","default":0}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":231,"tokensAfter":231},{"name":"submit_batch","fixed":{"name":"submit_batch","description":"\n    Submit multiple IOCs in a single call. Preferred over looping submit_ioc\n    for bulk ingest from honeypots, sandboxes, or feed processing.\n\n    Each dict in `iocs` follows the same schema as submit_ioc parameters.\n    Required keys: ioc_type, value. All others are optional.\n\n    Returns one result dict per input IOC in the same order.\n\n    Args:\n        iocs: List of IOC dicts. Each must have 'ioc_type' and 'value'.\n              Optional: severity, confidence, context, tags, source, famil","inputSchema":{"type":"object","title":"submit_batchArguments","required":["iocs"],"properties":{"iocs":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Iocs"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"submit_ioc","fixed":{"name":"submit_ioc","description":"\n    Submit a threat indicator (IOC) to the shared intelligence network.\n\n    The IOC is automatically classified into a malware family, metadata is\n    compressed, and deduplication is handled atomically. All subscribed agents\n    see the new IOC instantly.\n\n    Args:\n        ioc_type:    IOC category. One of: hash_md5, hash_sha1, hash_sha256,\n                     ip, ip_port, domain, url, yara, email, mutex, registry,\n                     filepath, asn, ja3, imphash, cve, prompt, skill\n       ","inputSchema":{"type":"object","title":"submit_iocArguments","required":["ioc_type","value"],"properties":{"tags":{"type":"array","items":{"type":"string"},"title":"Tags","default":[]},"value":{"type":"string","title":"Value"},"source":{"type":"string","title":"Source","default":"mcp"},"context":{"type":"string","title":"Context","default":""},"ioc_type":{"type":"string","title":"Ioc Type"},"severity":{"type":"integer","title":"Severity","default":5},"confidence":{"type":"integer","title":"Confidence","default":70},"family_hint":{"type":"string","title":"Family Hint","default":""}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":317,"tokensAfter":317},{"name":"unsubscribe","fixed":{"name":"unsubscribe","description":"\n    Cancel a stateful subscription and free its buffer.\n\n    Call this when you no longer need the subscription to release memory.\n    Subscriptions also auto-expire after 1 hour of inactivity.\n\n    Args:\n        subscription_id: The ID returned by subscribe_threats()\n\n    Returns:\n        status:  \"ok\" if removed, \"not_found\" if already expired/removed\n        drained: Number of unread signatures discarded on removal\n    ","inputSchema":{"type":"object","title":"unsubscribeArguments","required":["subscription_id"],"properties":{"subscription_id":{"type":"string","title":"Subscription Id"}}},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":182,"tokensAfter":182},{"name":"validate_skill","fixed":{"name":"validate_skill","description":"\n    Synchronous SKILL IOC lookup — call this before loading or invoking any\n    MCP tool/skill to check it against the Nullcone threat feed.\n\n    This is the pre-invocation enforcement hook. Returns an allow/warn/block\n    decision based on whether the skill hash is a known-malicious indicator.\n\n    Args:\n        skill_hash:   SHA256 of the skill manifest (preferred identifier)\n        skill_name:   Human-readable skill name (for logging)\n        manifest_url: URL of the skill manifest (fallbac","inputSchema":{"type":"object","title":"validate_skillArguments","required":["skill_hash"],"properties":{"skill_hash":{"type":"string","title":"Skill Hash"},"skill_name":{"type":"string","title":"Skill Name","default":""},"manifest_url":{"type":"string","title":"Manifest Url","default":""}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235}],"toolsChanged":18,"tokensSaved":0,"todo":[{"tool":"check_freshness","params":["action","block_on_stale"]},{"tool":"check_prompt","params":["text","auto_warm"]},{"tool":"check_prompt_batch","params":["texts"]},{"tool":"drain_subscription","params":["drain","subscription_id"]},{"tool":"family_threats","params":["limit","family_name"]},{"tool":"fingerprint_tool_metadata","params":["track","registry","tool_def"]},{"tool":"get_new_threats","params":["drain"]},{"tool":"is_ioc_revoked","params":["value_hash"]},{"tool":"list_revocations","params":["limit","since_hours"]},{"tool":"lookup_ioc","params":["value"]},{"tool":"poll_since","params":["last_id","batch_size","min_severity"]},{"tool":"recent_threats","params":["limit","min_severity"]},{"tool":"report_detection","params":["action","context","signature_id"]},{"tool":"revoke_ioc","params":["reason","ioc_type","value_hash"]},{"tool":"scan_skill_content","params":["content","source_url"]},{"tool":"search_by_type","params":["limit","ioc_type","min_severity"]},{"tool":"submit_batch","params":["iocs"]},{"tool":"submit_ioc","params":["tags","value","source","context","ioc_type","severity","confidence","family_hint"]},{"tool":"subscribe_threats","params":["tags","families","ioc_types","min_severity"]},{"tool":"unsubscribe","params":["subscription_id"]},{"tool":"validate_skill","params":["skill_hash","skill_name","manifest_url"]},{"tool":"vote_false_positive","params":["reason","signature_id"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}