Skip to main content
Glama

AVnester — Indian Real Estate Intelligence

Estimate stamp duty + registration (calculator)

estimate_stamp_duty_and_registration
Read-onlyIdempotent

Estimate Indian state stamp duty + registration charges on a property purchase. Supports all 28 states + 8 UTs with buyer-gender concessions, urban/rural overrides, and commercial/agricultural multipliers. Pass constructionStatus to also itemize GST (under-construction 1%/5%, ready/resale 0%) for an all-in statutory quote. Returns supported=false for states outside India (supported set named in rateBasis). Not legal/tax advice. Always surface the disclaimer.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
cityNoCity or town, e.g. "Pune". Decides the rate where the state prices by location (MH, KA, WB, MP, HR): Pune 7%, Mumbai 6%. Send the place as the buyer names it ("Kharghar"), not the wider city it is listed under.
stateYesIndian state — ISO code ("MH"), slug ("maharashtra") or name ("Maharashtra"). Required.
isUrbanNoUrban (default) or rural. Used for the location when city and localBody are absent.
firstSaleNoTrue for the FIRST sale of a flat, from the builder (not the buyer's first home); false for a resale. Changes the duty only where a state has a first-sale rate (KA). Omit when unknown: a resale is priced, and said where it matters. Absent: constructionStatus under_construction ⇒ true, resale ⇒ false, ready_to_move decides nothing (may be a resale).
localBodyNoWhere the property is, in a state that prices by it (MH, KA, WB, MP, HR): gram_panchayat (village), municipal_council (town) or municipal_corporation (city); overrides city. Omit when unknown (a corporation is priced, and said).
buyerGenderNo"female" (a woman), "joint" (a man and a woman together) or "male" (default; two women: female). Changes the price only where a state gives women a concession. Overrides isWomanBuyer.
isWomanBuyerNoBackward-compatibility shim — prefer buyerGender. When true, internally treated as buyerGender="female".
propertyTypeNoresidential (default), plot (bare land; a residential-only concession does not reach it), commercial or agricultural.
propertyValueYesSale value in INR for stamp-duty calculation.
carpetAreaSqftNoCarpet area (sqft) — with value, decides the affordable-housing 1% GST slab.
constructionStatusNoWhen set, also itemizes GST: under-construction = 1% (affordable) / 5%; ready/resale = 0%. Omit → GST not computed.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
gstNo
cardsYes
stateYes
totalYes
locationYes
rateBasisYes
stampDutyYes
stateCodeYes
stateNameYes
supportedYes
disclaimerYes
surchargesYes
assumptionsYes
attributionYes
rulesVersionYes
totalWithGstNo
propertyValueYes
stampDutyBaseYes
registrationFeeYes
rateVerificationYes
rateEffectiveDateYes
registrationCapAppliedYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / location / properties / localBody / enum
      Previous value: -[
      -  "municipal_corporation",
      -  "municipal_council",
      -  "gram_panchayat"
      -]New value: +[
      +  "municipal_corporation",
      +  "municipal_council",
      +  "gram_panchayat",
      +  null
      +]
  2. Changed2 schema fields changed
    • changedInput schema / properties / city / description
      Previous value: -"City or town, e.g. \"Pune\". Decides the rate where the state prices by location (MH, KA, WB, MP, HR): Pune 7%, Mumbai 6%."New value: +"City or town, e.g. \"Pune\". Decides the rate where the state prices by location (MH, KA, WB, MP, HR): Pune 7%, Mumbai 6%. Send the place as the buyer names it (\"Kharghar\"), not the wider city it is listed under."
    • addedOutput schema / properties / location / properties / place / properties / area
      Added value: +{
      +  "type": "string"
      +}
  3. Changed24 schema fields changed
    • changedInput schema / properties / buyerGender / description
      Previous value: -"Buyer gender — overrides isWomanBuyer when set. \"joint\" = man+woman jointly owned."New value: +"\"female\" (a woman), \"joint\" (a man and a woman together) or \"male\" (default; two women: female). Changes the price only where a state gives women a concession. Overrides isWomanBuyer."
    • addedInput schema / properties / city
      Added value: +{
      +  "description": "City or town, e.g. \"Pune\". Decides the rate where the state prices by location (MH, KA, WB, MP, HR): Pune 7%, Mumbai 6%.",
      +  "maxLength": 60,
      +  "minLength": 1,
      +  "pattern": "^[A-Za-z0-9 .,'’()\\-஀-௿ऀ-ॿ]+$",
      +  "type": "string"
      +}
    • addedInput schema / properties / firstSale
      Added value: +{
      +  "description": "True for the FIRST sale of a flat, from the builder (not the buyer's first home); false for a resale. Changes the duty only where a state has a first-sale rate (KA). Omit when unknown: a resale is priced, and said where it matters. Absent: constructionStatus under_construction ⇒ true, resale ⇒ false, ready_to_move decides nothing (may be a resale).",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / isUrban / description
      Previous value: -"Whether property is in an urban/metro area — gates metro-cess surcharges (e.g., Mumbai LBT, BBMP cess)."New value: +"Urban (default) or rural. Used for the location when city and localBody are absent."
    • addedInput schema / properties / localBody
      Added value: +{
      +  "description": "Where the property is, in a state that prices by it (MH, KA, WB, MP, HR): gram_panchayat (village), municipal_council (town) or municipal_corporation (city); overrides city. Omit when unknown (a corporation is priced, and said).",
      +  "enum": [
      +    "municipal_corporation",
      +    "municipal_council",
      +    "gram_panchayat"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / propertyType / description
      Previous value: -"Property type — applies state-specific multiplier (commercial/agricultural)."New value: +"residential (default), plot (bare land; a residential-only concession does not reach it), commercial or agricultural."
    • changedInput schema / properties / propertyType / enum
      Previous value: -[
      -  "residential",
      -  "commercial",
      -  "agricultural"
      -]New value: +[
      +  "residential",
      +  "commercial",
      +  "agricultural",
      +  "plot"
      +]
    • addedInput schema / properties / propertyValue / maximum
      Added value: +10000000000
    • removedInput schema / properties / state / default
      Removed value: -"Tamil Nadu"
    • changedInput schema / properties / state / description
      Previous value: -"Indian state — accepts ISO code (\"MH\"), URL slug (\"maharashtra\"), or display name (\"Maharashtra\"). All 28 states + 8 UTs supported."New value: +"Indian state — ISO code (\"MH\"), slug (\"maharashtra\") or name (\"Maharashtra\"). Required."
    • changedInput schema / properties / state / minLength
      Previous value: -2New value: +1
    • addedInput schema / properties / state / pattern
      Added value: +"^[A-Za-z0-9 .,'’()\\-஀-௿ऀ-ॿ]+$"
    • changedInput schema / required
      Previous value: -[
      -  "propertyValue"
      -]New value: +[
      +  "propertyValue",
      +  "state"
      +]
    • addedOutput schema / properties / assumptions
      Added value: +{
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "code": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / location
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "assumed": {
      +      "type": "boolean"
      +    },
      +    "localBody": {
      +      "enum": [
      +        "municipal_corporation",
      +        "municipal_council",
      +        "gram_panchayat"
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "place": {
      +      "additionalProperties": true,
      +      "properties": {
      +        "name": {
      +          "type": "string"
      +        },
      +        "slug": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "slug",
      +        "name"
      +      ],
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "source": {
      +      "enum": [
      +        "local_body",
      +        "city",
      +        "is_urban",
      +        "default",
      +        "not_applicable"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "place",
      +    "localBody",
      +    "source",
      +    "assumed"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / rateEffectiveDate / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • addedOutput schema / properties / rateVerification
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "lastVerifiedAt": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "sourceUrl": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "enum": [
      +        "verified",
      +        "partial",
      +        "unverified"
      +      ],
      +      "type": "string"
      +    },
      +    "unverifiedComponents": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "lastVerifiedAt",
      +    "sourceUrl",
      +    "unverifiedComponents"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / registrationCapApplied
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / rulesVersion
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / stampDutyBase
      Added value: +{
      +  "type": "integer"
      +}
    • addedOutput schema / properties / stateCode
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / stateName
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / surcharges
      Added value: +{
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "amount": {
      +        "type": "integer"
      +      },
      +      "legalBasis": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "ratePct": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "ratePct",
      +      "amount"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "propertyValue",
      -  "state",
      -  "supported",
      -  "stampDuty",
      -  "registrationFee",
      -  "total",
      -  "rateBasis",
      -  "rateEffectiveDate",
      -  "attribution",
      -  "disclaimer",
      -  "cards"
      -]New value: +[
      +  "propertyValue",
      +  "state",
      +  "supported",
      +  "stateCode",
      +  "stateName",
      +  "stampDuty",
      +  "stampDutyBase",
      +  "surcharges",
      +  "registrationFee",
      +  "registrationCapApplied",
      +  "total",
      +  "rateBasis",
      +  "location",
      +  "rateVerification",
      +  "assumptions",
      +  "rulesVersion",
      +  "rateEffectiveDate",
      +  "attribution",
      +  "disclaimer",
      +  "cards"
      +]
  4. Changed4 schema fields changed
    • addedInput schema / properties / carpetAreaSqft
      Added value: +{
      +  "description": "Carpet area (sqft) — with value, decides the affordable-housing 1% GST slab.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 100000,
      +  "type": "integer"
      +}
    • addedInput schema / properties / constructionStatus
      Added value: +{
      +  "description": "When set, also itemizes GST: under-construction = 1% (affordable) / 5%; ready/resale = 0%. Omit → GST not computed.",
      +  "enum": [
      +    "under_construction",
      +    "ready_to_move",
      +    "resale"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / gst
      Added value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "amount": {
      +      "type": "integer"
      +    },
      +    "applies": {
      +      "type": "boolean"
      +    },
      +    "basis": {
      +      "type": "string"
      +    },
      +    "isAffordable": {
      +      "type": "boolean"
      +    },
      +    "itcAvailableToBuyer": {
      +      "enum": [
      +        false
      +      ]
      +    },
      +    "ratePct": {
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "ratePct",
      +    "amount",
      +    "applies",
      +    "isAffordable",
      +    "itcAvailableToBuyer",
      +    "basis"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / totalWithGst
      Added value: +{
      +  "type": "integer"
      +}
  5. Changed2 schema fields changed
    • addedOutput schema / properties / cards
      Added value: +{
      +  "items": {
      +    "additionalProperties": true,
      +    "properties": {
      +      "data": {
      +        "additionalProperties": {},
      +        "type": "object"
      +      },
      +      "priority": {
      +        "type": "integer"
      +      },
      +      "template": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "template",
      +      "data",
      +      "priority"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "propertyValue",
      -  "state",
      -  "supported",
      -  "stampDuty",
      -  "registrationFee",
      -  "total",
      -  "rateBasis",
      -  "rateEffectiveDate",
      -  "attribution",
      -  "disclaimer"
      -]New value: +[
      +  "propertyValue",
      +  "state",
      +  "supported",
      +  "stampDuty",
      +  "registrationFee",
      +  "total",
      +  "rateBasis",
      +  "rateEffectiveDate",
      +  "attribution",
      +  "disclaimer",
      +  "cards"
      +]
  6. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "attribution": {
      +      "enum": [
      +        "AVnester"
      +      ]
      +    },
      +    "disclaimer": {
      +      "type": "string"
      +    },
      +    "propertyValue": {
      +      "type": "integer"
      +    },
      +    "rateBasis": {
      +      "type": "string"
      +    },
      +    "rateEffectiveDate": {
      +      "type": "string"
      +    },
      +    "registrationFee": {
      +      "type": "integer"
      +    },
      +    "stampDuty": {
      +      "type": "integer"
      +    },
      +    "state": {
      +      "type": "string"
      +    },
      +    "supported": {
      +      "type": "boolean"
      +    },
      +    "total": {
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "propertyValue",
      +    "state",
      +    "supported",
      +    "stampDuty",
      +    "registrationFee",
      +    "total",
      +    "rateBasis",
      +    "rateEffectiveDate",
      +    "attribution",
      +    "disclaimer"
      +  ],
      +  "type": "object"
      +}
  7. Changed2 schema fields changed
    • removedInput schema / $schema
      Removed value: -"http://json-schema.org/draft-07/schema#"
    • removedInput schema / properties / propertyValue / maximum
      Removed value: -9007199254740991
  8. First observed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, yet the description adds meaningful behavior: unsupported-state returns (supported=false, supported set named in rateBasis), GST itemization triggered by constructionStatus, and the mandatory disclaimer plus 'not legal/tax advice'. It does not discuss precision or estimation caveats, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the core purpose before optional features and caveats. Each sentence carries distinct information: scope, geographic/parameter support, GST behavior, and the unsupported/disclaimer caveats. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter calculator with an output schema present, the description covers what the schema does not: unsupported-input behavior, GST expansion, disclaimer obligation, and the legal-advice boundary. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema does not: constructionStatus driving GST rates, buyer-gender concessions, urban/rural overrides, and commercial/agricultural multipliers. This meaningfully complements the per-parameter schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Estimate Indian state stamp duty + registration charges on a property purchase') and immediately delimits scope: all 28 states + 8 UTs, with gender concessions and urban/rural and property-type multipliers. This is clearly distinguishable from the loan- and search-oriented siblings like calculate_home_affordability or compare_properties.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real conditional guidance: 'Pass constructionStatus to also itemize GST', and the supported=false behavior for states outside India tells the agent when the tool will not answer. It also flags that the disclaimer must be surfaced. It stops short of naming an explicit alternative or a 'do not use this for X' exclusion, so it is clear context rather than full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources