# Local MCP Test Server
Servidor MCP (Model Context Protocol) de pruebas locales que expone herramientas meteorológicas mediante transporte SSE, compatible con dispositivos móviles (iOS/Android).
## Características
- **Transporte SSE** para conexión desde apps móviles en red local
- **API Open-Meteo** (gratuita, sin API key)
- **FastMCP** para registro automático de herramientas
- **Compatible con Qwen 2.5** y otros LLMs
## Stack Tecnológico
| Componente | Tecnología |
|------------|------------|
| Lenguaje | Python 3.11+ |
| Framework MCP | mcp[cli] + FastMCP |
| Cliente HTTP | httpx (async) |
| Servidor ASGI | uvicorn + starlette |
## Requisitos
- Python 3.11+
- pip o uv
## Instalación
```bash
# Clonar repositorio
git clone https://github.com/cserra16/local-mcp-test-server.git
cd local-mcp-test-server
# Crear entorno virtual
python3 -m venv venv
source venv/bin/activate
# Instalar dependencias
pip install -r requirements.txt
```
## Ejecución
```bash
source venv/bin/activate
python app.py
```
El servidor iniciará en `http://0.0.0.0:8000` con transporte SSE.
## Endpoints MCP
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | `/sse` | Handshake SSE (obtiene session_id) |
| POST | `/messages/?session_id=...` | Mensajes JSON-RPC |
## Herramientas Disponibles
### `get_weather_lhospitalet`
Obtiene el clima actual de L'Hospitalet de Llobregat (Barcelona).
**Triggers:** El LLM invocará esta herramienta cuando el usuario pregunte por el clima en:
- L'Hospitalet de Llobregat
- Hospitalet
- Hospi
- L'Hospi
- L'H
**Retorna:** Temperatura (°C), humedad relativa (%) y estado del cielo.
**Ejemplo de respuesta:**
```
Clima en L'Hospitalet de Llobregat: 18.5°C, Humedad: 65%, Estado del cielo: Parcialmente nublado. Datos provistos por Open-Meteo.
```
## Pruebas
### Con MCP Inspector (recomendado)
```bash
npx -y @modelcontextprotocol/inspector http://localhost:8000/sse
```
### Test con Python
```python
import asyncio
from mcp import ClientSession
from mcp.client.sse import sse_client
async def test():
async with sse_client('http://localhost:8000/sse') as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
result = await session.call_tool('get_weather_lhospitalet', {})
print(result.content[0].text)
asyncio.run(test())
```
### Desde el navegador
Acceder a `http://localhost:8000/sse` para verificar eventos SSE.
## Conexión desde iOS
1. Asegúrate de que el iPhone esté en la misma red Wi-Fi
2. Obtén la IP local: `ipconfig getifaddr en0`
3. Conecta desde la app iOS a `http://<IP-LOCAL>:8000/sse`
## Estructura del Proyecto
```
local-mcp-test-server/
├── app.py # Servidor MCP principal
├── requirements.txt # Dependencias
├── pyproject.toml # Configuración del proyecto
└── README.md
```
## Licencia
MIT