MCP Tools Documentation
Overview of available tools, workflows, and integration points exposed to your account.
MortyCP Tools Reference
Complete reference for all 41 MCP tools available in the MortyCP server. Each tool section lists the bare minimum required fields and important optional fields.
🏠 Loan Management Tools (11 tools)
create_loan
Purpose: Create a new loan with complete commitment details.
Required Fields:
loan_title(string) - Title/name for the loanpurpose(number: 0 or 1) - 0=Refinance, 1=Purchaseloan_amount(number) - Loan amount (will be converted to mortgage.amount)
Important Optional Fields:
property(object) - Property information with addressmortgage_type(0-4) - 0=Standard, 1=Construction, 2=Commercial, 3=Fix & Flip, 4=Personalinterest(number) - Interest rate as percentageterm(number) - Term in monthsfrequency(0-3, 7) - Payment frequency: 0=Monthly, 1=Semi-Monthly, 2=Weekly, 3=Bi-Weekly, 7=Quarterlyexisting_mortgages(array) - Existing mortgages on the propertyother_properties(array) - Additional properties beyond the primary property
Notes: - Automatically checks for duplicate loans (85% similarity threshold) before creating - Returns existing loan if duplicate found within 30 seconds - Supports extensive fee configuration (broker, lender, admin, placement, title, etc.) - Property address is optional but recommended - Can create loans with existing mortgages and other properties in a single call
get_loan
Purpose: Retrieve detailed information about a specific loan.
Required Fields:
loan_id(number) - The ID of the loan to retrieve
Important Optional Fields:
response_field_whitelist(array of strings) - Specific fields to include in response
Notes: - Returns full loan object with all related data (borrowers, investors, property, etc.) - Use response_field_whitelist to limit response size for better performance
list_loans
Purpose: List loans with pagination and filtering.
Required Fields:
- None (all fields optional)
Important Optional Fields:
start(number, default: 0) - Pagination start position (0-based)limit(number, 1-100, default: 50) - Number of loans to returnstatus(string: 'active', 'pending', 'completed', 'cancelled') - Filter by statusresponse_field_whitelist(array) - Additional fields beyond defaults
Notes: - Always returns: loan_seq_id, loan_title, status, substatus, investors - API always returns max 50 per request, use start for pagination - Use next value from response to get next page
update_loan
Purpose: Update an existing loan with property, mortgage, or other details.
Required Fields:
loan_id(number) - The loan ID to update
Important Optional Fields:
loan_title(string) - Update loan titlesubstatus(number) - Update loan substatusproperty(object) - Update property information (address required if provided)holdback_amount(number) - Holdback/PPI amount for construction loanscustom_fees(array) - Custom fees array
Notes: - Uses /loans/create endpoint with loan_id to update - Property address fields (street, city, prov, zip) are required if property object is provided - Cannot update mortgages via this tool - use create_existing_mortgage instead - Can add property details after creating a minimal loan
list_substatuses
Purpose: List available loan substatuses for the account.
Required Fields:
- None
Notes: - Returns all substatuses configured for your account - Use substatus IDs when updating loans
get_existing_mortgage
Purpose: Get existing mortgage details by ID.
Required Fields:
id(number) - The existing mortgage ID (not loan_id)
Important Optional Fields:
response_field_whitelist(array of strings) - Specific fields to include in response
Notes: - Requires the existing mortgage ID, not the loan ID - Returns details of a specific existing mortgage including holder, face value, balance, payment, etc.
create_existing_mortgage
Purpose: Create an existing mortgage record for a loan.
Required Fields:
loan_id(number) - The loan ID
Important Optional Fields:
type(1-7) - Mortgage type: 1=First, 2=Second, 3=Third, etc.holder(string) - Mortgage holder nameface_value(number) - Face value of the mortgagebalance(number) - Current balancepayment(number) - Payment amountfrequency(0-2) - 0=Monthly, 1=Weekly, 2=Biweeklyinterest_rate(number) - Interest rate as percentage
Notes: - Use this to add existing mortgages to a loan after creation - Cannot be added via update_loan tool
update_existing_mortgage
Purpose: Update existing mortgage information.
Required Fields:
id(number) - The existing mortgage ID to update (not loan_id)
Important Optional Fields:
loan_id(number) - The loan ID this existing mortgage is associated with- All fields from
create_existing_mortgageare optional for updates
Notes: - Requires the existing mortgage ID, not the loan ID —
create_other_property
Purpose: Create an additional property for a loan (beyond the primary property).
Required Fields:
loan_id(number) - The loan IDaddress(object) - Property address with street, city, prov, zip
Important Optional Fields:
value(number) - Property valueproperty_tax(number) - Property tax amountis_blanket(0 or 1) - 0=Tagged property, 1=Blanket property
Notes: - Each property requires an address - Can add multiple properties to a loan - Some fields (jurisdiction, property_pin, etc.) are only available for primary property
get_other_property
Purpose: Get other property details by property ID.
Required Fields:
property_id(number) - The other property ID (not other_property_id)
Notes: - Requires the property_id, not loan_id - Returns property information including address, value, property tax, condo fees, etc. —
update_other_property
Purpose: Update other property information.
Required Fields:
property_id(number) - The other property ID (not other_property_id)
Important Optional Fields:
- All fields from
create_other_propertyare optional for updates
Notes: - Requires the property_id, not loan_id —
👥 Borrower Management Tools (6 tools)
create_borrower
Purpose: Create a new borrower with personal information, contact details, and financial data.
Required Fields:
first_name(string) - First namelast_name(string) - Last name
Important Optional Fields:
email(string) - Email addresshomephone(string) - Home phone (or usephonewhich maps to homephone)mobile(string) - Mobile phoneaddress(object) - Address with street, city, prov, zip, countrydob(number) - Date of birth as Unix timestampssn(string) - Social Security Numbercredit_score(number, 0-850) - Credit scoreiscorporation(0 or 1) - 0=Individual, 1=Corporationcorpname(string) - Company name (required if corporation)employments(array) - Employment informationincomes(array) - Income informationdebts(array) - Debt informationassets(array) - Asset information
Notes: - Automatically checks for duplicates by matching first/last name, email, or phone numbers - If duplicate found and duplication_mode=0 (default), returns existing borrower instead of creating - Set duplication_mode=1 to create anyway even if duplicate exists - Use skip_duplicate_check=true to bypass pre-check (API still checks) - For corporations, company is required instead of first/last name - Create borrowers before referencing them in loans
get_borrower
Purpose: Retrieve borrower details by ID.
Required Fields:
borrower_id(number) - The borrower ID
Important Optional Fields:
response_field_whitelist(array of strings) - Specific fields to include
Notes: - Use after list_borrowers to get full borrower information - response_field_whitelist is useful for efficient searching (e.g., ["first_name", "last_name", "email"])
list_borrowers
Purpose: List borrowers (names only, no IDs) for LLM consumption.
Required Fields:
- None
Notes: - Returns borrower names formatted for easy reading - Does not return IDs - use get_borrower with name matching to find IDs - Designed for LLM-friendly consumption
update_borrower
Purpose: Update borrower information.
Required Fields:
borrower_id(number) - The borrower ID
Important Optional Fields:
- All fields from
create_borrowerare optional for updates
attach_borrower_to_loan
Purpose: Link an existing borrower to an existing loan as main client, co-borrower, or guarantor.
Required Fields:
loan_id(number) - The loan IDborrower_id(number) - The borrower ID
Important Optional Fields:
is_main_client(0 or 1, default: 0) - 1 for main client, 0 for co-borroweris_guarantor(0 or 1, default: 0) - 1 for guarantor, 0 for borrower
Notes: - Borrower cannot be both main client and guarantor - Use after creating both borrower and loan - Defaults to co-borrower if flags not specified
attach_shareholder_to_borrower
Purpose: Attach a shareholder to a borrower entity.
Required Fields:
borrower_id(number) - The borrower IDshareholder_id(number) - The shareholder ID
Notes: - Use for corporate borrowers to link shareholders
💰 Investor Management Tools (5 tools)
create_investor
Purpose: Create a new investor with investment capacity and account information.
Required Fields:
type(0-4, default: 0) - 0=Individual, 1=Organization (deprecated), 2=Fund (cannot create), 3=Corporation, 4=Servicerfirst_name(string) - Required if type=0 (Individual)company(string) - Required if type=3 or 4 (Corporation/Servicer)
Important Optional Fields:
last_name(string) - Last name (for individuals)email(string) - Email addresshomephone(string) - Home phonemobile(string) - Mobile phoneaddress(object) - Address with street, city, prov, zipmax_ltv(number) - Maximum Loan-to-Value ratioreceive_statements_monthly(0 or 1) - Whether to receive monthly statements
Notes: - Create investors before attaching them to loans - Individual investors require first_name - Corporation/Servicer investors require company name - Fund type (2) cannot be created via API
get_investor
Purpose: Get investor details with capacity information.
Required Fields:
investor_id(number) - The investor ID
Notes: - Returns investor with capacity information and accounts
list_investors
Purpose: List investors for a specific loan (only investors attached to that loan).
Required Fields:
loan_id(number) - The loan ID to get investors for
Important Optional Fields:
response_field_whitelist(array of strings) - Specific fields to include in response
Notes: - Important: This tool requires loan_id and only returns investors attached to that specific loan - Does NOT list all investors in the system - only investors on the specified loan - Returns investors with their investment account name and investment amount for that loan - To find all investors, you would need to query multiple loans or use a different approach
update_investor
Purpose: Update investor information.
Required Fields:
investor_id(number) - The investor ID
Important Optional Fields:
- All fields from
create_investorare optional for updates
attach_investor_to_loan
Purpose: Link an existing investor account to an existing loan for funding.
Required Fields:
loan_id(number) - The loan IDaccount_id(number) - The payment account ID (NOT investor_id)
Important Optional Fields:
amount(number) - Amount the investor will fundinterest(number) - Interest rate for this investorrate_type(0-2) - 0=Full variable, 1=Partial variable, 2=Fixed
Notes: - Important: Requires account_id (payment account ID), not investor_id - Use get_investor_account or get_investor to find the account_id - Use after creating investor, their account, and the loan
🏦 Investor Account Management Tools (7 tools)
create_investor_account
Purpose: Create an investment account for an investor.
Required Fields:
investor_id(number) - The investor IDlegal_name(string) - Legal name of the account holder
Important Optional Fields:
check_type(0-4) - 0=Individual, 1=Joint, 2=Company, 3=Trust, 4=Personal Trustvesting_name(string) - Vesting name (for Individual/Joint in US)enable_eft(0 or 1) - Enable EFT paymentseft_name,eft_bankid,eft_transit,eft_account,eft_account_type- EFT detailsdefault_interest(number) - Default interest ratetotal_funds_to_invest(number) - Total funds to investontitle(0 or 1) - Whether account is on titletax_id_or_ssn(string) - Tax ID or SSN
Notes: - Create accounts before attaching investors to loans - Each investor can have multiple accounts - The account_id returned is needed for attach_investor_to_loan
get_investor_account
Purpose: Get investor account information.
Required Fields:
- Either
account_id(number) ORloan_id(number) - Must provide one
Important Optional Fields:
account_id(number) - The account ID (use if you know the account ID)loan_id(number) - The loan ID (returns all accounts associated with the loan)
Notes: - Can retrieve by account_id directly, or by loan_id to get all accounts on a loan - Returns account details including account_id needed for attach_investor_to_loan - When using loan_id, may return multiple accounts (array)
update_investor_account
Purpose: Update investor account details.
Required Fields:
account_id(number) - The account ID
get_account_directors
Purpose: Get account director details by director ID.
Required Fields:
id(number) - The director ID (not account_id)
Notes: - Requires the director ID, not the account ID - Use this to get director information including legal name and account association —
update_account_directors
Purpose: Update account director information.
Required Fields:
id(number) - The director ID to update (not account_id)
Important Optional Fields:
account_id(number) - The account ID this director is associated withlegal_name(string) - Legal name of the director
Notes: - Requires the director ID, not the account ID —
get_account_trustees
Purpose: Get account trustee details by trustee ID.
Required Fields:
id(number) - The trustee ID (not account_id)
Notes: - Requires the trustee ID, not the account ID - Use this to get trustee information including legal name, tax ID, and account association —
update_account_trustees
Purpose: Update account trustee information.
Required Fields:
id(number) - The trustee ID to update (not account_id)
Important Optional Fields:
account_id(number) - The account ID this trustee is associated withlegal_name(string) - Legal name of the trusteetax_id(string) - Tax ID of the trustee
Notes: - Requires the trustee ID, not the account ID —
🏢 Broker Management Tools (9 tools)
get_parent_broker
Purpose: Get parent broker details.
Required Fields:
id(number) - The parent broker ID (not parent_broker_id)
Notes: - Parent brokers are the parent companies/organizations that brokers belong to —
create_parent_broker
Purpose: Create a parent broker entity.
Required Fields:
- None (all fields optional, but name recommended)
Important Optional Fields:
name(string) - Broker nameaddress,city,province,zip- Address informationphone,fax- Contact informationcheque(string) - Cheque namecheque_use_eft(0 or 1) - Use EFT for cheque paymentslicence(string) - Licence number
Notes: - Parent brokers are top-level broker organizations - Brokers are associated with parent brokers
get_broker
Purpose: Get broker information.
Required Fields:
- Either
broker_id(number) ORloan_id(number) - Must provide one
Important Optional Fields:
broker_id(number) - The broker ID (use if you know the broker ID)loan_id(number) - The loan ID (returns the loan's broker staff's broker)
Notes: - Can retrieve by broker_id directly, or by loan_id to get the broker associated with a loan - If using loan_id, returns the broker of the loan's broker staff —
create_broker
Purpose: Create a broker entity.
Required Fields:
- None (all fields optional, but name recommended)
Important Optional Fields:
name(string) - Broker nameparent_broker(object) - Parent broker with id (required if broker belongs to parent)address,city,province,zip- Address informationphone,fax- Contact informationcheque(string) - Cheque namecheque_use_eft(0 or 1) - Use EFT for cheque paymentsbroker_staff_list(array) - Array of broker staff membersduplication_mode(0 or 1) - 0=Return duplicate if found, 1=Create anyway
Notes: - Brokers are associated with parent brokers - Can include broker staff when creating
get_broker_staff
Purpose: Get broker staff details.
Required Fields:
- Either
broker_staff_id(number) ORloan_id(number) - Must provide one
Important Optional Fields:
broker_staff_id(number) - The broker staff ID (use if you know the staff ID)loan_id(number) - The loan ID (returns the loan's broker staff)
Notes: - Can retrieve by broker_staff_id directly, or by loan_id to get the broker staff associated with a loan —
create_broker_staff
Purpose: Create a broker staff member.
Required Fields:
- Staff name and broker association (varies by implementation)
Important Optional Fields:
- Staff name, contact information, commission details
Notes: - Staff members are associated with brokers - Use broker_staff_id when creating loans - Can be created as part of create_broker via broker_staff_list
get_broker_staff_cheque
Purpose: Get broker staff cheque details.
Required Fields:
broker_staff_cheque_id(number) - The cheque ID
create_broker_staff_cheque
Purpose: Create a broker staff cheque.
Required Fields:
- Cheque details and broker staff association
attach_broker_staff_to_loan
Purpose: Assign broker staff to a loan with commission.
Required Fields:
loan_id(number) - The loan IDbroker_staff_id(number) - The broker staff ID
Important Optional Fields:
- Commission details
Notes: - Can also set broker_staff_id when creating a loan
📋 Appraiser Management Tools (3 tools)
get_appraiser
Purpose: Get appraiser details.
Required Fields:
- Either
appraiser_id(number) ORloan_id(number) - Must provide one
Important Optional Fields:
appraiser_id(number) - The appraiser ID (use if you know the appraiser ID)loan_id(number) - The loan ID (returns the loan's appraiser)
Notes: - Can retrieve by appraiser_id directly, or by loan_id to get the appraiser associated with a loan —
update_appraiser
Purpose: Update appraiser information.
Required Fields:
appraiser_id(number) - The appraiser ID
Important Optional Fields:
- Appraiser details to update
get_appraiser_staff
Purpose: Get appraiser staff details.
Required Fields:
- Either
appraiser_staff_id(number) ORloan_id(number) - Must provide one
Important Optional Fields:
appraiser_staff_id(number) - The appraiser staff ID (use if you know the staff ID)loan_id(number) - The loan ID (returns the loan's appraiser staff)
Notes: - Can retrieve by appraiser_staff_id directly, or by loan_id to get the appraiser staff associated with a loan - Use appraiser_staff_id when creating loans
Common Patterns & Best Practices
Field Type Conversions
- Many numeric fields accept both numbers and strings (e.g.,
"0"or0) - Boolean fields often accept 0/1, true/false, or "0"/"1"
- Dates are Unix timestamps (seconds since epoch)
ID Requirements
- Most "get" operations require the entity ID
- Use list operations first to find IDs
attach_investor_to_loanrequiresaccount_id, notinvestor_id
Duplicate Prevention
create_loanautomatically checks for duplicates (85% similarity)create_borrowerchecks for duplicates by name, email, or phone- Both return existing records if duplicates found (unless
duplication_mode=1)
Workflow Order
- Create borrowers first
- Create investors and their accounts
- Create loans
- Attach borrowers to loans
- Attach investors to loans
- Add property details, existing mortgages, etc.
Caching
- GET operations are cached (default 300 seconds)
- Write operations (create/update/attach) automatically clear relevant caches
- Use
response_field_whitelistto reduce response size and improve performance
Total: 41 tools available