Skip to main content
Glama
README.md
# legal-mcp-template

**IA Lab · Facultad de Derecho — Universidad de Palermo (UP)**

Una herramienta para que estudiantes de Derecho construyan su **propio conector
MCP legal** y aprendan IA construyéndola, no consumiéndola.

Un conector MCP (Model Context Protocol) es un programa que le da herramientas a
un asistente de IA como Claude. Este template te deja construir el tuyo: un
servidor que responde consultas jurídicas y que, **por construcción, no puede
afirmar nada del derecho sin citar la fuente**. Si una respuesta no tiene
fundamento declarado, el programa se rompe a propósito.

Esa disciplina —el *grounding*— es justamente lo que **reduce el riesgo de
alucinación**: el asistente no puede "inventar" una norma o un fallo, porque toda
afirmación viaja con su cita o no sale. Es el deber de control que los tribunales
ya están exigiendo, convertido en el comportamiento por defecto.

No hace falta saber programar. Vas a tocar **dos archivos** nada más:
`my_tools.py` (tus respuestas) y `sources.yaml` (tus fuentes).

> **Qué certifica el check (y qué no).** Cuando `make check` da verde, eso
> significa **"toda afirmación tiene una fuente declarada"**. **No** significa que
> el contenido jurídico sea correcto: eso lo revisa un humano. El verde es sobre
> la disciplina de citar, no sobre el derecho.

---

## Instalación

Necesitás **Python 3.11 o más nuevo**. Elegí tu sistema operativo.

### La forma más fácil: GitHub Codespaces (sin instalar nada)

Desde GitHub: botón **Code → Codespaces → Create codespace**. El entorno se arma
solo y corre `make check` al final. Si lo viste terminar en verde, ya está todo
listo y podés saltar a [Construí tu propio conector](#construí-tu-propio-conector).

### macOS

1. **Python.** Verificá que tengas 3.11+:
   ```bash
   python3 --version
   ```
   Si no lo tenés, instalalo desde [python.org](https://www.python.org/downloads/)
   o con [Homebrew](https://brew.sh): `brew install python`.

2. **Herramientas de compilación** (para `make`). Si nunca las instalaste:
   ```bash
   xcode-select --install
   ```

3. **Descargá el proyecto y entrá a la carpeta:**
   ```bash
   git clone <URL-del-repo> legal-mcp-template
   cd legal-mcp-template
   ```

4. **Creá un entorno virtual e instalá** (en Mac conviene siempre usar un venv):
   ```bash
   python3 -m venv .venv
   source .venv/bin/activate
   make install
   ```

5. **Comprobá que todo funciona:**
   ```bash
   make check
   ```
   Tiene que terminar en verde.

> Cada vez que vuelvas a trabajar, reactivá el entorno con
> `source .venv/bin/activate` desde la carpeta del proyecto.

### Windows

1. **Python.** Instalalo desde [python.org](https://www.python.org/downloads/) y,
   en el instalador, **tildá "Add Python to PATH"**. Verificá en PowerShell:
   ```powershell
   py --version
   ```

2. **Descargá el proyecto y entrá a la carpeta:**
   ```powershell
   git clone <URL-del-repo> legal-mcp-template
   cd legal-mcp-template
   ```

3. **Creá un entorno virtual e instalá:**
   ```powershell
   py -m venv .venv
   .venv\Scripts\activate
   pip install -e ".[dev]"
   ```

4. **Comprobá que todo funciona.** Windows no trae `make`, así que corré los tres
   pasos a mano (es exactamente lo que hace `make check`):
   ```powershell
   python -m ruff check .
   python -m legalmcp sources.yaml examples\consumidor\sources.yaml
   python -m pytest
   ```
   Los tres tienen que pasar.

> ¿Querés usar `make` en Windows? Podés instalarlo con
> [Scoop](https://scoop.sh) (`scoop install make`) o
> [Chocolatey](https://chocolatey.org) (`choco install make`). No es obligatorio.

---

## Probá el ejemplo

El proyecto trae un conector **completo y funcionando** sobre derechos del
consumidor (Ley 24.240). Con el entorno activado:

```bash
cd examples/consumidor
python -m legalmcp.server
```

(Esto levanta el servidor; cortalo con `Ctrl+C`.) Abrí
`examples/consumidor/my_tools.py`: son dos tools cortas, comentadas línea por
línea. Fijate cómo una de ellas, cuando la consulta cae fuera de su tema,
devuelve `not_found=True` en vez de inventar una respuesta. Ese es el patrón.

### Conectarlo a Claude Desktop

Para usar tu conector dentro de la app **Claude Desktop**, editá su archivo de
configuración:

- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`

El archivo debe contener **solo** la clave `mcpServers` en el nivel superior.
Reemplazá `/ruta/a/legal-mcp-template` por la ruta real donde clonaste el
proyecto.

**macOS:**
```json
{
  "mcpServers": {
    "consumidor": {
      "command": "/bin/sh",
      "args": [
        "-c",
        "cd /ruta/a/legal-mcp-template/examples/consumidor && exec /ruta/a/legal-mcp-template/.venv/bin/legal-mcp"
      ]
    }
  }
}
```

**Windows:**
```json
{
  "mcpServers": {
    "consumidor": {
      "command": "cmd",
      "args": [
        "/c",
        "cd /d C:\\ruta\\a\\legal-mcp-template\\examples\\consumidor && C:\\ruta\\a\\legal-mcp-template\\.venv\\Scripts\\legal-mcp.exe"
      ]
    }
  }
}
```

Guardá, **cerrá Claude Desktop por completo y volvé a abrirlo**. Vas a ver las
tools del conector disponibles. Probá: *"¿qué garantía tengo si compro algo y
sale fallado?"* — debería citarte el artículo correspondiente.

> El `cd` del comando es necesario porque Claude lanza el servidor desde una
> carpeta cualquiera, y el servidor busca `my_tools.py` y `sources.yaml` en el
> directorio actual.

---

## Construí tu propio conector

### 1. Copiá una tool a tu `my_tools.py` y cambiale el texto

Abrí el `my_tools.py` de la raíz. Tiene una tool de ejemplo comentada.
Descomentala (sacale los `#`), poné tu propia respuesta jurídica en `answer` y
elegí un id de fuente para citar. Guiate por el ejemplo de consumidor.

La regla que no podés saltear: si escribís una respuesta en `answer`, **tenés
que** citar al menos una fuente con `src("...")`. Si no encontrás fundamento,
devolvé `GroundedResponse(not_found=True)`.

### 2. Declará tu fuente en `sources.yaml`

`src("mi_fuente")` solo funciona si `mi_fuente` está declarada en `sources.yaml`.
Abrí `sources.yaml`, copiá el bloque de ejemplo y completá la `cita`. Si tenés la
URL oficial verificada, ponela; si no, **dejala vacía** y anotala como pendiente
en `SOURCES.md`. **Nunca inventes una URL.**

### 3. `make check` en verde

```bash
make check
```

(En Windows, los tres comandos de la sección de instalación.) Esto corre el
linter, la validación de tus fuentes y los tests. Si citaste una fuente que no
declaraste, o escribiste una respuesta sin fuente, queda en rojo. Arreglalo hasta
que dé verde.

### 4. Completá el manifiesto

Abrí `mcp-manifest.yaml` y poné tu nombre, tu dominio y la lista de ids de
fuentes que usás. Dejá `review_status: borrador` hasta que un humano revise el
contenido jurídico.

¡Listo! Tenés un conector MCP legal con grounding garantizado.

### 5. Sumá más tools (así enriquecés el contexto del MCP)

Cuantas más tools tenga tu conector, **más temas puede responder con fundamento**
el asistente. Cada tool nueva es como agregarle a Claude un "ayudante" experto en
un punto puntual del derecho. Agregar una es repetir la misma receta, sin tocar
nada raro:

1. **Copiá una tool que ya funcione** (la tuya o una del ejemplo) y pegala más
   abajo en `my_tools.py`, debajo de la anterior. No borres las que ya tenés.
2. **Cambiale el nombre** de la función (la línea `def ...`) por uno nuevo y
   distinto. Dos tools no pueden llamarse igual. Usá un nombre claro, en
   minúsculas y con guiones bajos: `def licencia_por_maternidad(consulta):`.
3. **Reescribí el docstring** (el texto entre `"""..."""` justo debajo del
   `def`): explicá en una frase qué responde. Eso es lo que Claude lee para saber
   cuándo usarla.
4. **Cambiá el `answer`** por tu respuesta jurídica, en lenguaje claro.
5. **Citá la fuente**: poné en `sources=[src("...")]` el id de la norma, y
   declará esa norma en `sources.yaml` (igual que en el paso 2 de arriba). Si no
   tenés fundamento para un caso, devolvé `GroundedResponse(not_found=True)`.
6. **Corré `make check`.** Si te olvidaste de declarar una fuente, o escribiste
   una respuesta sin cita, el check te lo marca en rojo y te dice qué arreglar.
   Verde = tu tool nueva ya cumple el contrato y suma al conector.

Repetí esto cuantas veces quieras. No hay un paso 7: no tenés que "registrar" la
tool en ningún otro lado ni avisarle al servidor. Con solo escribirla con
`@grounded_tool` arriba, ya queda disponible la próxima vez que levantes el
conector.

> **La regla de siempre, también acá:** una tool sin fuente no entra. Si dudás de
> dónde sale una afirmación, no la afirmes: usá `not_found=True` y, si hace falta,
> sugerí consultar la fuente oficial o a un humano.

---

## Cómo está armado (para curiosos)

```
.
├── my_tools.py          ← TU código (lo editás vos)
├── sources.yaml         ← TUS fuentes (las declarás vos)
├── SOURCES.md           ← de dónde sale cada fuente
├── mcp-manifest.yaml    ← metadatos de tu conector
├── legalmcp/            ← el harness (NO se toca)
│   ├── contract.py      ← GroundedResponse, Source, @grounded_tool (fail-closed)
│   ├── sources.py       ← carga/valida sources.yaml; src(id) resuelve o se rompe
│   └── server.py        ← arma el server FastMCP y registra tus tools
├── tests/               ← prueban que el contrato sirve
└── examples/consumidor/ ← ejemplo completo y forkeable
```

El harness es fino y se apoya **directo en el SDK oficial de MCP (FastMCP)**: no
hay lenguaje propio ni compilador que se pueda pudrir cuando el SDK evolucione.

### Comandos

| Comando | Qué hace |
|---|---|
| `make install` | Instala el harness y las dependencias |
| `make dev` | Levanta tu servidor MCP |
| `make test` | Corre los tests |
| `make check` | Linter + validación de fuentes + tests (lo que mira CI) |

---

## Seguridad

¿Encontraste una vulnerabilidad? Por favor reportala **en privado** antes de
divulgarla. Mirá [SECURITY.md](SECURITY.md) — el contacto es
**gbaros@palermo.edu**.

## Autores

- Guido Barosio
- Juan Cruz Romano
- Hernán Quadri
- Aníbal Ramírez

## Licencia

Distribuido bajo la licencia **BSD 3-Clause**. Ver [LICENSE](LICENSE).

Maintenance

ActivityStale
ResponsivenessNo issues