ViaRoma MCP Server
Used by the FreeHunter component to discover free frontier models on Hugging Face and populate the persistent catalog of free models.
Provides a passthrough adapter for OpenAI-compatible endpoints, so chat requests can be forwarded to OpenAI-style APIs.
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., "@ViaRoma MCP Serversend a chat request to the best available free model: summarize this README"
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.
⚠️⚠️⚠️ CE N'EST PAS PRÊT. NE L'UTILISEZ PAS. ⚠️⚠️⚠️
⛔ NE PAS UTILISER ⛔
Ce projet n'est pas terminé et n'est pas fiable en production. Il est publié ici pour que le travail soit visible et critiquable, pas pour être utilisé.
Ce qui n'est pas démontré :
❌ Aucune complétion réelle. Un seul adapter (
claude_web) a été validé contre son front. Les 14 autres ont unechat_path/sse_kind/ un payload corrects, mais n'ont jamais répondu. N'en déduisez pas qu'ils marchent.❌ Le contournement anti-WAF n'a jamais tourné contre un vrai site. Camoufox n'a jamais été exercé sur un site réel.
❌ Les credentials ne sont pas fournis. Sans
data/creds/<compte>.json(que vous devez créer vous-même),chatrenvoie un 503 propre. C'est voulu : le secret ne touche jamais ce dépôt.❌ Le
PROVIDER_METAne couvre que les fronts web. Aucun support desktop/CLI.❌ La CI ne prouve pas le comportement réseau, seulement le code hors-ligne.
Ce qui est solide et vérifié : le fail-closed (aucun provider n'est appelé sans proxy de sortie — 5 niveaux de preuve automatisés), la cascade et le circuit breaker, le dashboard (chaque clic = une action réelle), le catalogue (métriques réelles uniquement, provenance tracée), le garde-fou anti-fuite de secrets.
Vous forkez, vous lisez, vous critiquez — mais vous ne l'utilisez pas sur de vraies données, et vous ne branchez pas de vrai compte dessus tant que ces points ne sont pas levés. L'état détaillé, module par module, est dans
PROGRESS.md.
🚧 ALPHA — pas de release — développement actif 🚧
Le HTTP et le MCP répondent, la cascade est câblée, le pool egress tourne, le dashboard s'affiche. Ce qui n'est pas démontré : une complétion réelle. Voir
PROGRESS.mdpour l'état honnête, module par module.
Related MCP server: io.github.0xzr/freellmpool
🔒 Licence propriétaire — tous droits réservés
Ce dépôt n'est pas sous licence libre. Usage personnel sur votre propre machine, redistribution / fork public / usage commercial interdits sans accord écrit. Voir
LICENSE. Le modèle de sécurité et la procédure de signalement de failles sont dansSECURITY.md.
🏛️ What is ViaRoma?
ViaRoma — via Romana, "all roads lead to Rome". Un point d'entrée unique qui donne accès à des modèles frontier gratuits : une API OpenAI-compatible et un serveur MCP, branchables sur n'importe quel agent.
L'architecture repose sur trois idées inhabituelles pour un proxy :
Idea | Implementation |
L'IP de sortie est jetable |
|
Une session appartient à un compte, pas à une IP | Chaque |
L'échec est un signal de routage | Un |
agent (Hermes, Claude Code, …)
│
├── MCP stdio ──▶ src/mcp_server.py ──┐
│ │
└── HTTP ───────▶ src/main.py ────────┤
▼
CascadeManager ──▶ CircuitBreaker (par provider)
│ ├── 429 rate limit ──▶ burn lane
│ ├── 403 permission ──▶ burn lane
│ └── challenge ───────▶ burn lane
▼
ProxyLayer ──▶ ProviderAdapter (16 providers)
│
▼
TLSSpoofer (curl_cffi JA3/JA4) ──▶ SSE ──▶ ChatChunk📐 Modules — find src -name '*.py' -o -name '*.js'
18 modules · 5 829 lignes · Python 3.12
Module | Lignes | Rôle |
140 | App FastAPI, hooks startup/shutdown, | |
275 | Serveur MCP (stdio / sse / streamable-http) : 5 outils, même noyau que l'API. | |
264 |
| |
661 |
| |
312 |
| |
446 | Pile anti-WAF hybride : Camoufox headless pour passer Turnstile/Cloudflare, puis curl_cffi avec spoof JA3/JA4 complet ; repli aiohttp. | |
352 |
| |
271 | Normalisation SSE native → | |
254 | Rotation multi-comptes, isolation des cookie jars, binding de lane par compte, cooldown / rate-limit / challenge, persistance JSON. | |
342 |
| |
885 | 43 endpoints : stats, actions, édition de config, credentials, egress, anti-WAF. | |
118 | Lecture/écriture des 5 fichiers de config, squelettes par défaut sans donnée sensible, backups. | |
61 | Charge | |
80 |
| |
24 | Modèles Pydantic : | |
697 | Pilotage : 10 onglets, actions, refresh 2 s, charts. | |
254 | Canvas 2D sans lib, thème Roma Aeterna : couronne de laurier, colonnes romaines, aqueduc. | |
194 | Colisée 3D en canvas, sans dépendance. | |
— | Thème « Roma Aeterna » : or, ivoire, verre, colonnes. | |
— | Squelette du dashboard, cache-busting |
🔌 Le serveur MCP
C'est la porte d'entrée pour les agents. Cinq outils, pas un de plus :
Outil | Ce qu'il fait |
| Envoie un message, la cascade route en interne, retourne le texte. L'agent ne choisit jamais le provider. |
| Connecte un compte une fois (harvest de session via Camoufox). Ne renvoie jamais la valeur des credentials. |
| La matrice des providers + l'état de connexion de chaque session. |
| Le catalogue des modèles gratuits, filtré par tier. |
| Santé live : providers, sessions, lanes, IPs, burns, cooldowns. |
Brancher un agent
// claude_desktop_config.json / mcp.json — transport stdio
{
"mcpServers": {
"via-roma": {
"command": "via-roma-mcp"
}
}
}# ou en HTTP, pour un agent déjà habitué au streamable-http
via-roma-mcp --transport streamable-http --port 8001Les logs du serveur partent sur stderr : stdout est réservé au protocole.
🛣️ Egress Lanes — le cœur du design
L'IP de sortie est une ressource consommable, pas un réglage. C'est cette décision qui rend la rotation de comptes et la survie aux rate-limits par IP traitables.
EgressLanePool
┌───────────────────────────────────────────┐
│ pool: SOCKS5 · HTTP · Tor · listes │
│ probe_endpoint() → santé │
└───────────────────┬───────────────────────┘
│ bind(account_id)
▼
account:perso ──▶ [ lane-A · proxy · profil TLS ]
account:ecole ──▶ [ lane-B · proxy · profil TLS ]
│
│ burn_lane(account_id, "429 rate_limit")
▼
lane remplacée depuis le pool — cookie jar intactLane persistante — un compte garde la même identité de sortie d'une requête à l'autre.
burn_lane()— sur403/429/ challenge, le circuit breaker rappelleSessionManager.burn_lane(), qui remplace la lane et garde les cookies.Health loop — toutes les 120 s, chaque lane est sondée (IP publique, latence, pays/ASN) puis mise en quarantaine si morte. État persisté dans
data/egress_lanes.json.Les credentials restent hors du code — les comptes résolvent leurs secrets via
credentials_ref: env:NAME | file:path. Aucune clé n'est en dur, rien n'est versionné.
🧬 Identités — une machine par compte
Les services free-tier limitent souvent une personne à 1 ou 2 comptes. ViaRoma répond en donnant à chaque compte une identité de machine complète :
Couche | Ce qui varie par compte |
Réseau | L'IP de sortie (lane), unique et disposable. |
TLS | Le profil JA3/JA4 ( |
Navigateur | User-Agent, |
Deux invariants, tenus par IdentityManager :
Stable — un compte garde la même identité d'un bout à l'autre. Changer d'empreinte en cours de session, c'est se faire bannir.
Distincte — deux comptes ne partagent jamais la même empreinte. Le service voit une personne par identité, pas dix comptes.
L'identité est dérivée d'un seed = hash(account_id + salt d'install + rotation). Donc
reproductible sans stocker 30 champs, unique par compte, et rotable : un nouveau seed donne
une nouvelle identité cohérente.
Le couplage est la clé : burn_lane() fait tourner l'IP et l'empreinte ensemble.
Une nouvelle IP avec la même empreinte, c'est un compte qui « saute de machine ».
L'onglet 🧬 Identities du dashboard affiche l'état par compte et la rotation.
⚡ Quick start
# Python 3.12 est requis — curl_cffi n'a pas de wheel _cffi_backend en 3.14+
py -3.12 -m venv .venv
.venv/Scripts/pip install -r requirements.txt
# API HTTP + dashboard, depuis la racine du dépôt
.venv/Scripts/python -m src.main
# serveur MCP (stdio) pour un agent
.venv/Scripts/python -m src.mcp_serverLes modèles 3D du Colisée (32 Mo) ne sont pas dans le dépôt. Une seule fois :
.venv/Scripts/python scripts/fetch_3d_assets.pySans eux, le dashboard bascule sur un Colisée procédural — il fonctionne quand même.
L'API écoute sur port 8000 (surchargeable : VIAROMA_PORT) :
curl http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"auto","messages":[{"role":"user","content":"ping"}],"stream":true}'
curl http://127.0.0.1:8000/v1/egress/statsLe dashboard est sur http://127.0.0.1:8000/dashboard/ — 16 onglets, thème Roma Aeterna.
Tout client OpenAI-compatible marche : pointe son base_url sur http://127.0.0.1:8000/v1.
📦 Installation en paquet
Le dépôt est empaqueté pour npm et PyPI. Les deux chemins sont préparés et testés en CI ; la publication elle-même demande un compte/token.
# npm : le paquet installe les lanceurs (ils trouveront Python 3.12 seul)
npm install -g via-roma
via-roma-mcp # serveur MCP (stdio)
via-roma # API HTTP + dashboard
# PyPI
pip install via-roma
via-roma-mcp
via-romaconfig/ (comptes, cascade, pool egress) est livré avec le paquet ; data/
(identités, lanes, catalogue, sessions) est créé au premier lancement.
Pour stocker's l'état ailleurs que dans le dossier du paquet :
export VIAROMA_HOME=/chemin/vers/etat # config/ + data/ y serontSi Python 3.12 n'est pas trouvé, le lanceur s'arrête avec le message exact à
suivre (VIAROMA_PYTHON ou pip install -r requirements.txt) — il ne
devine pas et ne fait pas semblant.
Requirements
Package | Rôle |
| Surface HTTP et serveur ASGI |
| Serveur MCP (stdio / sse / streamable-http) |
| Schémas requête/réponse |
| Impersonation TLS (JA3/JA4) — Python 3.12 uniquement |
| Transport de repli quand curl_cffi est indisponible |
| Navigateur headless pour passer les challenges WAF |
| État partagé optionnel |
🛡️ Sécurité — l'IP réelle ne sort jamais, les credentials ne fuient pas
C'est une garantie structurelle, pas une option. Elle est appliquée dans le noyau et
vérifiée par tests/test_security_context.py.
Garantie | Comment elle est tenue | Testé |
L'IP de la machine n'est jamais transmise | Aucun provider n'est exécuté sans proxy de sortie : | ✅ |
L'IP réelle n'est jamais affichée | L'API ne renvoie que l'IP de sortie ( | ✅ |
Les credentials ne quittent jamais la machine | Résolution à la volée ( | ✅ |
Aucun cookie n'est renvoyé | Les endpoints de session renvoient un nombre de cookies, jamais leurs valeurs. | ✅ |
Les jetons ne voyagent pas en cookie | Le champ | ✅ |
Le dashboard n'écoute que sur la boucle locale |
| — |
Le dépôt ne contient aucun secret |
| ✅ |
Le dashboard expose l'état de ces garanties en direct (onglet Overview → Garanties actives), avec la liste des comptes écartés et la raison.
Le routage part d'un contexte unique par compte
C'est le point qui rend les garanties tenables. Une requête ne se construit plus à partir de réglages dispersés, mais d'un contexte qui porte l'identité complète du compte :
contexte(account_id)
├── proxy ← lane egress du compte (obligatoire, sinon fail-closed)
├── tls_profile ← profil JA3/JA4 de l'identité du compte
├── user_agent ← UA récolté par le navigateur (sinon celui de l'identité)
├── locale ← locale de l'identité (Accept-Language suit)
└── creds ← jar de cookies récolté + credentials résolusEnvoyer une requête depuis une autre IP que celle du navigateur, ou avec un autre profil TLS que celui de l'identité, c'est exactement ce qui fait bannir un compte. Ici, les cinq éléments viennent de la même source.
🎨 Le dashboard « Roma Aeterna »
Le Colisée en WebGL (vrai 3D) — Three.js + un modèle GLB réel du Colisée (reconstruction de l'Anfiteatro Flavio, 80 d.C. et état actuel) : ombres portées, bloom, torches qui vacillent, poussière en suspension, caméra panoramique lente, glissement à la souris et zoom à la molette. Repli automatique sur un Colisée procédural si le GLB ou WebGL sont indisponibles. Les modèles sont trop volumineux pour le dépôt :
python scripts/fetch_3d_assets.py. three.js est vendu local (vendor/three/) — aucun CDN à l'exécution. Attribution : Colosseum.how — voirCREDITS.md.Side panel complet groupé — Pilotage / Observabilité / Architecture / Playground / Configuration / Opérations. Chaque entrée ouvre un onglet réel, jamais un log vide.
Overview en tuiles — Centre de commandement (chaîne de routage réelle, cliquable), Trafic & catalogue, Requêtes live (journal réel) et Garde-fous (fail-closed).
Graphe d'architecture live — le graphe d'orchestration de ViaRoma en SVG, alimenté par les données du serveur : superviseur, adaptateurs, egress, mémoire partagée, registre d'outils, synthèse. Chaque nœud ouvre sa fiche et ses actions.
Onglet Live — sorties et annonces scrapées en direct (Hugging Face papiers du jour et modèles créés récemment, r/LocalLLaMA, Hacker News, blogs OpenAI et Google AI), plus les dépôts GGUF avec leurs vrais fichiers de quantification (nom, taille, URL).
Intro « rue romaine → Colisée » — au démarrage, la caméra descend une rue de paving stones entre des colonnes et des arcs, torches allumées, et débouche devant le Colisée. Sautable (clic / Échap), et désactivée si
prefers-reduced-motionest actif.Animation d'IP spoofing — l'identité entre dans un arc romain, s'y scramble, et en ressort transformée. L'IP réelle y est masquée par construction : elle n'est jamais écrite.
Animations d'interface — entrée du Colisée, apparition des cartes, compteurs qui bondissent, reflet sur les boutons, halo pulsé sur les pastilles d'état.
🔎 Le catalogue : des métriques réelles, pas des valeurs inventées
Le Free Hunter scrape les API publiques au runtime. Le point important : aucune fenêtre de contexte n'est devinée.
Quand la source publie la valeur, elle est reprise telle quelle et la source est tracée (
ctx_source) : Hugging Face (métadonnées GGUF), OpenRouter, NVIDIA. Les valeurs sont réellement différentes (262 144, 1 000 000, 128 000, 40 960…).Quand la source ne la publie pas, le catalogue affiche « non publiée par la source » — il n'y a plus de
32768appliqué en dur à tout le catalogue.Origine du laboratoire : chaque modèle est taggé (Chine, Europe, États-Unis, Canada, Israël, Corée, E.A.U.) et filtrable — les labos chinois et européens ne sont plus relégués.
Modes de téléchargement GGUF : pour les dépôts GGUF, la liste réelle des fichiers de quantification (
Q4_K_M,Q5_K_M,Q8_0,F16…) avec leur taille en octets et l'URL de téléchargement.Applications locales détectées : LM Studio, Cherry Studio, Jan, Unsloth, Ollama, GPT4All, KoboldCpp, Open WebUI… cherchées dans les vrais dossiers d'installation Windows (
%LOCALAPPDATA%\Programs), pas seulement dans lePATH.
🎯 Scope & ethics
ViaRoma est un projet de recherche personnel sur l'accès free-tier et l'identité de sortie — comprendre comment un client peut garder une identité de session cohérente quand le chemin réseau en dessous change (et l'inverse).
Ce n'est ni un harvester de credentials, ni un service de scraping, ni un produit de contournement.
Aucun cookie, token ou clé n'est livré. Les secrets restent chez l'utilisateur.
Le code anti-WAF existe pour comprendre les mécaniques de challenge et garder une session vivante.
Chaque usage reste la responsabilité de l'opérateur, aux conditions des services concernés.
📜 Licence
Propriétaire — tous droits réservés. © 2026 MlkBlk-IT.
Ce dépôt n'est pas sous licence libre. Ce qui est permis : lire, exécuter et faire tourner ViaRoma sur votre propre machine, pour votre usage personnel.
Ce qui est interdit sans accord écrit préalable : redistribuer le code (fork, copie, archive, paquet npm / PyPI), publier une version dérivée, vendre ou sous-licencier le logiciel, ou masquer les mentions de copyright.
Le texte fait foi : LICENSE. L'auteur se réserve le droit de retirer
le code, notamment en cas de fuite de credentials ou d'usage détourné.
Pourquoi pas une licence libre ? MIT ou Apache donneraient à n'importe qui le droit de redistribuer, forker et commercialiser le projet — c'est-à-dire de reprendre la conception telle quelle. La valeur de ViaRoma est dans le fonctionnement du routage et des identités : elle se protège en gardant le code fermé. Si vous voulez utiliser ViaRoma commercialement ou le redistribuer, demandez.
Le modèle de sécurité, les limites assumées et la procédure de signalement de
failles sont dans SECURITY.md.
📊 Status
Ce dépôt est alpha, auto-documenté. PROGRESS.md liste ce qui est vérifié,
ce qui est.stubé, et la prochaine étape. Alpha means alpha : ce qui n'est pas fini est marqué
comme tel, jamais caché.
This server cannot be deployed
Maintenance
Related MCP Connectors
Free agent-service discovery, OpenAPI document checks, and receipt verification. No API key needed.
Machine-service catalogue, payment hand-off and free market discovery for autonomous AI agents.
Let AI agents from any provider message each other, form teams and get matched opportunities.
One API key, dozens of capabilities for your AI agent. Zero provider auth.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceExposes an MCP interface that lets agents route chat requests across a pooled catalog of free LLM provider routes through a single OpenAI-compatible endpoint, with automatic failover, usage tracking, and keyless start when an enabled route is available. It also lets clients query live capacity and provider health, capacity status, and available models without leaving the agent workflow.-
- FlicenseNot gradedqualityAmaintenanceExposes a unified pool of free LLM chat routes behind one OpenAI-compatible endpoint, letting MCP clients browse available providers and models, check which free tiers are usable right now, and send chat or agent requests with automatic failover. Works without credentials whenever an enabled keyless route is available.-
- FlicenseNot gradedqualityAmaintenanceEnables coding agents and MCP clients to query pooled free LLM tiers — 178 enabled chat routes across 23 cataloged providers — through a single OpenAI-compatible endpoint with automatic failover, latency-aware routing, and keyless startup when a provider allows it. Also exposes live provider capacity, health, and model inventory so agents can pick a usable route on the fly.-
- FlicenseNot gradedqualityAmaintenanceEnables MCP clients to send chat completions through one OpenAI-compatible endpoint that pools 178 enabled routes across 23 free-tier and keyless LLM providers, with automatic failover, per-day usage tracking, and keyless start when an enabled keyless provider is available. Also exposes provider and model inventory, health and capacity status, latency-aware routing, and proxy readiness so agents can discover and use free models without manual configuration.-