github Python analyzed 1979cac

KazKozDev/footnote-mcp

github

Web research MCP server with claim verification — 45 tools for Claude Desktop and Cursor

maintainer
KazKozDev
licence
MIT
first seen
2026-06-30
last seen
2026-09-07
releases · 30d
0
short id

Drift inferred · capture-to-capture

tool count over time

06-30 12:19 now
31t
34t
capabilities 14 tools
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
skills & danger signals github-tarball
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

code evidence vv0.2.5 · github-tarball
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