diff --git a/src/mcp/tools.py b/src/mcp/tools.py index d676e5e..6e1b2da 100644 --- a/src/mcp/tools.py +++ b/src/mcp/tools.py @@ -1,6 +1,7 @@ from dash.mcp import mcp_enabled from src.mcp import queries +from src.mcp.queries import ColonneMarche from src.utils.tracking import track_mcp_tool @@ -74,6 +75,7 @@ def rechercher_marches( departement: str | None = None, page: int = 1, filtres_avances: dict | None = None, + colonnes: list[ColonneMarche] | None = None, ) -> dict: """Recherche paginée de marchés publics (DECP). @@ -84,6 +86,13 @@ def rechercher_marches( filtres_avances : dict optionnel {"colonne__operateur": valeur} pour les besoins pointus. Colonnes et opérateurs disponibles via l'outil schema_donnees(). + colonnes : liste optionnelle de colonnes à renvoyer. Par défaut, un jeu + standard (uid, objet, montant, dateNotification, codeCPV, acheteur_id, + acheteur_nom, acheteur_departement_code, titulaire_id, titulaire_nom). Si + fournie, REMPLACE le jeu par défaut (le champ uid reste toujours présent). + Colonnes disponibles via schema_donnees().colonnes_disponibles. + Chaque marché renvoyé contient en plus un champ `lien` (URL de la fiche + marché sur colibre). page : numéro de page (50 résultats par page). Retourne {meta: {page, page_size, total}, marches: [...]}. """ @@ -100,4 +109,5 @@ def rechercher_marches( departement=departement, page=page, filtres_avances=filtres_avances, + colonnes=colonnes, ) diff --git a/tests/mcp/test_tools.py b/tests/mcp/test_tools.py index 18ac863..c24e4f1 100644 --- a/tests/mcp/test_tools.py +++ b/tests/mcp/test_tools.py @@ -31,3 +31,26 @@ def test_stats_acheteur_returns_stats(): def test_stats_titulaire_returns_stats(): result = tools.stats_titulaire("345") assert result["nb_marches"] >= 1 + + +def test_rechercher_marches_colonnes_param_is_enum(): + import typing + + from pydantic import TypeAdapter + + hints = typing.get_type_hints(tools.rechercher_marches) + schema = TypeAdapter(hints["colonnes"]).json_schema() + # list[ColonneMarche] | None -> anyOf[array(items.enum), null] + array_schema = next(s for s in schema["anyOf"] if s.get("type") == "array") + enum = array_schema["items"]["enum"] + assert "objet" in enum + assert "montant" in enum + assert "uid" in enum + + +def test_rechercher_marches_colonnes_passthrough(monkeypatch): + monkeypatch.setenv("APP_BASE_URL", "https://colibre.fr") + result = tools.rechercher_marches(acheteur_id="123", colonnes=["objet"]) + m = result["marches"][0] + assert set(m.keys()) == {"uid", "objet", "lien"} + assert m["lien"] == f"https://colibre.fr/marche/{m['uid']}"