fed-aura-risk-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fed-aura-risk-mcpWhat's the loan recommendation for a borrower with 720 credit score and 42% DTI?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Risk Assessment MCP Server
A mortgage risk underwriting server built on FastMCP 3.x that exposes individual risk calculation tools and an aggregation tool for producing loan recommendations. Built from the FastMCP server template.
Tools
Tool | Description |
| Debt-to-Income ratio from monthly income and debts |
| Loan-to-Value ratio from loan amount and property value |
| Credit risk rating from borrower credit score |
| Income stability from employment statuses of all borrowers |
| Asset reserve adequacy relative to loan amount |
| 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.
{"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.
{"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.
{"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.
{"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.
{"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.
{
"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
}Related MCP server: MCP Mortgage Server
Quick Start
Local Development
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
make deploy PROJECT=mcp-risk-serverThe server is deployed at:
https://mcp-server-mcp-risk-server.apps.cluster-z9hbt.z9hbt.sandbox1495.opentlc.com/mcp/
Testing
# 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-localArchitecture
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 |
|
| Transport mode: |
|
| HTTP bind address |
|
| HTTP port |
|
| HTTP endpoint path |
|
| Logging level |
|
| Enable hot-reload for development |
|
| Server name in MCP responses |
| (none) | JWT algorithm (e.g., RS256). Auth disabled if unset |
| (none) | Shared secret for HMAC algorithms |
| (none) | Public key for RSA/EC algorithms |
| (none) | JWKS endpoint URL |
| (none) | Expected token issuer |
| (none) | Expected token audience |
| (none) | Comma-separated default required scopes |
License
This project is licensed under the MIT License. See the LICENSE file for details.
Available Tools
6 toolsassess_asset_sufficiencyAssess Asset SufficiencyARead-onlyIdempotent
Assess whether the borrower has sufficient asset reserves relative to the loan amount.
| Name | Required | Description | Default |
|---|---|---|---|
| loan_amount | Yes | Requested loan amount in dollars | |
| total_assets | Yes | Total verified assets in dollars |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and idempotentHint=true, so the description adds little behavioral detail beyond stating the assessment. It does not contradict annotations, but it also does not describe any additional side effects, output shape, or edge-case behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence with no filler, front-loading the core action and resource. Every word contributes to the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter, read-only tool with fully documented parameters and an output schema, the description is complete enough. The agent knows exactly what inputs to pass and what question the tool answers; return values are presumably covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both parameters described ('Requested loan amount in dollars', 'Total verified assets in dollars'). The description only adds the relationship between them, which is the tool's purpose, so it does not need to compensate for missing schema detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Assess') and identifies a precise resource: the borrower's asset reserves relative to the loan amount. This clearly distinguishes it from sibling tools like assess_income_stability, calculate_dti, calculate_ltv, and evaluate_credit_risk.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it—when the question is about asset reserves vs loan amount—but provides no explicit when/when-not guidance or named alternatives. The presence of sibling tools is not leveraged to steer selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assess_income_stabilityAssess Income StabilityARead-onlyIdempotent
Assess income stability risk based on borrower employment statuses.
| Name | Required | Description | Default |
|---|---|---|---|
| employment_statuses | Yes | List of employment statuses for all borrowers. Valid values: w2_employee, self_employed, retired, unemployed, other |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent, and the description does not contradict them. The description adds no extra behavioral detail beyond restating the purpose, but given the annotations cover the safety profile and an output schema exists, this is minimally adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word earns its place by naming the action, target, and input source.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with a fully described schema, read-only/idempotent annotations, and an output schema, the description sufficiently covers the core behavior. It lacks only optional guidance about interpretation or use cases, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description lists valid employment statuses. The tool description adds no additional meaning beyond the schema, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('assess') and resource ('income stability risk') and clarifies the input basis ('borrower employment statuses'). This clearly distinguishes it from sibling tools like assess_asset_sufficiency or calculate_dti, which address different risk dimensions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for assessing income stability when employment statuses are available, but it does not explicitly state conditions, prerequisites, or when to prefer an alternative sibling tool. No exclusions or alternative routing are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_dtiCalculate DtiARead-onlyIdempotent
Calculate the Debt-to-Income (DTI) ratio for mortgage risk assessment.
| Name | Required | Description | Default |
|---|---|---|---|
| monthly_debts | Yes | Total monthly debt obligations in dollars | |
| monthly_income | Yes | Total monthly gross income in dollars |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description does not need to restate safety. The description adds the mortgage-assessment framing but does not disclose the calculation formula or behavior beyond naming the ratio. This is adequate given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise, well-formed sentence that states the action, the subject, and the domain. Every word earns its place and the key purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, two-parameter calculation with a full input schema, output schema, and safety annotations, the description is nearly complete. The only minor gap is that it does not explicitly state the DTI formula, but an agent can reasonably infer it from the parameter names and the term 'ratio.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are fully documented in the schema. The description adds no additional meaning about the parameters themselves, which is acceptable because the schema already carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Calculate') with a concrete resource ('Debt-to-Income (DTI) ratio') and adds the application context 'for mortgage risk assessment.' This clearly distinguishes it from siblings like calculate_ltv (loan-to-value) and evaluate_credit_risk (broader risk evaluation).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for mortgage risk assessment' implies a relevant use case, but there is no explicit guidance about when to choose this tool over related siblings such as assess_income_stability or evaluate_credit_risk. The context is clear enough to infer basic usage, but alternatives are not discussed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_ltvCalculate LtvBRead-onlyIdempotent
Calculate the Loan-to-Value (LTV) ratio for mortgage risk assessment.
| Name | Required | Description | Default |
|---|---|---|---|
| loan_amount | Yes | Requested loan amount in dollars | |
| property_value | Yes | Appraised property value in dollars |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the annotations (readOnlyHint=true, idempotentHint=true) and contains no contradiction. It does not add behavioral details beyond what the annotations already declare, such as side-effect-free operation or output characteristics. For a simple calculation this is acceptable, but the description contributes little extra behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler or redundant wording. It conveys the action, the specific ratio, and the context efficiently, earning a top score for structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only, idempotent calculation with an output schema, the description is nearly complete. It identifies the domain and the metric, and the output schema covers return details. It lacks an explicit formula and usage guidance against siblings, but these are minor for a standard financial calculation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% description coverage for both parameters, including units ('in dollars'), so the schema carries the semantic weight. The description does not add parameter-level detail or explicitly state the ratio formula (loan_amount / property_value). This meets the baseline but does not improve on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Calculate') and identifies a precise resource: the Loan-to-Value (LTV) ratio, with the domain context 'for mortgage risk assessment'. This clearly conveys the operation without being a tautology. However, it does not explicitly differentiate itself from sibling tools like calculate_dti, leaving the distinction to the well-known meaning of LTV.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided about when to choose this tool over alternatives such as calculate_dti or evaluate_credit_risk. The phrase 'for mortgage risk assessment' gives a broad context but does not state selection criteria, exclusions, or prioritize one sibling over another. An agent must infer usage from the tool's name and standard financial knowledge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_credit_riskEvaluate Credit RiskBRead-onlyIdempotent
Evaluate credit risk based on the borrower's credit score.
| Name | Required | Description | Default |
|---|---|---|---|
| source | No | Source of credit score | self_reported |
| credit_score | Yes | Borrower's credit score (300-850) |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description is consistent with those. However, the description adds no additional behavioral context beyond that, such as edge-case handling, impact of the source parameter, or any constraints on the evaluation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that immediately names the action and the key input. It contains no filler, redundancy, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, read-only tool with full parameter documentation and an output schema, the description is mostly sufficient. The main gap is the lack of guidance on how the tool fits among its siblings, which an agent needs for reliable selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both credit_score and source are already documented in the schema. The description only reinforces that credit score is the basis for the evaluation without adding deeper meaning, especially for the optional source parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Evaluate'), a resource ('credit risk'), and a criterion ('borrower's credit score'), which clearly indicates the tool's purpose. It is reasonably distinguishable from siblings like calculate_dti or assess_asset_sufficiency, though it does not explicitly name or contrast itself with a sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives such as generate_risk_recommendation or assess_income_stability. It implies that a credit score is needed, but it does not state conditions, exclusions, or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_risk_recommendationGenerate Risk RecommendationARead-onlyIdempotent
Generate a comprehensive risk recommendation based on all assessment factors.
This aggregator tool combines individual risk assessments (DTI, LTV, credit, income stability, asset sufficiency) to produce a final recommendation: Approve, Approve with Conditions, Suspend, or Deny.
| Name | Required | Description | Default |
|---|---|---|---|
| dti_value | Yes | Calculated DTI ratio percentage | |
| ltv_value | Yes | Calculated LTV ratio percentage | |
| dti_rating | Yes | DTI risk rating: Low, Medium, or High | |
| ltv_rating | Yes | LTV risk rating: Low, Medium, or High | |
| asset_rating | Yes | Asset sufficiency rating: Low, Medium, or High | |
| credit_score | Yes | Borrower's credit score | |
| credit_rating | Yes | Credit risk rating: Low, Medium, or High | |
| income_rating | Yes | Income stability rating: Low, Medium, or High | |
| ml_confidence | No | Optional ML model confidence score | |
| ml_prediction | No | Optional ML model prediction | |
| document_count | Yes | Number of supporting documents provided | |
| has_credit_report | Yes | Whether a credit report has been obtained | |
| has_financial_docs | Yes | Whether financial documents have been provided | |
| employment_statuses | Yes | Employment statuses of all borrowers |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds behavioral value by explaining that the tool synthesizes multiple assessments into one of four final decisions. It does not detail internal weighting or decision rules, but that is not necessary given the output schema and annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the first sentence stating the exact action and object. The second sentence adds the aggregator context and output options without any filler, making every sentence informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter aggregator, the description clearly conveys what the inputs represent and what the output will be, while the output schema covers return structure. It could be slightly stronger by explicitly instructing the agent to run the sibling assessment tools first, but the aggregator language makes that reasonably clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema. The description only groups the parameters at a high level ('DTI, LTV, credit, income stability, asset sufficiency') without adding new semantics, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Generate'), names the resource ('risk recommendation'), and clearly identifies the tool as an aggregator that combines DTI, LTV, credit, income, and asset assessments. This makes it easy to distinguish from the sibling individual assessment tools. It also lists the four possible recommendation outcomes, further clarifying the tool's exact purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description frames the tool as the final aggregation step over individual risk assessments, so an agent can infer it should be used after the component tools have produced their ratings. It does not explicitly name alternatives or state when not to use it, but the 'aggregator tool' phrasing provides clear contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
assess_asset_sufficiency - First observed
assess_income_stability - First observed
calculate_dti - First observed
calculate_ltv - First observed
evaluate_credit_risk - First observed
generate_risk_recommendation
TDQS
Scored across 6 tools
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.
All tool names follow a consistent verb_noun snake_case pattern: calculate_, assess_, evaluate_, generate_. This makes the set predictable and easy to navigate.
Six tools is well-scoped for a mortgage risk assessment server, covering individual risk factors and an aggregator without unnecessary redundancy.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Deterministic Canadian mortgage calculations for qualification, debt service, LTV, and penalties.
Deterministic real estate underwriting, deal analysis & reports: Fix & Flip, BRRRR, construction.
Credit score and risk analysis of a person or company. Platform-hosted, no credentials, pay per quer
Connect AI agents to financial institution origination, analytics, and compliance workflows.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceEnables creditworthiness analysis for non-traditional borrowers using rule-based scoring, financial behavior assessment, and underwriting report generation via MCP tools.1-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to parse and analyze mortgage documents (Loan Estimates & Closing Disclosures), converting them into structured MISMO-compliant JSON and checking for TRID compliance violations.2MIT
- FlicenseNot gradedqualityCmaintenanceLoan officer assistant that uses Claude AI and Plaid banking API to assess loan applicants by pulling financial data and returning structured eligibility verdicts.-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to assess credit default risk, run what-if scenarios, and evaluate portfolios through natural language, backed by an explainable XGBoost model.-