Web research MCP server with claim verification — 45 tools for Claude Desktop and Cursor
Drift inferred · capture-to-capture
tool count over time
06-30 12:19 now
31t
34t
transport stdio · streamable-http · http
verified
reported
listed in the official MCP registry counts 14 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
check_date_completeness
-
classify_source
-
evidence_entailment
-
generate_search_queries
-
resolve_units
-
tool_spec_propose
-
validate_unit_rows
-
web_deep_search
-
web_detect_downloads
-
web_extract_tables
-
web_fetch_json
-
web_parse_file
-
web_read
-
web_search
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 1979cac · analyzer v33 · 1w ago
danger signals1
- dynamic code execution __import__() KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/health.py :56
__import__(module_name)
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 51
filesystem 17
- fs (weak) KazKozDev-footnote-mcp-1979cac/benchmarks/deepeval_smoke.py :7
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/benchmarks/run_benchmark.py :19
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/benchmarks/run_search_benchmarks.py :30
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/scripts/ddg_scraper.py :31
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/deep_research.py :18
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/http_cache.py :18
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/search.py :13
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_browser.py :5
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/cache.py :9
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/files.py :9
from pathlib import Path - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/health.py :61
import shutil - fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/sandbox.py :13
from pathlib import Path
show 5 more
- fs KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_extra.py :17
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/tests/test_benchmark.py :4
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/tests/test_mcp_smoke.py :10
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/tests/test_search_benchmark_runner.py :7
from pathlib import Path - fs (weak) KazKozDev-footnote-mcp-1979cac/tests/test_tools_data.py :198
file_write = "def extract(source_text, input_payload):\n return open('/tmp/x', 'w')\n"
shell / exec 1
- shell KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/sandbox.py :10
import subprocess
network 17
- net (weak) KazKozDev-footnote-mcp-1979cac/scripts/ddg_scraper.py :29
import urllib.parse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/deep_research.py :20
from urllib.parse import urljoin, urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/fetch.py :8
from curl_cffi import requests as http - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/http_server.py :17
from urllib.parse import urlsplit - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/politeness.py :17
from urllib.parse import urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/rerank.py :251
from urllib.parse import urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/scraper.py :29
from urllib.parse import urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/search.py :14
from urllib.parse import parse_qs, quote, quote_plus, unquote, urlencode, urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/semantic.py :20
from curl_cffi import requests as http - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/sources.py :10
from urllib.parse import quote, urlencode, urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/classify.py :6
from urllib.parse import urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/entailment.py :8
from urllib.request import Request, urlopen
show 5 more
- net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/files.py :10
from urllib.parse import urljoin, urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_extra.py :18
from urllib.parse import quote, urljoin, urlparse - net KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_search.py :4
from urllib.parse import urlparse - net (weak) KazKozDev-footnote-mcp-1979cac/tests/test_mcp_smoke.py :11
from urllib.parse import quote - net (weak) KazKozDev-footnote-mcp-1979cac/tests/test_tools_browser.py :4
from urllib.parse import quote
secrets 5
- secrets KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/http_server.py :46
owner_key = os.environ.get("FOOTNOTE_MCP_API_KEY") - secrets KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/scraper.py :234
key = os.getenv("FIRECRAWL_API_KEY") - secrets KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/search.py :1034
key = os.getenv("TAVILY_API_KEY") - secrets KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/sources.py :357
token = os.getenv("GITHUB_TOKEN", "").strip() - secrets KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/tools_data/entailment.py :211
key = os.getenv("FOOTNOTE_OPENAI_API_KEY") or os.getenv("OPENAI_API_KEY")
tool registrations 14
- web_search KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :197
- web_deep_search KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :212
- web_read KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :240
- web_extract_tables KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :253
- web_detect_downloads KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :268
- web_parse_file KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :281
- web_fetch_json KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :295
- check_date_completeness KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :309
- classify_source KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :325
- generate_search_queries KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :339
- resolve_units KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :352
- validate_unit_rows KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :361
show 2 more
- evidence_entailment KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :374
- tool_spec_propose KazKozDev-footnote-mcp-1979cac/src/footnote_mcp/server.py :388
declared dependencies 16
- mcp@>=1.26.0,<2
- uvicorn@>=0.30
- ollama@>=0.4
- playwright@>=1.49
- curl_cffi@>=0.5.10
- beautifulsoup4@>=4.12
- trafilatura@>=1.12
- rank-bm25@>=0.2
- openpyxl@>=3.1
- pypdf@>=4.0
- xlrd@>=2.0
- pdfplumber@>=0.11
show 4 more
- pytesseract@>=0.3
- holidays@>=0.60
- huggingface-hub@>=0.30
- pyarrow@>=18,<22