numenews
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@numenewsWhat's the numerology forecast for today?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
numenews
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 intojq.Five news sources (GDELT, NewsAPI, GNews, Mediastack, Currents) behind one
NewsSourceProtocol, 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
bgemodels throughfastembed. 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-aiagents — 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 coverageQdrant'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 --helpOver 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 testWhat 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) andcli-surface(the six commands — JSON-only stdout, the--dategrammar, 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 listshows what is active,openspec validate "<name>" --strictchecks a change, and archiving merges its spec deltas intoopenspec/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 flightLayer | Choice |
Package manager |
|
Types |
|
Vector store | Qdrant (Docker Compose; |
Embeddings |
|
LLM orchestration |
|
MCP server | Python |
HTTP |
|
Config / logs |
|
CLI | Typer + Rich, JSON-only stdout |
Tests |
|
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
docs/ARCHITECTURE.md— the layers, the data flow and the runtime topologydocs/STACK.md— every tool, why it was chosen and what it costsdocs/TESTING.md— the test levels, the doubles and the coverage floorsdocs/coverage_report.md— the dated coverage snapshot and the floorsdocs/TOOL_USE.md— which MCP tool answers which questiondocs/GLOSSARY.md— MCP, RAG, gematria, master number and the restdocs/FAQ.md— "why numerology?", "do I need API keys?", "how do I connect Cursor?"docs/NUMEROLOGY.md— terminology and rulesdocs/NEWS_SOURCES.md— the five news APIs, their limits and the cachedocs/QDRANT_COLLECTIONS.md— the six collections, payloads and indexesdocs/EMBEDDINGS.md— the local models, the cache and why two of themdocs/PROMPTS.md— every agent prompt, verbatim, with its rationaledocs/RAG_PIPELINE.md— the chain, its degradation rules and its testsdocs/CONTEXT_MANAGEMENT.md— the window, the history and the digestdocs/MCP_TOOLS.md— the nine MCP tools, their examples and the client configsdocs/USER_FLOW.md— the one-shot CLI, its commands and their JSONdocs/EVAL.md— the ragas evaluation: how to run it and how to read the reportdocs/eval_report.md— the latest committed eval rundocs/adr/— architecture decision recordsdocs/agentic/— how AI coding agents work here, and their guardrailsAGENTS.md— the rules for AI coding agents in this repository
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
Available Tools
9 toolsbuild_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.
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | Yes | |
| advice | Yes | |
| forecast | Yes | |
| patterns | No | |
| warnings | No | |
| master_active | Yes | |
| dominant_number | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| numbers | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| has_master | Yes | |
| master_numbers | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | Yes | |
| value | Yes | |
| gematria | Yes | |
| breakdown | Yes | |
| is_master | Yes |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| numbers | No | |
| sources | No | |
| symbols | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | ||
| date_range | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| news_ids | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Length of the window in days, ending today. | |
| number | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results. | |
| query | Yes | What to look for, in natural language. | |
| filters | No | ||
| collection | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | The matching entities, best match first. |
| query | Yes | The text the search embedded. |
| collection | Yes | Which collection was searched. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pattern | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| type | Yes | |
| numbers | Yes | |
| news_ids | Yes | |
| strength | Yes | |
| discovered_at | No | |
| interpretation | Yes |
TDQS
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.
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.
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.
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.
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.
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.
9 tool updates
v0.1.0- First observed
build_forecast - First observed
check_master_numbers - First observed
compute_numerology - First observed
extract_numbers - First observed
fetch_news - First observed
find_patterns - First observed
get_history - First observed
query_qdrant - First observed
save_pattern
TDQS
Scored across 9 tools
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.
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.
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.
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
Related MCP Connectors
Read Google News across 80 editions and any public Telegram channel, without an API key
Cross-source news (AP, BBC, NPR, HN, Google News) with topic filtering and dedup.
Monitor news sources, read clustered articles and generated texts, manage goals and workflows.
Google News search and topics with the full article text in Markdown for LLMs.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables 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-
- FlicenseBqualityDmaintenanceFetches news articles from Google News, vectorizes them locally using ChromaDB, and enables semantic search through natural language queries.2-

newspaper-mcpofficial
AlicenseNot gradedqualityCmaintenanceEnables 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- FlicenseNot gradedqualityBmaintenanceEnables searching and fetching news articles with configurable date ranges, returning structured, sourced evidence for daily mineral-rights briefings.-