Skip to main content
Glama
rdwj

fed-aura-risk-mcp

by rdwj
README.md
# Risk Assessment MCP Server

A mortgage risk underwriting server built on [FastMCP 3.x](https://gofastmcp.com) that exposes individual risk calculation tools and an aggregation tool for producing loan recommendations. Built from the [FastMCP server template](https://github.com/redhat-ai-americas/mcp-server-template).

## Tools

| Tool | Description |
|------|-------------|
| `calculate_dti` | Debt-to-Income ratio from monthly income and debts |
| `calculate_ltv` | Loan-to-Value ratio from loan amount and property value |
| `evaluate_credit_risk` | Credit risk rating from borrower credit score |
| `assess_income_stability` | Income stability from employment statuses of all borrowers |
| `assess_asset_sufficiency` | Asset reserve adequacy relative to loan amount |
| `generate_risk_recommendation` | Aggregator: combines all risk factors into Approve / Approve with Conditions / Suspend / Deny |

### calculate_dti

Computes the Debt-to-Income ratio as a percentage. Rates Low below 36%, Medium at 36--43%, High above 43%.

**Parameters:** `monthly_income` (float), `monthly_debts` (float)

**Returns:** JSON with `metric`, `value`, `rating`, `guidance`.

```json
{"monthly_income": 8000, "monthly_debts": 2400}
```

### calculate_ltv

Computes the Loan-to-Value ratio as a percentage. Rates Low below 60%, Medium at 60--80%, High above 80%. Includes `pmi_required` flag.

**Parameters:** `loan_amount` (float), `property_value` (float)

**Returns:** JSON with `metric`, `value`, `rating`, `guidance`, `pmi_required`.

```json
{"loan_amount": 320000, "property_value": 400000}
```

### evaluate_credit_risk

Evaluates credit risk from a FICO-range score (300--850). Rates Low above 680, Medium at 620--680, High below 620.

**Parameters:** `credit_score` (int), `source` (str, default `"self_reported"`)

**Returns:** JSON with `metric`, `value`, `rating`, `guidance`, `source`.

```json
{"credit_score": 720, "source": "experian"}
```

### assess_income_stability

Takes a list of employment statuses for all borrowers and returns the worst-case rating. Valid statuses: `w2_employee`, `self_employed`, `retired`, `unemployed`, `other`.

**Parameters:** `employment_statuses` (list of strings)

**Returns:** JSON with `metric`, `statuses`, `rating`, `guidance`, `individual_ratings`.

```json
{"employment_statuses": ["w2_employee", "self_employed"]}
```

### assess_asset_sufficiency

Checks asset reserves as a percentage of the loan amount. Rates Low above 20%, Medium at 10--20%, High below 10%.

**Parameters:** `total_assets` (float), `loan_amount` (float)

**Returns:** JSON with `metric`, `value`, `rating`, `guidance`.

```json
{"total_assets": 90000, "loan_amount": 350000}
```

### generate_risk_recommendation

Aggregates all five risk assessments plus document status and optional ML predictions into a final underwriting decision. The decision logic applies deny triggers (DTI > 55%, credit < 580, LTV > 97%, all borrowers unemployed), suspend triggers (missing documents), and conditional triggers (PMI, elevated DTI, self-employment documentation). Compensating factors such as strong credit offsetting high DTI are also considered.

**Parameters:** `dti_value`, `dti_rating`, `ltv_value`, `ltv_rating`, `credit_score`, `credit_rating`, `income_rating`, `asset_rating`, `employment_statuses`, `has_financial_docs`, `has_credit_report`, `document_count`, `ml_prediction` (optional), `ml_confidence` (optional)

**Returns:** JSON with `recommendation`, `rationale`, `conditions`, `compensating_factors`, `overall_risk`, `warnings`, `risk_summary`.

```json
{
  "dti_value": 38.5, "dti_rating": "Medium",
  "ltv_value": 75.0, "ltv_rating": "Medium",
  "credit_score": 720, "credit_rating": "Low",
  "income_rating": "Low", "asset_rating": "Low",
  "employment_statuses": ["w2_employee"],
  "has_financial_docs": true,
  "has_credit_report": true,
  "document_count": 5
}
```

## Quick Start

### Local Development

```bash
make install
make run-local

# In another terminal, test with cmcp
cmcp ".venv/bin/python -m src.main" tools/list
cmcp ".venv/bin/python -m src.main" tools/call calculate_dti '{"monthly_income": 8000, "monthly_debts": 2400}'
```

### Deploy to OpenShift

```bash
make deploy PROJECT=mcp-risk-server
```

The server is deployed at:
`https://mcp-server-mcp-risk-server.apps.cluster-z9hbt.z9hbt.sandbox1495.opentlc.com/mcp/`

## Testing

```bash
# Run all 53 tests
make test

# Run a single test file
.venv/bin/pytest tests/test_risk_calculations.py -v

# Test against local STDIO server with cmcp
make test-local
```

## Architecture

The server uses FastMCP 3.x with `FileSystemProvider` for automatic tool discovery. Tools use standalone `@tool` decorators (no shared server instance). The server runs in STDIO mode locally and uses streamable-http transport on port 8080 when deployed to OpenShift.

Tool source lives in two files under `src/tools/`: `risk_calculations.py` (five calculation tools) and `risk_recommendation.py` (the aggregation tool). The recommendation logic is factored into a pure `compute_recommendation()` function for direct use in tests.

## Environment Variables

| Variable | Default | Purpose |
|----------|---------|---------|
| `MCP_TRANSPORT` | `stdio` | Transport mode: `stdio` or `http` |
| `MCP_HTTP_HOST` | `127.0.0.1` | HTTP bind address |
| `MCP_HTTP_PORT` | `8000` | HTTP port |
| `MCP_HTTP_PATH` | `/mcp/` | HTTP endpoint path |
| `MCP_LOG_LEVEL` | `INFO` | Logging level |
| `MCP_HOT_RELOAD` | `0` | Enable hot-reload for development |
| `MCP_SERVER_NAME` | `fastmcp-unified` | Server name in MCP responses |
| `MCP_AUTH_JWT_ALG` | *(none)* | JWT algorithm (e.g., RS256). Auth disabled if unset |
| `MCP_AUTH_JWT_SECRET` | *(none)* | Shared secret for HMAC algorithms |
| `MCP_AUTH_JWT_PUBLIC_KEY` | *(none)* | Public key for RSA/EC algorithms |
| `MCP_AUTH_JWT_JWKS_URI` | *(none)* | JWKS endpoint URL |
| `MCP_AUTH_JWT_ISSUER` | *(none)* | Expected token issuer |
| `MCP_AUTH_JWT_AUDIENCE` | *(none)* | Expected token audience |
| `MCP_AUTH_REQUIRED_SCOPES` | *(none)* | Comma-separated default required scopes |

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct risk factor or calculation: DTI, LTV, credit, income stability, asset sufficiency, and final recommendation. There is no meaningful overlap between tool purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern: calculate_, assess_, evaluate_, generate_. This makes the set predictable and easy to navigate.

Tool Count5/5

Six tools is well-scoped for a mortgage risk assessment server, covering individual risk factors and an aggregator without unnecessary redundancy.

Completeness5/5

The tool set covers the full stated workflow: calculating key ratios, assessing borrower risks, evaluating credit, and producing a final recommendation. There are no obvious dead ends or missing critical operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues