A Model Context Protocol (MCP) server that provides access to the Appraisal Firewall API for appraisal ordering and management.
- Order Creation: Create residential and commercial appraisal orders
- Messaging: Send messages to appraisers through the platform
- Order Management: Retrieve order details and status
- Webhook Support: Receive real-time updates from Appraisal Firewall
- Demo Mode: Test endpoints with mock responses
- Clone or download the server files
- Install dependencies:
npm install
- Configure environment variables (see Configuration section)
- Start the server:
npm start
Set up your environment variables. You can either:
-
Use environment variables:
export AF_API_KEY="your_api_key" export AF_API_SECRET="your_api_secret" export AF_BASE_URL="https://uat.appraisalfirewall.com/api" export AF_ENVIRONMENT="UAT"
-
Use a .env file:
AF_API_KEY=your_api_key AF_API_SECRET=your_api_secret AF_BASE_URL=https://uat.appraisalfirewall.com/api AF_ENVIRONMENT=UAT
POST /api/create-residential- Create residential appraisal orderPOST /api/create-commercial- Create commercial appraisal orderPOST /api/message- Send message to appraiserGET /api/order/:losuniqueid- Get order detailsPOST /api/webhook- Receive updates from Appraisal Firewall
GET /- Server info and available endpointsGET /health- Health checkGET /api/info- Configuration and status info
GET /test- Demo endpoints overviewPOST /test/create-residential- Demo residential order creationPOST /test/create-commercial- Demo commercial order creationPOST /test/message- Demo message sendingGET /test/order/:losuniqueid- Demo order details
curl -X POST https://your-server.railway.app/api/create-residential \
-H "Content-Type: application/json" \
-d '{
"originatoremail": "originator@company.com",
"webhookurl": "https://your-server.railway.app/api/webhook",
"losuniqueid": "LOS123456",
"property": {
"street": "123 Main St",
"city": "Post Falls",
"zip": "83854",
"state": "ID",
"county": "Kootenai"
},
"borrower": {
"firstname": "John",
"lastname": "Doe",
"email": "john@doe.com"
},
"saleprice": 555555,
"loannumber": "12341234",
"loantype": "Purchase",
"daterequired": "04/28/2024"
}'curl -X POST https://your-server.railway.app/api/create-commercial \
-H "Content-Type: application/json" \
-d '{
"originatoremail": "originator@company.com",
"webhookurl": "https://your-server.railway.app/api/webhook",
"losuniqueid": "LOS789012",
"borrower": {
"firstname": "John",
"lastname": "Doe",
"email": "john@doe.com"
},
"loannumber": "1234",
"salesprice": "1250000",
"property": {
"street": "1234 W. Main St.",
"city": "Spokane",
"state": "WA",
"zip": "99016",
"county": "Spokane"
},
"commercialdata": {
"propertytype": "Office Building",
"size": "25000 sq ft",
"reporttype": "Summary",
"valueapproachcost": true,
"valueapproachincome": false,
"valueapproachsales": true,
"propertyinterest": "Fee Simple"
}
}'curl -X POST https://your-server.railway.app/api/message \
-H "Content-Type: application/json" \
-d '{
"losuniqueid": "LOS123456",
"message": "Please expedite this appraisal order"
}'curl https://your-server.railway.app/api/order/LOS123456Test the functionality without real API credentials:
# Demo residential order
curl -X POST https://your-server.railway.app/test/create-residential \
-H "Content-Type: application/json" \
-d '{
"property": {
"street": "123 Demo St",
"city": "Test City",
"state": "ID",
"zip": "83854"
},
"borrower": {
"firstname": "Demo",
"lastname": "User"
},
"saleprice": 350000
}'The server includes a webhook endpoint at /api/webhook that receives updates from Appraisal Firewall. Webhook payloads include:
- Order status updates (statusset)
- Messages from appraisers (message)
- Attachments and documents (attachment)
- Billing information (billing)
Example webhook payload:
{
"losuniqueid": "LOS123456",
"kind": "statusset",
"logdate": "12/14/2021 21:00:32",
"comment": "Accepted by the appraiser",
"datedelivered": "12/14/2021 21:00:32",
"fromkind": "Appraiser",
"attachments": [
{
"kind": "appraisal",
"filename": "appraisal_report.pdf",
"url": "https://download-url.com/file"
}
]
}The residential order supports various property classifications:
waterfront- Waterfront propertymanufactured- Manufactured homesinglefamily- Single family homecondo- Condominiumtwofour- 2-4 unit propertyfha- FHA loanva- VA loanusda- USDA loanjumbo- Jumbo loanrush- Rush ordercomplex- Complex property
For commercial appraisals:
propertytype- Type of commercial propertysize- Property sizereporttype- Type of appraisal reportvalueapproachcost- Include cost approachvalueapproachincome- Include income approachvalueapproachsales- Include sales approachpropertyinterest- Property interest type
AF_ENVIRONMENT=UAT
AF_BASE_URL=https://uat.appraisalfirewall.com/api
AF_API_KEY=your_uat_api_key
AF_API_SECRET=your_uat_api_secretAF_ENVIRONMENT=Production
AF_BASE_URL=https://api.appraisalfirewall.com
AF_API_KEY=your_prod_api_key
AF_API_SECRET=your_prod_api_secretThe server handles common API errors:
- Authentication errors - Invalid API key/secret
- Validation errors - Missing required fields
- Network errors - Connection issues with Appraisal Firewall
All errors are returned with descriptive messages to help with debugging.
- Create new Railway project
- Connect your repository
- Set environment variables in Railway dashboard
- Deploy
NODE_ENV=production
AF_ENVIRONMENT=Production
AF_API_KEY=your_production_api_key
AF_API_SECRET=your_production_api_secret
AF_BASE_URL=https://api.appraisalfirewall.com
PORT=3000For Appraisal Firewall API issues, contact their support team.
For server issues:
- Check environment variables are set correctly
- Verify API credentials are valid
- Check network connectivity to Appraisal Firewall API
- Review server logs for detailed error information
- Never commit API credentials to version control
- Use environment variables for all sensitive configuration
- Validate webhook payloads in production
- Consider implementing additional authentication for public deployments
- Monitor API usage to prevent abuse
- Create appraisal order (residential or commercial)
- Monitor webhook for status updates
- Send messages to appraiser as needed
- Receive completed appraisal via webhook
- Create order with specific requirements
- Upload additional documents
- Track order progress via webhooks
- Handle appraiser communications
- Process completed deliverables
- Handle billing notifications