Files
nadlan-mcp/API_REFERENCE.md
Nitzan Pomerantz 280b0c9b1c Continue phase 6
2025-10-31 18:41:48 +02:00

14 KiB

API Reference

Complete reference for Nadlan-MCP's MCP tools and Python library.

Table of Contents


MCP Tools

These tools are available when running Nadlan-MCP as an MCP server.

Core Tools

autocomplete_address

Search and validate Israeli addresses.

Parameters:

  • search_text (string, required): Address to search (Hebrew or English)

Returns: JSON with matching addresses and coordinates

Example:

{
  "search_text": "רוטשילד תל אביב"
}

find_recent_deals_for_address

Find all recent real estate deals for a specific address.

Parameters:

  • address (string, required): Address to search
  • years_back (int, default: 2): Number of years to look back
  • radius_meters (int, default: 30): Search radius in meters
  • max_deals (int, default: 100): Maximum deals to return
  • deal_type (int, default: 2): Deal type (1=new construction, 2=resale)

Returns: JSON with deals, sorted by priority and date

Example:

{
  "address": "רוטשילד 1 תל אביב",
  "years_back": 2,
  "radius_meters": 50
}

get_deals_by_radius

Get polygon metadata within a radius of coordinates.

Parameters:

  • latitude (float, required): Latitude coordinate
  • longitude (float, required): Longitude coordinate
  • radius_meters (int, default: 500): Search radius in meters

Returns: JSON with polygon metadata (NOT individual deals)

Note: This returns polygon metadata, not deals. Use get_street_deals or find_recent_deals_for_address for actual deals.


get_street_deals

Get deals for a specific street polygon.

Parameters:

  • polygon_id (string, required): Street polygon ID
  • limit (int, default: 100): Maximum deals to return
  • deal_type (int, default: 2): Deal type filter

Returns: JSON with street-level deals


get_neighborhood_deals

Get deals for a neighborhood polygon.

Parameters:

  • polygon_id (string, required): Neighborhood polygon ID
  • limit (int, default: 100): Maximum deals to return
  • deal_type (int, default: 2): Deal type filter

Returns: JSON with neighborhood-level deals


Analysis Tools

Analyze market trends and price patterns for an area.

Parameters:

  • address (string, required): Address to analyze
  • years_back (int, default: 3): Years of data to analyze
  • radius_meters (int, default: 100): Search radius
  • max_deals (int, default: 100): Maximum deals to analyze
  • deal_type (int, default: 2): Deal type filter

Returns: JSON with:

  • Deal statistics (prices, price/m², trends)
  • Time-series analysis
  • Market summary

Example:

{
  "address": "דיזנגוף 50 תל אביב",
  "years_back": 3
}

compare_addresses

Compare real estate markets between multiple addresses.

Parameters:

  • addresses (array of strings, required): List of addresses to compare

Returns: JSON with comparative analysis

Example:

{
  "addresses": [
    "רוטשילד 1 תל אביב",
    "דיזנגוף 50 תל אביב",
    "ז'בוטינסקי 1 רמת גן"
  ]
}

Valuation Tools

get_valuation_comparables

Get comparable properties for valuation analysis.

Parameters:

  • address (string, required): Address to find comparables for
  • years_back (int, default: 2): Years to look back
  • property_type (string, optional): Filter by property type (e.g., "דירה")
  • min_rooms (float, optional): Minimum rooms
  • max_rooms (float, optional): Maximum rooms
  • min_price (float, optional): Minimum price (NIS)
  • max_price (float, optional): Maximum price (NIS)
  • min_area (float, optional): Minimum area (m²)
  • max_area (float, optional): Maximum area (m²)
  • min_floor (int, optional): Minimum floor
  • max_floor (int, optional): Maximum floor
  • radius_meters (int, default: 100): Search radius
  • max_comparables (int, default: 50): Max comparables to return

Returns: JSON with filtered comparable deals and statistics

Example:

{
  "address": "רוטשילד 10 תל אביב",
  "min_rooms": 3,
  "max_rooms": 4,
  "min_area": 70,
  "max_area": 100
}

get_deal_statistics

Calculate statistical aggregations on deal data.

Parameters:

  • address (string, required): Address to analyze
  • years_back (int, default: 2): Years to analyze
  • property_type (string, optional): Filter by property type
  • min_rooms (float, optional): Minimum rooms
  • max_rooms (float, optional): Maximum rooms

Returns: JSON with statistics (mean, median, percentiles, std dev)


get_market_activity_metrics

Get comprehensive market activity and investment analysis.

Parameters:

  • address (string, required): Address to analyze
  • years_back (int, default: 2): Years to analyze
  • radius_meters (int, default: 100): Search radius

Returns: JSON with:

  • Market activity score and trends
  • Market liquidity metrics
  • Investment potential analysis
  • Price appreciation and volatility

Python Client

For direct Python usage without MCP.

Installation

from nadlan_mcp.govmap import GovmapClient
client = GovmapClient()

Main Methods

autocomplete_address()

def autocomplete_address(search_text: str) -> AutocompleteResponse:
    """
    Search for addresses using autocomplete.

    Args:
        search_text: Address to search (Hebrew or English)

    Returns:
        AutocompleteResponse with matching addresses

    Raises:
        ValueError: If search text is invalid
        requests.RequestException: On API errors
    """

Example:

result = client.autocomplete_address("רוטשילד תל אביב")
for address in result.results:
    print(f"{address.text} - {address.coordinates}")

find_recent_deals_for_address()

def find_recent_deals_for_address(
    address: str,
    years_back: int = 2,
    radius: int = 50,
    max_deals: int = 100,
    deal_type: int = 2
) -> List[Deal]:
    """
    Find all relevant deals for an address.

    Args:
        address: Address to search
        years_back: Years to look back (default: 2)
        radius: Search radius in meters (default: 50)
        max_deals: Maximum deals to return (default: 100)
        deal_type: 1=new construction, 2=resale (default: 2)

    Returns:
        List of Deal models, sorted by priority and date

    Raises:
        ValueError: If address invalid or no results found
    """

Example:

deals = client.find_recent_deals_for_address(
    "רוטשילד 1 תל אביב",
    years_back=3,
    radius=100
)

for deal in deals[:5]:
    print(f"{deal.address_description}: ₪{deal.deal_amount:,.0f}")

filter_deals_by_criteria()

def filter_deals_by_criteria(
    deals: List[Deal],
    property_type: Optional[str] = None,
    min_rooms: Optional[float] = None,
    max_rooms: Optional[float] = None,
    min_price: Optional[float] = None,
    max_price: Optional[float] = None,
    min_area: Optional[float] = None,
    max_area: Optional[float] = None,
    min_floor: Optional[int] = None,
    max_floor: Optional[int] = None,
) -> List[Deal]:
    """
    Filter deals by various criteria.

    Args:
        deals: List of Deal models to filter
        property_type: Property type (Hebrew, e.g., "דירה")
        min_rooms/max_rooms: Room count range
        min_price/max_price: Price range (NIS)
        min_area/max_area: Area range (m²)
        min_floor/max_floor: Floor range

    Returns:
        Filtered list of Deal models

    Raises:
        ValueError: If filter ranges are invalid
    """

Example:

filtered = client.filter_deals_by_criteria(
    deals,
    property_type="דירה",
    min_rooms=3,
    max_rooms=4,
    min_price=1000000,
    max_price=2000000
)

calculate_deal_statistics()

def calculate_deal_statistics(deals: List[Deal]) -> DealStatistics:
    """
    Calculate statistical aggregations.

    Args:
        deals: List of Deal models

    Returns:
        DealStatistics model with mean, median, percentiles, etc.

    Raises:
        ValueError: If deals list is empty
    """

calculate_market_activity_score()

def calculate_market_activity_score(
    deals: List[Deal],
    time_period_months: Optional[int] = None
) -> MarketActivityScore:
    """
    Calculate market activity metrics.

    Args:
        deals: List of Deal models
        time_period_months: Time period to analyze (None = all data)

    Returns:
        MarketActivityScore model

    Raises:
        ValueError: If deals list is empty
    """

get_market_liquidity()

def get_market_liquidity(
    deals: List[Deal],
    time_period_months: Optional[int] = None
) -> LiquidityMetrics:
    """
    Calculate market liquidity metrics.

    Args:
        deals: List of Deal models
        time_period_months: Time period to analyze

    Returns:
        LiquidityMetrics model

    Raises:
        ValueError: If deals list is empty
    """

analyze_investment_potential()

def analyze_investment_potential(deals: List[Deal]) -> InvestmentAnalysis:
    """
    Analyze investment potential of an area.

    Args:
        deals: List of Deal models

    Returns:
        InvestmentAnalysis model

    Raises:
        ValueError: If deals list is empty or insufficient data
    """

Data Models

All models are Pydantic v2 models with validation.

Deal

Primary model for real estate transaction data.

class Deal(BaseModel):
    objectid: int
    deal_amount: Optional[float]
    deal_date: date | str
    property_type_description: Optional[str]
    rooms: Optional[float]
    asset_area: Optional[float]
    floor_number: Optional[int]
    floor: Optional[str]
    address_description: Optional[str]

    # Computed field
    @computed_field
    @property
    def price_per_sqm(self) -> Optional[float]:
        """Calculate price per square meter."""
        if self.deal_amount and self.asset_area and self.asset_area > 0:
            return self.deal_amount / self.asset_area
        return None

DealStatistics

Statistical aggregations on deal data.

class DealStatistics(BaseModel):
    count: int
    mean_price: float
    median_price: float
    min_price: float
    max_price: float
    std_dev_price: float
    percentile_25_price: float
    percentile_75_price: float
    mean_price_per_sqm: Optional[float]
    median_price_per_sqm: Optional[float]
    # ... more fields

MarketActivityScore

Market activity metrics.

class MarketActivityScore(BaseModel):
    activity_score: float  # 0-100
    activity_level: str  # very_high, high, moderate, low, very_low
    trend: str  # improving, stable, declining
    deals_per_month: float
    unique_months: int
    total_deals: int

InvestmentAnalysis

Investment potential analysis.

class InvestmentAnalysis(BaseModel):
    investment_score: float  # 0-100
    price_trend: str
    price_appreciation_rate: float  # % per year
    market_stability: str
    volatility_score: float
    recommendation: str

LiquidityMetrics

Market liquidity analysis.

class LiquidityMetrics(BaseModel):
    liquidity_score: float  # 0-100
    total_deals: int
    avg_deals_per_month: float
    deal_velocity: float
    market_activity_level: str
    trend_direction: str

Configuration

Environment Variables

# API Settings
GOVMAP_BASE_URL=https://www.govmap.gov.il/api/
GOVMAP_USER_AGENT=NadlanMCP/2.0.0

# Timeouts (seconds)
GOVMAP_CONNECT_TIMEOUT=10
GOVMAP_READ_TIMEOUT=30

# Retry Settings
GOVMAP_MAX_RETRIES=3
GOVMAP_RETRY_MIN_WAIT=1
GOVMAP_RETRY_MAX_WAIT=10

# Rate Limiting
GOVMAP_REQUESTS_PER_SECOND=5.0

# Defaults
GOVMAP_DEFAULT_RADIUS=50
GOVMAP_DEFAULT_YEARS_BACK=2
GOVMAP_DEFAULT_DEAL_LIMIT=100

# Performance
GOVMAP_MAX_POLYGONS=10

Programmatic Configuration

from nadlan_mcp.config import GovmapConfig, set_config

config = GovmapConfig(
    connect_timeout=15,
    read_timeout=45,
    max_retries=5,
    requests_per_second=3.0,
    max_polygons=5
)
set_config(config)

Error Handling

Common Errors

ValueError

  • Invalid input parameters
  • Empty results
  • Invalid filter ranges

requests.RequestException

  • Network errors
  • API timeouts
  • HTTP errors

pydantic.ValidationError

  • Invalid model data (handled internally, logged as warnings)

Example

from nadlan_mcp.govmap import GovmapClient

client = GovmapClient()

try:
    deals = client.find_recent_deals_for_address("invalid")
except ValueError as e:
    print(f"Invalid input: {e}")
except requests.RequestException as e:
    print(f"API error: {e}")

Rate Limiting

Built-in rate limiting respects API limits:

  • Default: 5 requests/second
  • Configurable via GOVMAP_REQUESTS_PER_SECOND
  • Automatic retry with exponential backoff

Examples

See examples/ directory for complete usage examples:

  • basic_search.py - Simple address lookup
  • market_analysis.py - Trend analysis
  • investment_analysis.py - Multi-location comparison
  • valuation.py - Property valuation

For more information, see: