doom

Obsolescence-risk screening: predicts if a product gets absorbed into core LLM-platform features.

Should I use this

Quality & Safety

A
Description quality
95%
Schema completeness
69%
Naming quality
93%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,090Tokens (tool definitions)
~605 BTypical response size
Moderate attention impact (0.85% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "doom": {
      "url": "https://mcp.doomscore.vc"
    }
  }
}

Remote endpoints

https://mcp.doomscore.vcstreamable-http

What it can do

Tool inventory

Tools (11)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪doom_prep

Prep Gate. Validates config + confirms the roadmap-signals KB is within the staleness threshold. Fails closed if stale. Call before assess_product.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
🟢assess_product(description, url, pitch_company_id, deck_text, mode, ...)

Assess one product's obsolescence risk. Provide exactly ONE of description/url/pitch_company_id/deck_text. Async — returns job_id; poll get_assessment. Defaults to deep mode. Optionally pass requested_by to identify the caller (shown in the activity feed).

Input Schema

{
  "type": "object",
  "properties": {
    "description": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "pitch_company_id": {
      "type": "string"
    },
    "deck_text": {
      "type": "string"
    },
    "mode": {
      "type": "string",
      "enum": [
        "quick",
        "deep"
      ],
      "default": "deep"
    },
    "requested_by": {
      "type": "string",
      "description": "Who is requesting this assessment (name/handle/agent id) — shown in the #doom-activity feed; defaults to anonymous."
    }
  },
  "additionalProperties": false
}
🟢get_assessment(job_id)

Poll an assessment job_id. Returns status + the typed assessment when complete. Hard timeout — never hangs on pending.

Input Schema

{
  "type": "object",
  "properties": {
    "job_id": {
      "type": "string"
    }
  },
  "required": [
    "job_id"
  ],
  "additionalProperties": false
}
🟢list_assessments(verdict, limit)

Recent assessments, filterable by verdict.

Input Schema

{
  "type": "object",
  "properties": {
    "verdict": {
      "type": "string"
    },
    "limit": {
      "type": "number",
      "default": 20
    }
  },
  "additionalProperties": false
}
⚪overview

Inspectable State. No input. Counts, recent activity, roadmap-signal freshness, health, last calibration run.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
⚪record_outcome(operator_key, job_id, product, actual_outcome, expected_verdict, ...)

Outcome-feedback (learning loop). Record what ACTUALLY happened to a previously-assessed product as a labeled calibration case; the weekly recalibration folds it into the gate. Operator-only (requires operator_key). Provide either job_id (links the case to that assessment + reuses its product) or product text.

Input Schema

{
  "type": "object",
  "properties": {
    "operator_key": {
      "type": "string"
    },
    "job_id": {
      "type": "string"
    },
    "product": {
      "type": "string"
    },
    "actual_outcome": {
      "type": "string",
      "enum": [
        "sherlocked",
        "survived",
        "thrived"
      ]
    },
    "expected_verdict": {
      "type": "string",
      "enum": [
        "roadkill",
        "squeezed",
        "defensible",
        "riding-the-wave"
      ]
    },
    "year_observed": {
      "type": "number"
    },
    "notes": {
      "type": "string"
    }
  },
  "required": [
    "operator_key",
    "actual_outcome",
    "expected_verdict"
  ],
  "additionalProperties": false
}
🟢list_signal_candidates(operator_key, status, limit)

KB-refresh review queue. List auto-scraped candidate roadmap signals (default: pending). Operator-only. Approve/reject with review_signal_candidate; the weekly cron signs approved ones into the live KB.

Input Schema

{
  "type": "object",
  "properties": {
    "operator_key": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "approved",
        "rejected",
        "signed"
      ]
    },
    "limit": {
      "type": "number",
      "default": 50
    }
  },
  "required": [
    "operator_key"
  ],
  "additionalProperties": false
}
⚪review_signal_candidate(operator_key, candidate_id, action)

Approve or reject a KB-refresh candidate signal. Operator-only. Approved candidates are signed (Ed25519) into the live roadmap_signals KB by the next refresh run; rejected ones are dropped. Controls what becomes grounding truth.

Input Schema

{
  "type": "object",
  "properties": {
    "operator_key": {
      "type": "string"
    },
    "candidate_id": {
      "type": "string"
    },
    "action": {
      "type": "string",
      "enum": [
        "approve",
        "reject"
      ]
    }
  },
  "required": [
    "operator_key",
    "candidate_id",
    "action"
  ],
  "additionalProperties": false
}
🟢list_kb_signals(operator_key)

List the active (signed, grounding) roadmap signals with their ids — use to find a signal_id to retire. Operator-only.

Input Schema

{
  "type": "object",
  "properties": {
    "operator_key": {
      "type": "string"
    }
  },
  "required": [
    "operator_key"
  ],
  "additionalProperties": false
}
🟢retire_signal(operator_key, signal_id, reason)

UNLEARN a KB signal that became false/obsolete (e.g. a rumored feature cancelled, or a signal no longer predictive). Soft-deletes it (active=false) so it stops grounding assessments immediately — recoverable. Operator-only. Find the id via list_kb_signals.

Input Schema

{
  "type": "object",
  "properties": {
    "operator_key": {
      "type": "string"
    },
    "signal_id": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "operator_key",
    "signal_id",
    "reason"
  ],
  "additionalProperties": false
}
⚪supersede_calibration_case(operator_key, case_id, reason)

UNLEARN a calibration case whose label turned out wrong or obsolete — retires it (active=false) so the recalibration gate stops scoring it. To correct, retire the wrong case then record_outcome the right one. Operator-only.

Input Schema

{
  "type": "object",
  "properties": {
    "operator_key": {
      "type": "string"
    },
    "case_id": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  },
  "required": [
    "operator_key",
    "case_id",
    "reason"
  ],
  "additionalProperties": false
}

Recommended Prompts

retrieve_data
Get details about [item] from doom
Expected tools: get_assessment
fetch_info
Fetch [information type] using doom
Expected tools: get_assessment
list_items
List all [items] available in doom
Expected tools: list_assessments
browse_collection
Show me the [collection] from doom
Expected tools: list_assessments
explore_workflow
List available [items], then get details for each one using doom
Expected tools: list_assessmentsget_assessment

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded11 tools
verifiedversion not recorded11 tools