Skip to main content
Glama

numenews

coverage python license

MCP server and one-shot CLI that reads the news numerologically.

numenews fetches news from several public APIs, extracts numbers, dates and names, computes numerology (digit reduction, master numbers 11/22/33, gematria), finds patterns with hybrid vector search in Qdrant, and builds a daily forecast — while keeping every number activation as long-term memory.

It is a pet project that takes its subject seriously and itself not very: the numerology layer is pure, deterministic and property-tested, the retrieval is a real hybrid search over a real vector store, and the default demo path needs no API keys at all. v0.1.0 is out and both interfaces work.

What it does

  • Nine MCP tools over stdio, so Claude Desktop, Cursor or any MCP host can fetch news, extract numbers, find patterns, build a forecast and query the memory.

  • Six one-shot commands — today, forecast, history, search, patterns, mcp — each printing one JSON document on stdout and nothing else, so they pipe straight into jq.

  • Five news sources (GDELT, NewsAPI, GNews, Mediastack, Currents) behind one NewsSource Protocol, with an aggregator that degrades gracefully when a feed is down or rate-limited, and an RFC 9111 cache so a repeated run does not re-hit the network.

  • Local embeddings only — two bge models through fastembed. No embedding API, ever.

  • Six Qdrant collections with semantic and hybrid (reciprocal-rank-fusion) search, and payload indexes that make filtered queries cheap.

  • Four pydantic-ai agents — extract numbers, find patterns, build the forecast, summarise old news — every one returning a validated Pydantic model rather than free-form JSON.

  • A pipeline that composes them: ingest → analyze → forecast, with a sliding window over the last week and a digest for everything older.

  • Long-term memory: every number activation is logged, folded into a per-day frequency, and fed back into the forecast over a thirty-day window.

  • A ragas evaluation of the retrieval path, isolated in its own environment so LangChain never reaches the runtime.

Related MCP server: Google News MCP Agent

Quick start

uv sync --all-extras        # install the environment (Python 3.14+, uv)
make dev                    # start Qdrant (Docker Compose) and wait until healthy
cp .env.example .env        # optional: the default demo path needs no API keys
make lint && make test      # ruff + mypy --strict, pytest with coverage

Qdrant's dashboard is then at http://localhost:6333/dashboard.

Over the CLI

today needs Qdrant and an LLM endpoint; history, search and patterns need Qdrant only. The full command surface is in docs/USER_FLOW.md.

uv run numenews today | jq .dominant_number   # ingest the window and read the day
uv run numenews forecast --date tomorrow      # a stored/derived reading, no fetch
uv run numenews history --number 11 --days 30 # when 11 was active
uv run numenews search -q "число 7 и деньги"  # hybrid search over stored news
uv run numenews patterns --min-strength 0.7   # the strong patterns, strongest first
uv run numenews --help

Over MCP

The server starts without Qdrant or an API key and builds each dependency on the first tool call that needs it, so it can be attached to a host right away. Cursor's project config ships in .cursor/mcp.json; Claude Desktop takes the same command in its own claude_desktop_config.json. The nine tools, their examples and the failure semantics are in docs/MCP_TOOLS.md.

make mcp                                            # serve stdio (Ctrl-D to stop)
uv run pytest tests/integration/test_mcp_stdio.py   # the same handshake, as a test

What the output looks like

The pipeline builds this, the CLI serializes it, and stdout is always JSON:

{
  "date": "2026-09-21",
  "dominant_number": 11,
  "master_active": true,
  "patterns": [
    {
      "id": "8bb3a3e4-53cd-5333-92ab-5309c63d3b78",
      "type": "resonance",
      "numbers": [11, 22],
      "news_ids": ["b371bc46-7b4b-5b38-92db-cdf94a550f33"],
      "strength": 0.87,
      "interpretation": "Числа 11 и 22 резонируют в новостях о технологиях",
      "discovered_at": "2026-09-21T12:00:00Z"
    }
  ],
  "forecast": "День благоприятен для начинаний, связанных с коммуникацией",
  "advice": "Избегайте конфликтов — число 11 усиливает эмоции",
  "warnings": ["Возможны повторяющиеся события из прошлого"]
}

How OpenSpec is used here

Specs are the source of truth for behaviour, and they live in the repository next to the code.

  • openspec/specs/ holds what the project ships today, one capability per directory. Two exist so far: mcp-surface (the nine tools — inputs, return shapes, error reporting) and cli-surface (the six commands — JSON-only stdout, the --date grammar, exit codes, idempotency). The internals are not specified yet; they get a capability the first time a change really touches them.

  • openspec/changes/ holds work in flight: a proposal, the spec deltas it would make, a design when the approach needs deciding, and a task list.

  • The loop is propose → review → implement → archive. openspec list shows what is active, openspec validate "<name>" --strict checks a change, and archiving merges its spec deltas into openspec/specs/.

  • New work starts as a change, not as an edit. An idea that is not a change yet lives in a GitHub issue.

docs/MCP_TOOLS.md and docs/USER_FLOW.md remain the narrative companions to the two specs: the specs say what the behaviour must be, those documents show how to use it.

Project layout

src/numenews/
├── config.py       # pydantic-settings
├── logging.py      # structlog + contextvars correlation
├── models/         # Pydantic v2 domain models
├── numerology/     # pure logic: reduction, master numbers, gematria (no I/O)
├── news/           # GDELT, NewsAPI, GNews, Mediastack, Currents behind one Protocol
├── embeddings/     # fastembed wrapper
├── vector/         # Qdrant client, collections, hybrid search
├── agents/         # pydantic-ai: extract, pattern, forecast, summarize
├── pipeline/       # the RAG chain, the sliding window, step timings
├── mcp/            # MCP server and 9 tools
└── cli/            # one-shot Typer commands

openspec/
├── specs/          # behaviour that ships, one capability per directory
└── changes/        # proposals in flight

Layer

Choice

Package manager

uv, single package, src/ layout

Types

pydantic v2 + mypy --strict

Vector store

Qdrant (Docker Compose; :memory: in tests)

Embeddings

fastembed (bge-small-en-v1.5 384d, bge-base-en-v1.5 768d) — local, no API keys

LLM orchestration

pydantic-ai with structured output

MCP server

Python mcp SDK v2 (MCPServer), nine tools over stdio

HTTP

httpx + hishel (RFC 9111 cache) + tenacity

Config / logs

pydantic-settings / structlog (stderr, JSON in prod)

CLI

Typer + Rich, JSON-only stdout

Tests

pytest + pytest-asyncio + respx + hypothesis + ragas (eval)

Commands

make help          # list every target
make install       # uv sync --all-extras
make lint          # ruff check + format check + mypy
make test          # unit + integration (with coverage)
make test-eval     # ragas evaluation in .venv-eval (needs an LLM endpoint; see docs/EVAL.md)
make eval-env      # build .venv-eval (ragas; ADR 0013)
make dev           # docker compose up -d --wait
make dev-down      # stop Qdrant, keep the volume
make clean         # stop Qdrant, delete volumes and caches
make run           # sample one-shot CLI run (needs Qdrant and an LLM endpoint)
make mcp           # start the MCP server (stdio)

make test runs the unit and integration suites with coverage and then checks the per-layer floors (numerology ≥ 95 %, pipeline/agents ≥ 80 %, vector/news ≥ 70 %); the levels, the doubles and the dated coverage snapshot are in docs/TESTING.md.

Documentation

Contributing

It is a solo pet project, so there is no ceremony — but there is a workflow, and CONTRIBUTING.md spells it out. The short version: work starts as an OpenSpec change rather than a direct edit, one tasks.md item is one atomic task, and make lint && make test has to be green. Issues and ideas are welcome; there is no CI, on purpose, which is why the commands are the gate.

License

MIT

Available Tools

9 tools
build_forecastA

Return the numerological reading for a calendar day, saving it for later calls.

A day that was already read answers from Qdrant without running a model. Otherwise the reading is assembled from the last seven days of stored news (their dominant number, whether a master number is active, and the patterns among them) plus the activations of exactly those numbers over the pipeline's thirty-day memory window, and then written back. Needs Qdrant and an LLM endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateYes
adviceYes
forecastYes
patternsNo
warningsNo
master_activeYes
dominant_numberYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does reasonably well: it discloses the caching short-circuit, the write-back side effect, the data dependencies (last seven days of news, dominant number, master-number flag, thirty-day activation window), and required infrastructure (Qdrant and an LLM endpoint). It omits failure modes and whether the write-back is idempotent or overwrites prior readings.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and caching rule in the first two sentences, then supporting detail. The long parenthetical listing data sources is dense but earns its place; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the description covers inputs, side effects, caching, and infrastructure prerequisites. What remains thin is the exact trigger conditions relative to sibling tools, which an agent might still have to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One required parameter 'day' with 0% schema description coverage; the schema only gives a date format. The description adds 'calendar day', which confirms the semantics but adds little beyond what the name and format already imply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Return the numerological reading for a calendar day') and immediately distinguishes itself from siblings like compute_numerology by stating it saves the result for later calls and assembles from stored news/activations rather than computing a bare number.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the caching rule ('A day that was already read answers from Qdrant without running a model'), which tells the agent this is the read-through entry point. However, it never explicitly says when to prefer this over compute_numerology, get_history, or find_patterns, so routing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_master_numbersA

Report the master numbers (11, 22, 33) among a list of numbers.

master_numbers lists the distinct master numbers found, ascending, and count how many occurrences there were: [11, 11] gives has_master=True, master_numbers=(11,) and count=2. An empty list is a valid input and reports no master number. Pure logic: no configuration, no service.

ParametersJSON Schema
NameRequiredDescriptionDefault
numbersYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYes
has_masterYes
master_numbersYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose that this is pure logic with no configuration, no service, and therefore no side effects or side-channel dependencies. The empty-list behavior and the deterministic counting semantics (duplicates counted) are also stated, giving a fairly complete behavioral picture for a pure function.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose in one sentence, then adds the output-shape example and edge case. The example is dense but earns its place by pinning down counting semantics; no filler sentences are present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, yet the description still usefully illustrates the result shape and the duplicate-counting rule. Combined with the pure-logic note and empty-input case, it covers everything needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter is documented only as 'array of integers' in the schema, so the description must compensate. It does so meaningfully by specifying that duplicates are counted (the [11,11] -> count=2 example) and that an empty array is accepted, clarifying semantics the schema omits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (report) and resource (master numbers 11, 22, 33) and defines the domain concept, which separates it from generic siblings like compute_numerology or find_patterns. However, it never explicitly contrasts itself with those alternatives, so an agent must infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to pick this tool over siblings such as compute_numerology or find_patterns, nor any stated preconditions. The only usage hint is that an empty list is valid input, which is an edge case rather than selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_numerologyA

Reduce a text to its numerological value.

Returns the raw gematria sum, the digit-reduced value (11, 22 and 33 are master numbers and are not reduced further), whether the value is master, and the rendered calculation steps. Pure logic: no Qdrant, no model, no configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
valueYes
gematriaYes
breakdownYes
is_masterYes

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does so reasonably: it declares the tool pure logic with no Qdrant, model, or configuration dependencies, implying a deterministic, side-effect-free computation. It also previews the output shape (raw sum, reduced value, master flag, steps). It omits any note on edge cases (e.g., non-letter characters) but covers the key behavioral profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by output and behavioral notes. It is efficient, though the detailed enumeration of return values is partly redundant given that an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, side-effect-free computation with an output schema, the description gives enough to call it correctly: input intent, return contents, and absence of external dependencies. Missing only index/usecase routing among siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One string parameter with 0% schema description coverage, so the schema tells the agent nothing. The description implies the input is text to be reduced, which is essentially self-evident from the parameter name, and adds no format or handling details (case, digits, symbols). Minimum-viable rather than compensating for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('reduce a text to its numerological value') with the core transformation named up front, so the agent knows exactly what the tool computes. It does not, however, distinguish itself from the closely related sibling check_master_numbers, which also deals with master numbers.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit statement of when to use this tool versus alternatives. 'Pure logic: no Qdrant, no model, no configuration' hints at a contrast with query_qdrant, but no alternative is named and no selection condition is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_numbersA

Read the numbers, dates and symbols out of a text with the extraction agent.

The model's reading is combined with the deterministic regex pass, so a mention the model formats differently ("eleven" beside "11") is still found, and a model that cannot answer at all degrades to the regex reading instead of failing. sources says which strategies contributed. Needs an LLM endpoint (OPENAI_API_KEY or OPENAI_BASE_URL).

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
numbersNo
sourcesNo
symbolsNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does so well: it discloses the model+regex combination, the graceful degradation to regex on model failure, that ``sources`` reports which strategies contributed, and the LLM-endpoint prerequisite. It stops short of return format/pagination details, but the failure and dependency behavior is unusually well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose, then elaborates on the combination/degradation behavior and the endpoint requirement. Every sentence carries information, though the degradation explanation is slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter extraction tool with an output schema present, the description covers purpose, behavioral failure modes, and the environment prerequisite. The main gap is the lack of when-to-use guidance relative to siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single required `text` parameter. The description implies text is the input source but adds no format, constraints, or examples for it, and its only structured detail (``sources``) concerns output, so it does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: read numbers, dates and symbols out of text, via an extraction agent. Clear enough that an agent knows the tool's job, but it never contrasts itself with siblings like find_patterns or compute_numerology, so sibling differentiation is absent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a usage condition (needs an LLM endpoint via OPENAI_API_KEY/OPENAI_BASE_URL) but offers no explicit when-to-use/when-not and no routing to or away from alternatives among the sibling tools. Usage is only implied by the extraction framing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_newsA

Fetch the news of a topic in an inclusive date range from every configured source.

The five feeds run in parallel and the result is merged, de-duplicated and filtered to the range. A source that fails is skipped with a warning, so a broken feed thins the result instead of failing the call; if no source is configured at all (no GDELT, which needs no key) the call is a tool error.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes
date_rangeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the five-source parallel fan-out, merge/de-dupe/range-filter pipeline, partial-failure semantics (a broken feed is skipped with a warning rather than failing the call), and the explicit error condition when no source is configured (noting GDELT needs no key). These are exactly the operational traits an agent cannot get from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and scope, then the pipeline/failure semantics. Slightly parenthetical in the second sentence but no wasted sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers configuration prerequisites and failure modes thoroughly. The remaining gap is the unexplained 'topic' parameter, which matters for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is reported at 0% for the top-level properties: 'topic' has no description anywhere, so the agent gets no guidance on query syntax or multi-word behavior. The description adds only that the date range is inclusive, which the nested DateRangeInput schema already states for start/end.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (fetch) and resource (news) plus the scope: a topic over an inclusive date range from every configured source. Siblings (build_forecast, compute_numerology, query_qdrant) are unrelated, so no differentiation is needed for an agent to identify this as the news-retrieval tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (retrieving news for a topic/date range), but names no alternative tool and states no when-not conditions. Usage is inferable rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_patternsA

Find the connections among the stored news items with these ids, save them and return them.

The ids come from an earlier fetch_news/ingest run or from query_qdrant. An id that is not in the store is skipped rather than refused, and an empty list answers [] without asking the model — "nothing connects" and "nothing to look at" stay tellable apart. Each returned pattern carries the discovered_at timestamp save_pattern stamped. Needs Qdrant and an LLM endpoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
news_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses the write side effect (patterns are saved), the missing-id policy (skipped, not refused), the empty-input behavior (returns [] without an LLM call), the discovered_at provenance, and the external dependencies (Qdrant + LLM endpoint). That is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, and the follow-on sentences each add distinct operational detail rather than padding. It is slightly long and stylistically loose (backticked inline code, quoted phrases), but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with an output schema, the description covers the pieces the schema cannot: side effects, error handling, dependency requirements, and return provenance. An agent has everything needed to call it correctly and interpret an empty result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for the single news_ids parameter — and it does, explaining where the ids originate and how invalid or empty inputs are treated. It does not state the id format (UUID) explicitly, but the schema supplies that, so the gap is minor.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+side effect: find connections among stored news items, save them, return them. It names siblings (fetch_news, query_qdrant, save_pattern) as the id source and timestamp origin, so an agent can place it in the workflow. It stops short of an explicit 'use this instead of X' contrast, but the purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear context of use: the ids must come from an earlier fetch_news/ingest run or query_qdrant, implying the tool is invoked downstream of ingestion. Edge cases are spelled out (unknown ids skipped, empty list short-circuits). No explicit when-not-to-use or alternative tool is named, which keeps it at 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_historyA

Return when a number was activated in the news, newest first, inside the last days days.

One entry per (news item, number) pair the ingest stored: the day the article was published, the item's id and the snippet the number was read in. The window ends today and includes it (days=1 is today). The original design sketch wrote the signature as get_history(number); the read is a window, so days is a parameter whose default of 30 matches the memory window. Needs Qdrant only.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLength of the window in days, ending today.
numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses ordering (newest first), entry granularity (one row per news-item/number pair), the exact field contents returned, window inclusivity (days=1 means today), and the infrastructure dependency (Qdrant only). It omits pagination/result caps and empty-result behavior, but the behavioral disclosure is substantial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core semantics are front-loaded, but the sentence about the original design sketch signature ('get_history(number)') is narrative filler that doesn't help an agent invoke the tool, diluting an otherwise tight description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, yet the description still sketches them helpfully. With no annotations, the added ordering, dependency, and window semantics make the definition complete enough for correct invocation; only result-limit behavior is unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (days documented, number not). The description compensates well for days by explaining the window ends today, is inclusive, and that the default of 30 matches the memory window; number is only implied as the value to look up, which is the residual gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: returns when a number was activated in news, newest first, within a day window. This is clearly distinguishable from siblings like find_patterns or fetch_news, and it names the entity granularity (news item, number) pair.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the wording (a historical lookup over a window), but there is no explicit when-to-use/when-not guidance and no alternatives named among siblings such as find_patterns or query_qdrant. An agent can infer the intent but gets no routing help.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_qdrantA

Search the stored news or patterns by meaning and return the matching entities.

collection="news" runs the hybrid (multi-stage) search over stored articles and honours the optional payload filters — publication window, source, reduced value or master number. collection="patterns" finds saved pattern interpretations and takes no filters: passing any is an error rather than a silently ignored argument. Needs Qdrant only; nothing is embedded remotely and no model is called.

The returned items are the typed entities themselves (NewsItem or Pattern), best match first; the scores stay in Qdrant because the callers work with the entities.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results.
queryYesWhat to look for, in natural language.
filtersNo
collectionYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsNoThe matching entities, best match first.
queryYesThe text the search embedded.
collectionYesWhich collection was searched.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden and does well: it states the query runs against Qdrant only, that nothing is embedded remotely and no model is called, that filters are an error (not silently ignored) for patterns, that results are best-match-first, and that scores are deliberately not returned. Missing are behaviors like empty-result handling and the 1-50 limit boundary, keeping it from 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action in the first sentence, then structured per-collection, then a return-shape note. The backtick-heavy prose is slightly ornate but every sentence carries information; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter search tool with an output schema present, this is complete: collection semantics, filter applicability, error behavior, run-time dependencies, and result ordering/typing are all covered without re-explaining the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, so the description must compensate, and it does by enumerating the filter dimensions ('publication window, source, reduced value or master number') and, more importantly, by scoping filters to collection='news' only. It does not discuss the limit or query parameters, so it is not fully covering the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Search the stored news or patterns by meaning') and splits the two target collections so each has a distinct meaning. An agent can tell it apart from find_patterns and fetch_news without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit per-collection usage: news supports optional payload filters with enumerated dimensions, patterns takes none and rejects them as an error rather than ignoring them. It stops short of naming or routing against the similarly-named sibling tools (find_patterns, check_master_numbers), so 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_patternA

Store one pattern and return it as written, with discovered_at filled in.

The original design sketch called the return type SavedPattern; the saved model is a Pattern (the one numenews.vector.save_pattern returns), so the tool returns that rather than a second type saying the same thing. Re-saving the same pattern id overwrites the point instead of adding a copy, and a timestamp already present is never rewritten. Needs Qdrant only.

ParametersJSON Schema
NameRequiredDescriptionDefault
patternYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
typeYes
numbersYes
news_idsYes
strengthYes
discovered_atNo
interpretationYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full load, and it does well: idempotent upsert semantics by pattern id, an existing timestamp is never rewritten, and the server stamps discovered_at when absent when writing to Qdrant. Missing are failure modes, permission/auth requirements, and whether the write is atomic or rate-limited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence is front-loaded and useful. The middle sentence justifying the SavedPattern-vs-Pattern return-type naming is design rationale that does not help an agent select or invoke the tool, so it dilutes an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers write semantics, idempotency, timestamp handling, and the Qdrant dependency. What remains missing for a mutation tool with zero annotations is error/permission behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Reported schema description coverage is 0%, though the nested $defs actually document most fields, so the description's obligations are lighter than the metric suggests. The description echoes the id-overwrite and discovered_at-stamping semantics already present in the schema rather than adding new parameter meaning, landing at the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a specific verb and resource ('Store one pattern') plus the post-condition ('return it as written, with discovered_at filled in'). It is distinguishable from siblings like find_patterns and query_qdrant by the write/read split, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied — the tool stores a single pattern, and re-saving the same id overwrites. There is no stated when-to-use versus find_patterns, no when-not, and no guidance on when saving is appropriate for an agent. 'Needs Qdrant only' is a useful dependency note but not usage routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedbuild_forecast
    • First observedcheck_master_numbers
    • First observedcompute_numerology
    • First observedextract_numbers
    • First observedfetch_news
    • First observedfind_patterns
    • First observedget_history
    • First observedquery_qdrant
    • First observedsave_pattern

TDQS

A4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: build_forecast, save_pattern, get_history, fetch_news, extract_numbers, compute_numerology, find_patterns, check_master_numbers, and query_qdrant target different domain actions. The descriptions distinguish overlapping-sounding tools (e.g., compute_numerology vs extract_numbers vs check_master_numbers) by scope and input/output.

Naming Consistency5/5

Names consistently follow a verb_noun pattern (build_forecast, save_pattern, get_history, fetch_news, extract_numbers, compute_numerology, find_patterns, check_master_numbers, query_qdrant). The only noun-only name is query_qdrant, which still fits the pattern loosely as a verb-mechanism combination.

Tool Count5/5

Nine tools is well-scoped for a numerological news analysis pipeline. Each tool covers a distinct stage (ingest, extract, compute, find, save, query, forecast) with no obvious redundancy or missing pieces at the count level.

Completeness4/5

The surface covers fetch/extract/analyze/save/query/forecast, which is a complete lifecycle for the domain. Minor gaps include no direct delete or update for stored patterns/news, and no batch operations, but agents can work around these via query and re-save.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables fact-checking of news headlines using Google Gemini AI and web search verification, and retrieves trending news topics from RSS feeds with comprehensive multi-source analysis.
    1
    -
  • F
    license
    B
    quality
    D
    maintenance
    Fetches news articles from Google News, vectorizes them locally using ChromaDB, and enables semantic search through natural language queries.
    2
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables LLM agents to discover news sources, list articles, parse and extract article text, search news, and perform NLP analysis such as keyword extraction and summarization.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables searching and fetching news articles with configurable date ranges, returning structured, sourced evidence for daily mineral-rights briefings.
    -