Skip to main content
Glama
zarrinmonirzadeh

Agentic Travel Recommendations Service

README.md
# Agentic Travel Recommendations Service

A working proof-of-concept for an agent-discoverable travel recommendations API.

## What is included

- FastAPI backend
- Mock member profile and partner-configuration services
- Partner-specific recommendation caps
- Partner-specific category exclusions
- MCP-compatible JSON-RPC endpoint
- MCP tool discovery via `tools/list`
- MCP tool invocation via `tools/call`
- REST API
- Minimal browser UI
- Automated tests

## Run locally

```bash
python -m venv .venv

# macOS/Linux
source .venv/bin/activate

# Windows PowerShell
.venv\Scripts\Activate.ps1

pip install -r requirements.txt
uvicorn app.main:app --reload
```

Open:

- UI: http://127.0.0.1:8000
- Swagger: http://127.0.0.1:8000/docs
- Health: http://127.0.0.1:8000/health

## REST example

```bash
curl -X POST http://127.0.0.1:8000/api/recommendations \
  -H "Content-Type: application/json" \
  -d '{
    "member_id": "member-1001",
    "partner_id": "premium-bank",
    "destination": "Portland",
    "limit": 10
  }'
```

## MCP discovery example

```bash
curl -X POST http://127.0.0.1:8000/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/list",
    "params": {}
  }'
```

## MCP invocation example

```bash
curl -X POST http://127.0.0.1:8000/mcp \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "get_recommendations",
      "arguments": {
        "member_id": "member-1001",
        "partner_id": "premium-bank",
        "destination": "Portland",
        "limit": 10
      }
    }
  }'
```

## Sample IDs

Members:

- `member-1001`
- `member-1002`
- `member-1003`

Partners:

- `premium-bank`
- `family-club`
- `business-card`

## Partner-rule examples

- `premium-bank`: maximum 5 results; excludes `hostel`
- `family-club`: maximum 4 results; excludes `nightlife` and `casino`
- `business-card`: maximum 3 results; excludes `hostel`, `nightlife`, and `casino`

## Test

```bash
pytest
```

## Design notes

The recommendation engine first scores candidates against a mocked member profile, then applies the partner policy before returning results. Policy enforcement is performed server-side, so a client or agent cannot bypass recommendation caps or excluded categories.

Maintenance

ActivitySlowing
ResponsivenessNo issues