# Torus (pypi · torus-kg)

Stock research memory for Claude: theses, sourced claims and SEC filing alerts in a local graph

- Trust score: 65/100 (medium)
- Change this week: −15
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `torus-kg`: 65/100 (this document), [markdown](https://verifymcp.io/servers/sekhar14-torus/torus-kg.md), [page](https://verifymcp.io/servers/sekhar14-torus/torus-kg)

## Channel facts

- Registry: `pypi`
- Package: `torus-kg`
- Version: `0.4.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 28 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to sekhar14/torus).
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 12 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 77/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 3874 tokens (~84/item across 46 items; 45 tools + 1 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 88/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 57% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Torus MCP server?

Torus runs locally as a PyPI package, launched with uvx torus-kg serve. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add sekhar14-torus -- uvx torus-kg serve
```

### Cursor

```json
{
  "mcpServers": {
    "sekhar14-torus": {
      "command": "uvx",
      "args": [
        "torus-kg",
        "serve"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "sekhar14-torus": {
      "command": "uvx",
      "args": [
        "torus-kg",
        "serve"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add sekhar14-torus -- uvx torus-kg serve
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sekhar14-torus": {
      "type": "local",
      "command": [
        "uvx",
        "torus-kg",
        "serve"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sekhar14-torus --command uvx --arg torus-kg --arg serve
```

### Hermes

```yaml
mcp_servers:
  sekhar14-torus:
    command: "uvx"
    args: ["torus-kg", "serve"]
```

### Netclaw

```json
{
  "McpServers": {
    "sekhar14-torus": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "torus-kg",
        "serve"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add sekhar14-torus -t stdio -c uvx -a torus-kg serve
```

### Other

```json
{
  "mcpServers": {
    "sekhar14-torus": {
      "command": "uvx",
      "args": [
        "torus-kg",
        "serve"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 65, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-03 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-02 (score 65, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-01 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-31 (score 65, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-29 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-26 (score 65, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-25 (score 80, +15)

- [security improvement] Malware scan: unverified → pass

## MCP tools (45)

### `brief` (~66 tokens)

One-call briefing at the start of a turn: spots known companies in `text`,
recalls prior theses, claims, open alerts and ruled-out ideas about them,
and returns the graph digest.

Input parameters:

- `text` (string): The user's question or company names (leave blank for the digest only)

Output parameters:

- `context` (string): Prior theses, claims and open alerts on those companies (markdown)
- `detected_entities` (array): Known companies spotted in `text`, as 'Name (id)'
- `digest` (string): Graph overview: open alerts, theses at risk, 7-day changes, audit summary
- `recall`

### `recall` (~79 tokens)

Prior theses, claims and rejected hypotheses about entities and/or a question.

Call this before starting research so you build on earlier work.

Input parameters:

- `as_of`: Show what was believed at this time
- `entities` (array): Entity refs to focus on
- `limit` (integer)
- `query`: Free-text question; entities in it are detected

Output parameters:

- `alerts` (array)
- `as_of`
- `claims` (array)
- `entities` (array)
- `query`
- `rejected_hypotheses` (array)
- `theses` (array)
- `total_claims` (integer)

### `get_entity` (~37 tokens)

Resolve an entity and list its current relations.

Input parameters:

- `entity` (string, required): Ticker, CIK, company name, canonical key or id

Output parameters:

- `entity`
- `relations` (array)
- `resolved_by` (string)

### `search` (~40 tokens)

Keyword search over current claims, evidence and theses.

Input parameters:

- `limit` (integer)
- `query` (string, required)
- `types` (array): Object types

Output parameters:

- `hits` (array)

### `timeline` (~47 tokens)

Chronological claims and thesis changes for one entity.

Input parameters:

- `entity` (string, required): Ticker, CIK, company name, canonical key or id
- `since`
- `until`

Output parameters:

- `changes` (array)
- `entity_id`
- `since`
- `until`

### `what_changed` (~42 tokens)

Everything recorded or revised across the graph since a point in time.

Input parameters:

- `since` (string, required): Start of the window (UTC if no zone)
- `until`

Output parameters:

- `changes` (array)
- `entity_id`
- `since`
- `until`

### `upsert_entity` (~76 tokens)

Create an entity (or merge into the one with the same canonical_key).

Input parameters:

- `aliases` (array): Other names, abbreviations
- `canonical_key`: Stable id such as cik:0001045810; merges on match
- `kind`
- `name` (string, required)
- `tickers` (array)

Output parameters:

- `aliases` (array)
- `attrs` (object)
- `canonical_key`
- `created_at` (string)
- `id` (string)
- `kind`
- `name` (string)
- `updated_at` (string)

### `merge_entities` (~70 tokens)

Fold a duplicate entity into the one to keep; its links move over.

Input parameters:

- `duplicate` (string, required): Ticker, CIK, company name, canonical key or id
- `keep` (string, required): Ticker, CIK, company name, canonical key or id
- `reason` (string, required)

Output parameters:

- `aliases` (array)
- `attrs` (object)
- `canonical_key`
- `created_at` (string)
- `id` (string)
- `kind`
- `name` (string)
- `updated_at` (string)

### `record_evidence` (~67 tokens)

Record a source. Re-recording the same URI returns the existing record.

Input parameters:

- `kind`
- `published_at`
- `publisher`
- `quote`: Short verbatim excerpt supporting claims
- `title`
- `uri` (string, required): URL or document path

Output parameters:

- `content_hash`
- `id` (string)
- `kind`
- `published_at`
- `publisher`
- `quote`
- `recorded_at` (string)
- `retrieved_at` (string)
- `source_path`
- `title`
- `uri` (string)

### `record_claim` (~123 tokens)

Record a finding. Facts and metrics need evidence_ids.

Input parameters:

- `claim_type` (required)
- `confidence` (number, required): 0 = guess, 1 = certain
- `contradicting_evidence_ids` (array)
- `derived_from` (array): Claim ids an inference builds on
- `entities` (array): Entities the claim is about
- `evidence_ids` (array)
- `mentioned` (array): Entities only mentioned in passing
- `text` (string, required): One atomic, self-contained statement
- `valid_from`
- `valid_to`

Output parameters:

- `change_reason`
- `claim_type`
- `confidence` (number)
- `derived_from` (array)
- `entities` (array)
- `evidence` (array)
- `id` (string)
- `lineage_id` (string)
- `recorded_at` (string)
- `session_id`
- `status`
- `superseded_at`
- `supersedes_id`
- `text` (string)
- `valid_from`
- `valid_to`

### `supersede_claim` (~64 tokens)

Correct a claim: the old version stays in history, the new one is current.

Input parameters:

- `claim_id` (string, required)
- `confidence`
- `evidence_ids`: Replaces the evidence list if given
- `reason` (string, required)
- `text`

Output parameters:

- `change_reason`
- `claim_type`
- `confidence` (number)
- `derived_from` (array)
- `entities` (array)
- `evidence` (array)
- `id` (string)
- `lineage_id` (string)
- `recorded_at` (string)
- `session_id`
- `status`
- `superseded_at`
- `supersedes_id`
- `text` (string)
- `valid_from`
- `valid_to`

### `retract_claim` (~38 tokens)

Withdraw a claim that turned out to be wrong (kept in history).

Input parameters:

- `claim_id` (string, required)
- `reason` (string, required)

Output parameters:

- `change_reason`
- `claim_type`
- `confidence` (number)
- `derived_from` (array)
- `entities` (array)
- `evidence` (array)
- `id` (string)
- `lineage_id` (string)
- `recorded_at` (string)
- `session_id`
- `status`
- `superseded_at`
- `supersedes_id`
- `text` (string)
- `valid_from`
- `valid_to`

### `record_relation` (~130 tokens)

Link two entities, e.g. TSMC SUPPLIES NVIDIA. Re-recording an existing
link updates it (confidence, backing claim, dates) instead of duplicating it.

Input parameters:

- `claim_id`: Claim that backs this link
- `confidence` (number, required): 0 = guess, 1 = certain
- `rel` (required)
- `source` (string, required): Ticker, CIK, company name, canonical key or id
- `target` (string, required): Ticker, CIK, company name, canonical key or id
- `valid_from`
- `valid_to`

Output parameters:

- `claim_id`
- `confidence` (number)
- `dst_id` (string)
- `id` (string)
- `lineage_id` (string)
- `recorded_at` (string)
- `rel`
- `source` (string)
- `src_id` (string)
- `superseded_at`
- `supersedes_id`
- `valid_from`
- `valid_to`

### `record_thesis` (~122 tokens)

Record a conclusion and the claims it rests on.

Input parameters:

- `assumption_claim_ids` (array): Claims the thesis depends on
- `confidence` (number, required): 0 = guess, 1 = certain
- `horizon`: e.g. 12m, FY27
- `risk_claim_ids` (array)
- `stance` (required)
- `statement` (string, required)
- `subject`: Main entity of the thesis
- `supporting_claim_ids` (array)
- `title` (string, required)
- `triggers` (array): Conditions that would invalidate it

Output parameters:

- `alert_threshold`
- `benchmark`
- `claims` (array)
- `confidence` (number)
- `created_at` (string)
- `entry_at`
- `entry_price`
- `horizon`
- `horizon_date`
- `id` (string)
- `instrument`
- `session_id`
- `stance`
- `statement` (string)
- `status`
- `subject_entity_id`
- `title` (string)
- `triggers` (array)
- `updated_at` (string)

### `update_thesis` (~242 tokens)

Revise a thesis: status, confidence, the claims it rests on, and its
triggers, in one atomic step. Everything is kept in its history.

Also tunes its alerts: a threshold of its own, and mutes (e.g. no alerts
for a supplier's routine 10-Qs).

Input parameters:

- `add_claims` (array): Claims to link (e.g. newer, better-sourced assumptions)
- `add_mutes` (array): Stop alerts from matching events
- `add_triggers` (array): New conditions that would invalidate it
- `alert_threshold`: Minimum alert score for this thesis
- `confidence`
- `horizon`: New horizon, e.g. 12m or FY2027 (counted from now)
- `reason` (string, required): Why; kept in the thesis history
- `remove_claim_ids` (array): Claims the thesis no longer rests on
- `remove_mute_ids` (array)
- `remove_trigger_ids` (array)
- `reset_alert_threshold` (boolean): Go back to the global alert threshold
- `status`
- `thesis_id` (string, required)

Output parameters:

- `alert_threshold`
- `benchmark`
- `claims` (array)
- `confidence` (number)
- `created_at` (string)
- `entry_at`
- `entry_price`
- `horizon`
- `horizon_date`
- `id` (string)
- `instrument`
- `session_id`
- `stance`
- `statement` (string)
- `status`
- `subject_entity_id`
- `title` (string)
- `triggers` (array)
- `updated_at` (string)

### `record_rejected_hypothesis` (~56 tokens)

Record an idea that was checked and ruled out, so it isn't re-explored.

Input parameters:

- `entities` (array)
- `reason` (string, required): Why it was ruled out
- `text` (string, required)

Output parameters:

- `entity_ids` (array)
- `id` (string)
- `reason` (string)
- `recorded_at` (string)
- `session_id`
- `text` (string)
- `withdrawn_at`

### `add_event` (~117 tokens)

Record an event and raise alerts on theses it may affect (through the
companies involved and their suppliers, customers and competitors).

Input parameters:

- `entities` (array, required): Entities the event is about
- `kind`
- `materiality`: How much it matters (default 1.0)
- `occurred_at` (string, required): When it happened (UTC if no zone)
- `summary`
- `title` (string, required): What happened, e.g. 'TSMC 8-K: CoWoS ramp delayed'
- `uri`

Output parameters:

- `alerts` (array)
- `created` (boolean): False if this event was already recorded
- `event`

### `impact` (~44 tokens)

Dry run: which theses would an event on these entities affect, and why?
Records nothing.

Input parameters:

- `entities` (array, required): Entities a hypothetical event touches
- `occurred_at`

Output parameters:

- `hits` (array)

### `list_alerts` (~71 tokens)

Alerts raised by events on theses, highest score first. Each shows how
its score was built: graph score x event materiality x (1 + trigger match).

Input parameters:

- `grouped` (boolean): Also group the alerts by thesis, to judge each once
- `status`
- `thesis_id`

Output parameters:

- `alerts` (array)
- `groups` (array): The same alerts grouped by thesis (when grouped=true)

### `alert_stats` (~45 tokens)

How useful alerts have been: verdicts, and the share judged related
(precision) by source, form, hops and materiality.

Input parameters:

- `since`: Only alerts raised since

Output parameters:

- `alerts` (integer)
- `by_form` (array)
- `by_hops` (array)
- `by_materiality` (array)
- `by_source` (array)
- `by_verdict` (object)
- `judged` (integer)
- `open` (integer)
- `precision`
- `unrelated` (integer)

### `resolve_alert` (~96 tokens)

Judge an alert after reading the event and the thesis's claims; the
thesis is updated accordingly and the change logged with the alert.

Input parameters:

- `alert_id` (string, required)
- `confidence`: New thesis confidence
- `rationale` (string, required): Why, citing the event and evidence
- `status`: Override the default status change
- `verdict` (required): supports | weakens (active -> at_risk) | breaks | unrelated

Output parameters:

- `alert`
- `event`
- `thesis_confidence` (number)
- `thesis_status`
- `thesis_title` (string)

### `neighbors` (~90 tokens)

The entity's neighbourhood: companies within `hops` links (suppliers,
customers, competitors...), the links among them, and theses about them.

Input parameters:

- `entity` (string, required): Ticker, CIK, company name, canonical key or id
- `hops` (integer)
- `relations` (array): Only these relation types (default all)
- `valid_at`: Only links true at this date

Output parameters:

- `edges` (array)
- `focus` (array)
- `nodes` (array)

### `find_paths` (~97 tokens)

How two entities are connected, e.g. ASML -SUPPLIES-> TSMC -SUPPLIES-> AMD.
Shortest and most confident paths first.

Input parameters:

- `max_hops` (integer)
- `relations` (array)
- `source` (string, required): Ticker, CIK, company name, canonical key or id
- `target` (string, required): Ticker, CIK, company name, canonical key or id

Output parameters:

- `paths` (array)
- `source` (string)
- `target` (string)
- `texts` (array)

### `watch` (~61 tokens)

Watch a company: its new SEC filings become events (on the next
\`torus watch run`). Subjects of open theses are watched automatically.

Input parameters:

- `entity` (string, required): Ticker, CIK, company name, canonical key or id
- `note`

Output parameters:

- `entities` (array)
- `feeds` (array)

### `unwatch` (~37 tokens)

Remove a company from the explicit watchlist.

Input parameters:

- `entity` (string, required): Ticker, CIK, company name, canonical key or id

Output parameters:

- `entities` (array)
- `feeds` (array)

### `list_watches` (~25 tokens)

What the watchers follow: the watchlist, open-thesis entities, feeds.

Output parameters:

- `entities` (array)
- `feeds` (array)

### `next_distillation` (~73 tokens)

Lease the oldest research session waiting to be distilled into the graph.

Returns its transcript digest, what was already recorded (don't duplicate
it), the sources the agent looked at, and existing theses on its entities.
Until `complete_distillation`, new records are attributed to that session.

Input parameters:

- `transcript_chars` (integer)

Output parameters:

- `job`
- `remaining` (integer): Jobs still waiting after this one

### `complete_distillation` (~68 tokens)

Finish a leased distillation job (or hand it back if it failed).

Input parameters:

- `failed` (boolean): True if the job couldn't be done; it will be retried
- `queue_id` (string, required)
- `summary` (string, required): What was added, in a sentence or two

Output parameters:

- `queue_id` (string)
- `remaining` (integer)
- `status`

### `onboard` (~81 tokens)

Start covering companies: add them, watch their filings, suggest starter
packs, and queue a mapping job for each (run by the company-mapper subagent,
which reads their annual reports and records suppliers, customers and
competitors).

Input parameters:

- `tickers` (array, required): Tickers or company names to cover
- `watch` (boolean): Watch their SEC filings

Output parameters:

- `companies` (array)
- `mapping_jobs_queued` (integer)
- `suggested_packs` (array)
- `unresolved` (array)

### `seed_starter_pack` (~47 tokens)

Add a curated starter pack of companies and supplier/competitor links.
Never overrides links research recorded.

Input parameters:

- `pack` (string, required): semis, software, banks, energy or pharma

Output parameters:

- `companies_added` (integer)
- `links_added` (integer)
- `links_already_present` (integer)
- `pack` (string)

### `next_mapping` (~36 tokens)

Lease the next onboarded company to map from its annual report. Until
\`complete_mapping`, links you record are marked as curator links.

Output parameters:

- `job`
- `remaining` (integer): Jobs still waiting after this one

### `complete_mapping` (~64 tokens)

Finish a leased mapping job (or hand it back if it failed).

Input parameters:

- `failed` (boolean): True if it couldn't be done; it will be retried
- `queue_id` (string, required)
- `summary` (string, required): Links and claims added, in a sentence

Output parameters:

- `queue_id` (string)
- `remaining` (integer)
- `status`

### `recent_records` (~38 tokens)

What the most recent research sessions recorded, newest first, and which
records can still be undone.

Input parameters:

- `sessions` (integer): Most recent sessions

Output parameters:

- `sessions` (array)

### `undo_records` (~84 tokens)

Revert records the user doesn't want: claims are retracted (corrections go
back to the earlier version), theses the session created are archived, links
retired, ruled-out ideas withdrawn. History keeps everything.

Input parameters:

- `reason` (string)
- `records` (array, required): What to revert
- `session_id` (string, required): The session, from recent_records

Output parameters:

- `outcomes` (array)

### `whatif` (~93 tokens)

What if this happened? Which theses would it reach, through which links,
and would it raise alerts. Records nothing.

Input parameters:

- `description` (string, required): The hypothetical, e.g. 'TSMC fab outage halts CoWoS 3 months'
- `entities` (array, required): Companies the event would be about
- `materiality`: How much it matters (default: from the wording)
- `occurred_at`

Output parameters:

- `description` (string)
- `hits` (array)
- `materiality` (number)
- `materiality_reason` (string)
- `threshold` (number)

### `thesis_memo` (~64 tokens)

Write a thesis up as a memo (Markdown and a standalone HTML page): what it
rests on with sources and quotes, triggers, events and verdicts, ruled-out
ideas and history. Saved under TORUS_HOME/memos.

Input parameters:

- `thesis_id` (string, required)

Output parameters:

- `html_path` (string)
- `markdown` (string)
- `markdown_path` (string)

### `open_explorer` (~72 tokens)

Write the interactive graph explorer HTML file (under TORUS_HOME/explorer.html)
and open it in the user's browser.

Input parameters:

- `focus` (array): Companies to centre on (default: whole graph)
- `hops` (integer)
- `open_browser` (boolean): Open the HTML file in the default browser

Output parameters:

- `companies` (integer)
- `events` (integer)
- `links` (integer)
- `opened` (boolean)
- `path` (string)
- `theses` (integer)

### `thesis_weak_points` (~63 tokens)

Where a thesis is weakest: thin or expiring assumptions, strong supplier or
customer dependencies it never mentions, triggers that can't fire on events,
and opposing views already in the graph. Input for /torus:challenge.

Input parameters:

- `thesis_id` (string, required)

Output parameters:

- `assumptions` (array)
- `confidence` (number)
- `opposing_views` (array)
- `retracted_links` (integer)
- `stance`
- `statement` (string)
- `subject`
- `text_only_triggers` (array)
- `thesis_id` (string)
- `title` (string)
- `unwatched_dependencies` (array)

### `track_thesis` (~107 tokens)

Put a thesis on the scorecard: its return against a benchmark from an entry
price and date, in the direction of its stance.

Input parameters:

- `benchmark`: Default: SPY
- `entry_date`: Default: when the thesis was recorded
- `entry_price`: Default: the close on the entry date
- `stop` (boolean): Stop tracking this thesis
- `thesis_id` (string, required)
- `ticker`: Instrument to track (default: the subject's ticker)

Output parameters:

- `alert_threshold`
- `benchmark`
- `claims` (array)
- `confidence` (number)
- `created_at` (string)
- `entry_at`
- `entry_price`
- `horizon`
- `horizon_date`
- `id` (string)
- `instrument`
- `session_id`
- `stance`
- `statement` (string)
- `status`
- `subject_entity_id`
- `title` (string)
- `triggers` (array)
- `updated_at` (string)

### `scorecard` (~51 tokens)

How tracked theses have done against their benchmarks, their outcomes, and
calibration: did the user's confidence match how often they were right?

Input parameters:

- `refresh` (boolean): Fetch the latest prices first (Yahoo Finance)

Output parameters:

- `calibration`
- `generated_at` (string)
- `markdown` (string)
- `theses` (array)

### `set_thesis_outcome` (~53 tokens)

Record whether a thesis turned out right, wrong or unclear (overrides the
automatic outcome; used for calibration).

Input parameters:

- `note`: Why
- `outcome` (required)
- `thesis_id` (string, required)

Output parameters:

- `decided_at` (string)
- `method` (string)
- `note`
- `outcome`
- `stance_return`
- `thesis_id` (string)

### `audit` (~63 tokens)

Health check of the research graph: expired or thinly sourced assumptions,
theses past their horizon or gone stale, claims that may conflict,
unconfirmed starter links, orphans. Each finding suggests a fix.

Input parameters:

- `stale_days` (integer): Flag open theses unchanged this long

Output parameters:

- `counts` (object)
- `findings` (array)
- `generated_at` (string)
- `markdown` (string)

### `digest` (~63 tokens)

What happened in the research over the last days: new alerts by thesis,
thesis status and confidence changes, theses coming due, audit counts,
scorecard moves and activity. ``markdown`` is ready to show.

Input parameters:

- `since_days` (integer): How far back to look

Output parameters:

- `activity` (object)
- `audit_counts` (object)
- `coming_due` (array)
- `markdown` (string)
- `moves` (array)
- `new_alerts` (array)
- `older_open_alerts` (integer)
- `since` (string)
- `thesis_changes` (array)
- `top_findings` (array)
- `until` (string)

### `filing_diff` (~101 tokens)

What changed in a section of a company's latest filing against the previous
one of the same form: new, dropped and reworded sentences.

Input parameters:

- `company` (string, required): Ticker, CIK, company name, canonical key or id
- `form` (string): 10-K, 10-Q or 20-F
- `max_items` (integer)
- `section` (string): e.g. risk_factors, business, mdna

Output parameters:

- `added` (array): New sentences
- `changed` (array): Reworded sentences, most rewritten first
- `company` (string)
- `latest`
- `previous`
- `removed` (array): Dropped sentences
- `section` (string)
- `total_added` (integer)
- `total_changed` (integer)
- `total_removed` (integer)
- `unchanged` (integer)

### `filing_text` (~151 tokens)

Read a company's SEC filing as text, by section, from EDGAR (cached).
Long sections come in pages: pass `next_offset` back as `offset`.

Input parameters:

- `company` (string, required): Ticker, CIK, company name, canonical key or id
- `form` (string): 10-K, 10-Q, 20-F, 8-K...
- `index` (integer): 0 = latest, 1 = previous
- `max_chars` (integer)
- `offset` (integer)
- `section`: business, risk_factors, mdna, legal, market_risk, financials, or an item id like 1A; omit for the whole document

Output parameters:

- `accession` (string)
- `cik` (string)
- `company` (string)
- `filed` (string)
- `form` (string)
- `next_offset`: Pass as offset to read on; None at the end
- `offset` (integer)
- `section`
- `sections` (array): Sections this filing can be read by
- `text` (string)
- `total_chars` (integer)
- `url` (string): Cite this as the evidence URI (kind: filing)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/sekhar14-torus/torus-kg#diagnostics

## Score history

- 2026-11-05: 65
- 2026-11-04: 80
- 2026-11-03: 80
- 2026-11-02: 65
- 2026-11-01: 80
- 2026-10-31: 65
- 2026-10-30: 80
- 2026-10-29: 80
- 2026-10-28: 65
- 2026-10-27: 65
- 2026-10-26: 65
- 2026-10-25: 80
- 2026-10-24: 65
- 2026-10-23: 65

## Common questions

### What is the Torus MCP server?

Torus is an MCP server listed in the public MCP registry as io.github.sekhar14/torus. Stock research memory for Claude: theses, sourced claims and SEC filing alerts in a local graph. This page covers its PyPI package (torus-kg).

### Is the Torus MCP server safe to use?

Torus scores 65 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Torus MCP server expose?

Torus exposes 45 tools: brief, recall, get_entity, search, timeline, and 40 more. Their descriptions and schemas cost roughly 3,354 tokens of context every time the server is loaded.

### Is the Torus MCP server still maintained?

Torus is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the Torus MCP server under?

Torus declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the Torus MCP server?

VerifyMCP ran 14 checks on Torus, covering Known CVEs, Install scripts, Dependency health, Source repository and 10 more. 2 items could not be completed, a gap on our side rather than a finding about Torus: Malware scan and Stability. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- PyPI project: https://pypi.org/project/torus-kg/
- Socket report: https://socket.dev/pypi/package/torus-kg
- Repository: https://github.com/sekhar14/torus
- Changelog RSS feed: https://verifymcp.io/servers/sekhar14-torus/torus-kg.xml
- Changelog JSON feed: https://verifymcp.io/servers/sekhar14-torus/torus-kg/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/sekhar14-torus/torus-kg.json
- HTML version of this page: https://verifymcp.io/servers/sekhar14-torus/torus-kg
