Skip to main content

Numvo

Phone number intelligence and spam-risk detection built with a reusable Python orchestration layer and MCP.

Architecture

Client / MCP Host
       ↓
    MCP adapter
       ↓
 Numvo service
       ↓
 ┌──────────────────────┐
 │ PhoneNumbersProvider │  metadata / validity
 │ FTCComplaintProvider │  complaint reputation
 │ IPQSProvider         │  fraud / abuse reputation
 └──────────────────────┘
       ↓
Normalize → aggregate → cross-validate → score → explain

What Numvo uses today

Phone metadata

phonenumbers provides number validity, region, carrier information when available, and number type. Metadata alone never makes a number spam.

FTC complaint reputation

Numvo can ingest the FTC Do Not Call complaint CSV data into a local SQLite index. Lookups are then performed by exact phone number without downloading complaint data during every request.

The FTC data is consumer-submitted complaint evidence. Numvo treats it as a signal, not absolute proof that a number is malicious.

IPQS reputation

If IPQS_API_KEY is configured, Numvo queries IPQualityScore for an independent reputation signal including fraud score, recent abuse, risky/spammer flags, and selected phone attributes.

Set the key before starting the MCP server:

export IPQS_API_KEY="your-key"
# Windows PowerShell:
# $env:IPQS_API_KEY="your-key"

The key is read from the environment and should not be committed to the repository.

Spam scoring

FTC complaint scoring considers:

  • total complaint count
  • complaints in the last 30 and 90 days
  • robocall ratio
  • whether complaints span multiple dates

IPQS contributes its fraud score plus risky, spammer, and recent-abuse signals.

When two independent reputation providers both produce strong evidence, Numvo applies an agreement boost. This makes multi-source confirmation stronger than a single provider result.

Risk labels are:

0-24   LOW
25-49  SUSPICIOUS
50-74  HIGH
75-100 VERY_HIGH

Confidence and explanations

Every Numvo result separates risk from confidence.

  • spam_score answers: how suspicious does the available evidence look?
  • confidence_score answers: how much independent reputation evidence supports that conclusion?

Confidence labels are:

0-19   VERY_LOW
20-49  LOW
50-79  MEDIUM
80-100 HIGH

The result also includes human-readable reasons, for example:

FTC complaint history: 31 reports
12 FTC complaints in the last 30 days
84% of FTC reports were robocall-related
IPQS fraud score: 94/100
IPQS identifies the number as a spammer
IPQS reports recent abuse activity
Two independent reputation sources show strong risk signals

This is intentionally explainable: a high risk score with very low confidence should be treated differently from a high risk score confirmed by multiple independent sources.

Development

python -m venv .venv
source .venv/bin/activate  # Windows: .venv\\Scripts\\activate
pip install -e ".[dev]"
pytest

Automatic FTC refresh

Numvo can now check recent FTC daily complaint files automatically and ingest any published rows into the local SQLite index.

Refresh the most recent 7 calendar days:

python scripts/refresh_ftc.py

Or choose a wider window:

python scripts/refresh_ftc.py --days 30

Numvo checks each date in the requested window. If the FTC has no file for a date, such as a weekend or non-published day, it records not_published and continues.

Downloaded files are cached under:

data/ftc_daily/

The SQLite index is stored at:

data/ftc_complaints.sqlite3

The refresh is safe to rerun: downloaded CSVs are reused and INSERT OR IGNORE prevents identical complaint rows from being duplicated.

You can still ingest a local FTC CSV manually:

python scripts/ingest_ftc_csv.py path/to/complaints.csv

MCP tools

The server exposes:

check_phone_number(phone_number)
normalize_number(phone_number)

check_phone_number() combines phone metadata, locally indexed FTC complaint evidence, and IPQS reputation when configured, then returns risk, confidence, reasons, and raw provider signals.

Status

Early development. Numvo now supports multi-source spam-risk cross-validation, explicit evidence confidence, human-readable explanations, and automatic FTC complaint-data refresh.

Metadata

Release files for numvo 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for numvo 0.3.0
File Size Uploaded Provenance Actions
numvo-0.3.0.tar.gz 13.6 kB With provenance Details for numvo-0.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for numvo 0.3.0
File Interpreter ABI Platform Actions
numvo-0.3.0-py3-none-any.whl Python 3 none any Details for numvo-0.3.0-py3-none-any.whl

Total release size: 28.2 kB

Release files / numvo-0.3.0.tar.gz

Download URL numvo-0.3.0.tar.gz
Size 13.6 kB
Tags Source
SHA-256 checksum
How to use checksums
3627ba5934d92c12b429910304a8b5fffb39ea99fe9a4169b7821481f3ffad76
BLAKE2b-256 checksum
How to use checksums
6c447a4e7a843efe915be9809ce5612f1b0d41cb0fdeb1dd7eb16a7241480d53
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 6, 2026.

Transparency log

Release files / numvo-0.3.0-py3-none-any.whl

Download URL numvo-0.3.0-py3-none-any.whl
Size 14.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aaf6ff26cef8c8c7fdcd8f1be06428f6bfac0b84b05b45b08120c9cab2c67387
BLAKE2b-256 checksum
How to use checksums
3a1bc47b2b4950ff46f30573f4e4a89e3ed185ee0daef42e97fbba9c644f0aa9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 6, 2026.

Transparency log

Security for numvo 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for numvo-0.3.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 6, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page