- Fix 71 invalid-syntax files (class-body newline-broken assignments) - Add from/None chain to 307 B904 raise-without-from sites - Add B008 ignore to ruff.toml (already in pyproject.toml) - Noqa F401 on __init__.py re-exports (137 sites) - Noqa E402 on deferred imports (63 sites) - Bulk-add stdlib/FastAPI/project imports for F821 (127 sites) - Replace ×→x, –→-, …→... in docstrings (4093 chars) - Manual refactor of 5 SIM103/SIM116 patterns Tests: 791 passed (66 deselected due to pre-existing Redis issues in test_rag.py) Co-authored-by: opencode <opencode@rugmunch.io>
118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
"""
|
|
Unified Tool Registry - accurate count of ALL tools across the system.
|
|
|
|
Sources:
|
|
- X402 gateway tools (CF Workers)
|
|
- Our MCP server tools (mcp_server.py)
|
|
- Local MCP servers (SVM 60+ tools, EVM 25 tools)
|
|
- Service MCP (GMGN, Birdeye, Solscan, CoinGecko, Etherscan, Moralis: 13 tools)
|
|
- Caching shield data providers (6 chains, 20+ providers)
|
|
- Free external MCP servers (Boar 50 tools)
|
|
- Investigative framework endpoints
|
|
|
|
Gets called by x402_catalog.py for accurate tool counts.
|
|
"""
|
|
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
logger = logging.getLogger("tool_registry")
|
|
|
|
|
|
def count_all_tools() -> dict:
|
|
"""Return accurate tool counts across the entire system."""
|
|
counts = {
|
|
"x402_gateway": _count_gateway_tools(),
|
|
"our_mcp_server": _count_our_mcp(),
|
|
"local_mcp_svm": _count_svm_tools(),
|
|
"local_mcp_evm": _count_evm_tools(),
|
|
"service_mcp": _count_service_mcp(),
|
|
"data_providers": _count_data_providers(),
|
|
"free_mcp_boar": _count_boar_tools(),
|
|
"prediction_market": 31,
|
|
"fear_greed": 1,
|
|
"crypto_indicators": 10,
|
|
"web3_research": 15,
|
|
"evm_scope": 23,
|
|
"graph_polymarket": 31,
|
|
"contracts_wizard": 5,
|
|
"investigative": _count_investigative(),
|
|
"fallback_engine": _count_fallback_chains(),
|
|
}
|
|
counts["total"] = sum(counts.values())
|
|
counts["total_mcp_servers"] = 13
|
|
return counts
|
|
|
|
|
|
def _count_gateway_tools() -> int:
|
|
"""Count x402 gateway tools from CF worker static catalog."""
|
|
# The gateway has ~50 static tools defined in index.ts
|
|
gateway_dir = Path("/srv/x402-gateway-base")
|
|
if gateway_dir.exists():
|
|
index_ts = gateway_dir / "index.ts"
|
|
if index_ts.exists():
|
|
content = index_ts.read_text()
|
|
# Count tool definitions in STATIC_TOOLS
|
|
import re
|
|
|
|
tools = re.findall(r"\w+:\s*\{[^}]*name:", content)
|
|
return len(tools)
|
|
return 45 # known fallback count
|
|
|
|
|
|
def _count_our_mcp() -> int:
|
|
"""Count tools in our own MCP server."""
|
|
mcp_file = Path("/root/backend/app/routers/mcp_server.py")
|
|
if mcp_file.exists():
|
|
content = mcp_file.read_text()
|
|
import re
|
|
|
|
# Count tool registration decorators
|
|
tools = re.findall(r'@router\.\w+\(.*?["\']/(\w+)["\']', content)
|
|
return len(tools)
|
|
return 26 # known count
|
|
|
|
|
|
def _count_svm_tools() -> int:
|
|
"""Solana SVM MCP server - compiled Rust binary with 60+ RPC tools."""
|
|
binary = Path("/root/.hermes/mcp-servers/solana-svm/target/release/solana-mcp-server")
|
|
if binary.exists():
|
|
return 60 # getBalance, getAccountInfo, getTokenSupply, etc.
|
|
return 0
|
|
|
|
|
|
def _count_evm_tools() -> int:
|
|
"""EVM MCP server - 25 tools across 86 networks."""
|
|
entry = Path("/root/.hermes/mcp-servers/evm-direct/src/index.ts")
|
|
if entry.exists():
|
|
return 25 # verified: get_wallet_address through wait_for_transaction
|
|
return 0
|
|
|
|
|
|
def _count_service_mcp() -> int:
|
|
"""Our keyed service MCP wrappers - GMGN, Birdeye, Solscan, etc."""
|
|
return 13 # 6 services, 13 endpoints total
|
|
|
|
|
|
def _count_data_providers() -> int:
|
|
"""Caching shield data providers - unified_layer.py chains."""
|
|
return 20 # Jupiter, ST, DexScreener, Binance, Helius DAS, GoPlus, RugCheck, etc.
|
|
|
|
|
|
def _count_boar_tools() -> int:
|
|
"""Boar blockchain MCP - 50 free read-only tools."""
|
|
return 50 # eth_call, get_balance, resolve_ens, etc.
|
|
|
|
|
|
def _count_investigative() -> int:
|
|
"""Investigative framework endpoints."""
|
|
return 4 # trace, scan, chains, health
|
|
|
|
|
|
def _count_fallback_chains() -> int:
|
|
"""Fallback engine chains."""
|
|
return 6 # token_price, token_meta, wallet_balance, risk_scan, tx_history, funding_source
|
|
|
|
|
|
# Module-level export for x402_catalog.py
|
|
TOOL_COUNTS = count_all_tools()
|