Skip to main content
Glama

Search Indian Acts

search_acts
Read-only

Search Indian legislation down to the individual section: Central and State Acts plus the instruments of the principal regulators (SEBI, RBI, MCA, IRDAI, TRAI, DGFT). Use for any 'what does Indian law say' question. Supports boolean and phrase queries; filters by category, state, year and status. Returns sections with title, chapter and a sourceUrl pointing at the publisher's own document. The returned actId (e.g. 'IND_central_2065') feeds every acts tool. Cost: 2 credits.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo1-based page number. `page * pageSize` may not exceed 100; narrow the query with filters to reach deeper matches.
queryYesSearch query.
stateNoJurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage.
yearToNoLatest year of enactment to include, inclusive.
actTitleNoFilter by words in the act's title. Each word must appear, so `Bharatiya Nyaya` narrows to the Sanhita.
categoryNoJurisdictional class. `repealed` and `spent` are accepted for backward compatibility and resolve against `actStatus` instead. Values: `central`, `state`, `regulatory`, `repealed`, `spent`.
pageSizeNoResults per page (1-50).
yearFromNoEarliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way to find those rows.
actStatusNoFilter by the publisher's lifecycle status. Accepts one value or a list. This is the publisher's claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `spent`.
matchTypeNoHow query terms must appear in the provision text. `any` (the default) leaves hybrid ranking to do the work; `all` keeps only provisions containing EVERY query term; `phrase` keeps only those containing the exact phrase. ⚠️ It narrows the ranked candidate pool rather than re-querying the index, so a `phrase` search returns phrase matches WITHIN the top candidates, not every phrase match in the corpus. For an exhaustive phrase search, narrow with the structured filters first. Values: `any`, `all`, `phrase`.any
departmentNoIssuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Department`). Read GET /acts/filters for the values with the most data behind them.
sectionTypeNoFilter by structural kind of the passage. Accepts one value or a list. Values: `amendment_provision`, `article`, `body`, `chapter_heading`, `definition_clause`, `definitions`, `part_heading`, `preamble`, `schedule`, `section`, `short_title`, `sub_section`.
legalSubjectNoFilter by subject area, classified at ingest. Accepts one value or a list. Values: `administrative_law`, `banking_finance`, `civil_procedure`, `constitutional_law`, `corporate_law`, `criminal_law`, `environmental_law`, `family_law`, `general`, `information_technology`, `intellectual_property`, `labour_law`, `property_law`, `tax_law`.
isSubordinateNoTrue for subordinate instruments only (rules, notifications, circulars, orders); false for principal acts only. Omit for both.
provisionTypeNoFilter by what the provision DOES. Accepts one value or a list. Values: `mandatory`, `general`, `prohibitory`, `overriding`, `discretionary`, `declaratory`.
sectionNumberNoFilter by exact section number. The publisher's own numbering, which is not an integer: `498A`, `376DA` and `2-A` all occur, and the alphabetic suffix is part of the number rather than a sub-provision.
excludeRepealedNoDrop provisions whose act the publisher records as repealed or spent. Off by default, because repealed law is still law that was in force and is routinely the thing being researched.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed13 schema fields changed
    • changedInput schema / properties / actStatus / description
      Previous value: -"Filter by the publisher's lifecycle status: `in_force`, `repealed`, `superseded`, `spent`. Accepts one value or a list. This is the publisher's claim, not our verdict: see GET /acts/{actId}/status."New value: +"Filter by the publisher's lifecycle status. Accepts one value or a list. This is the publisher's claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `spent`."
    • changedInput schema / properties / category / description
      Previous value: -"Jurisdictional class. `repealed` and `spent` are accepted for backward compatibility and resolve against `actStatus` instead."New value: +"Jurisdictional class. `repealed` and `spent` are accepted for backward compatibility and resolve against `actStatus` instead. Values: `central`, `state`, `regulatory`, `repealed`, `spent`."
    • changedInput schema / properties / legalSubject / description
      Previous value: -"Filter by subject area, e.g. `tax_law`, `criminal_law`, `environmental_law`, `company_law`."New value: +"Filter by subject area, classified at ingest. Accepts one value or a list. Values: `administrative_law`, `banking_finance`, `civil_procedure`, `constitutional_law`, `corporate_law`, `criminal_law`, `environmental_law`, `family_law`, `general`, `information_technology`, `intellectual_property`, `labour_law`, `property_law`, `tax_law`."
    • changedInput schema / properties / matchType / description
      Previous value: -"How query terms must appear in the provision text. `any` (the default) leaves hybrid ranking to do the work; `all` keeps only provisions containing EVERY query term; `phrase` keeps only those containing the exact phrase.\n\n⚠️ It narrows the ranked candidate pool rather than re-querying the index, so a `phrase` search returns phrase matches WITHIN the top candidates, not every phrase match in the corpus. For an exhaustive phrase search, narrow with the structured filters first."New value: +"How query terms must appear in the provision text. `any` (the default) leaves hybrid ranking to do the work; `all` keeps only provisions containing EVERY query term; `phrase` keeps only those containing the exact phrase.\n\n⚠️ It narrows the ranked candidate pool rather than re-querying the index, so a `phrase` search returns phrase matches WITHIN the top candidates, not every phrase match in the corpus. For an exhaustive phrase search, narrow with the structured filters first.\n\nValues: `any`, `all`, `phrase`."
    • addedInput schema / properties / page / examples
      Added value: +[
      +  1
      +]
    • changedInput schema / properties / pageSize / description
      Previous value: -"Results per page (1-50)"New value: +"Results per page (1-50)."
    • addedInput schema / properties / pageSize / examples
      Added value: +[
      +  10
      +]
    • changedInput schema / properties / provisionType / description
      Previous value: -"Filter by what the provision DOES: `definitional`, `prohibitory`, `procedural`, `penal`, `overriding` and others. Accepts a value or a list."New value: +"Filter by what the provision DOES. Accepts one value or a list. Values: `mandatory`, `general`, `prohibitory`, `overriding`, `discretionary`, `declaratory`."
    • changedInput schema / properties / sectionType / description
      Previous value: -"Filter by structural kind: `section`, `sub_section`, `definitions`, `preamble`, `schedule`, `short_title`."New value: +"Filter by structural kind of the passage. Accepts one value or a list. Values: `amendment_provision`, `article`, `body`, `chapter_heading`, `definition_clause`, `definitions`, `part_heading`, `preamble`, `schedule`, `section`, `short_title`, `sub_section`."
    • changedInput schema / properties / yearFrom / anyOf
      Previous value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 2100,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / yearFrom / description
      Previous value: -"Minimum year (inclusive)"New value: +"Earliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way to find those rows."
    • changedInput schema / properties / yearTo / anyOf
      Previous value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "maximum": 2100,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / yearTo / description
      Previous value: -"Maximum year (inclusive)"New value: +"Latest year of enactment to include, inclusive."
  2. Changed24 schema fields changed
    • addedInput schema / properties / actStatus
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Filter by the publisher's lifecycle status: `in_force`, `repealed`, `superseded`, `spent`. Accepts one value or a list. This is the publisher's claim, not our verdict: see GET /acts/{actId}/status.",
      +  "enum": [
      +    "in_force",
      +    "repealed",
      +    "superseded",
      +    "spent"
      +  ],
      +  "examples": [
      +    "repealed"
      +  ]
      +}
    • changedInput schema / properties / actTitle / description
      Previous value: -"Filter by act title substring (e.g. 'Indian Penal Code', 'BNSS')"New value: +"Filter by words in the act's title. Each word must appear, so `Bharatiya Nyaya` narrows to the Sanhita."
    • addedInput schema / properties / actTitle / examples
      Added value: +[
      +  "Bharatiya Nyaya Sanhita"
      +]
    • changedInput schema / properties / category / description
      Previous value: -"Filter: central, state, regulatory, repealed, spent"New value: +"Jurisdictional class. `repealed` and `spent` are accepted for backward compatibility and resolve against `actStatus` instead."
    • addedInput schema / properties / category / enum
      Added value: +[
      +  "central",
      +  "state",
      +  "regulatory",
      +  "repealed",
      +  "spent"
      +]
    • addedInput schema / properties / category / examples
      Added value: +[
      +  "central"
      +]
    • changedInput schema / properties / department / description
      Previous value: -"Filter by regulatory body (e.g. 'sebi', 'rbi')"New value: +"Issuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Department`). Read GET /acts/filters for the values with the most data behind them."
    • addedInput schema / properties / department / examples
      Added value: +[
      +  "sebi"
      +]
    • addedInput schema / properties / excludeRepealed
      Added value: +{
      +  "default": false,
      +  "description": "Drop provisions whose act the publisher records as repealed or spent. Off by default, because repealed law is still law that was in force and is routinely the thing being researched.",
      +  "examples": [
      +    true
      +  ],
      +  "type": "boolean"
      +}
    • addedInput schema / properties / isSubordinate
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "True for subordinate instruments only (rules, notifications, circulars, orders); false for principal acts only. Omit for both.",
      +  "examples": [
      +    false
      +  ]
      +}
    • addedInput schema / properties / legalSubject
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Filter by subject area, e.g. `tax_law`, `criminal_law`, `environmental_law`, `company_law`.",
      +  "enum": [
      +    "administrative_law",
      +    "banking_finance",
      +    "civil_procedure",
      +    "constitutional_law",
      +    "corporate_law",
      +    "criminal_law",
      +    "environmental_law",
      +    "family_law",
      +    "general",
      +    "information_technology",
      +    "intellectual_property",
      +    "labour_law",
      +    "property_law",
      +    "tax_law"
      +  ],
      +  "examples": [
      +    "tax_law"
      +  ]
      +}
    • addedInput schema / properties / matchType
      Added value: +{
      +  "default": "any",
      +  "description": "How query terms must appear in the provision text. `any` (the default) leaves hybrid ranking to do the work; `all` keeps only provisions containing EVERY query term; `phrase` keeps only those containing the exact phrase.\n\n⚠️ It narrows the ranked candidate pool rather than re-querying the index, so a `phrase` search returns phrase matches WITHIN the top candidates, not every phrase match in the corpus. For an exhaustive phrase search, narrow with the structured filters first.",
      +  "enum": [
      +    "any",
      +    "all",
      +    "phrase"
      +  ],
      +  "examples": [
      +    "phrase"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / provisionType
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Filter by what the provision DOES: `definitional`, `prohibitory`, `procedural`, `penal`, `overriding` and others. Accepts a value or a list.",
      +  "enum": [
      +    "mandatory",
      +    "general",
      +    "prohibitory",
      +    "overriding",
      +    "discretionary",
      +    "declaratory"
      +  ],
      +  "examples": [
      +    "mandatory"
      +  ]
      +}
    • changedInput schema / properties / query / description
      Previous value: -"Search query"New value: +"Search query."
    • addedInput schema / properties / query / examples
      Added value: +[
      +  "assessment of a registered dealer"
      +]
    • changedInput schema / properties / query / maxLength
      Previous value: -10000New value: +1000
    • changedInput schema / properties / sectionNumber / description
      Previous value: -"Filter by exact section number (e.g. '23', '302', '498A')"New value: +"Filter by exact section number. The publisher's own numbering, which is not an integer: `498A`, `376DA` and `2-A` all occur, and the alphabetic suffix is part of the number rather than a sub-provision."
    • addedInput schema / properties / sectionNumber / examples
      Added value: +[
      +  "498A"
      +]
    • addedInput schema / properties / sectionType
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Filter by structural kind: `section`, `sub_section`, `definitions`, `preamble`, `schedule`, `short_title`.",
      +  "enum": [
      +    "amendment_provision",
      +    "article",
      +    "body",
      +    "chapter_heading",
      +    "definition_clause",
      +    "definitions",
      +    "part_heading",
      +    "preamble",
      +    "schedule",
      +    "section",
      +    "short_title",
      +    "sub_section"
      +  ],
      +  "examples": [
      +    "definitions"
      +  ]
      +}
    • changedInput schema / properties / state / description
      Previous value: -"Filter by state slug (e.g. 'maharashtra', 'delhi')"New value: +"Jurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage."
    • addedInput schema / properties / state / enum
      Added value: +[
      +  "andaman-and-nicobar-islands",
      +  "andaman-nicobar",
      +  "andhra-pradesh",
      +  "arunachal-pradesh",
      +  "assam",
      +  "bihar",
      +  "central",
      +  "chandigarh",
      +  "chhattisgarh",
      +  "dadra-and-nagar-haveli-and-daman-and-diu",
      +  "dadra-nagar-haveli",
      +  "delhi",
      +  "goa",
      +  "gujarat",
      +  "haryana",
      +  "himachal-pradesh",
      +  "jammu-and-kashmir",
      +  "jammu-kashmir",
      +  "jharkhand",
      +  "karnataka",
      +  "kerala",
      +  "ladakh",
      +  "lakshadweep",
      +  "madhya-pradesh",
      +  "maharashtra",
      +  "manipur",
      +  "meghalaya",
      +  "mizoram",
      +  "nagaland",
      +  "odisha",
      +  "puducherry",
      +  "punjab",
      +  "rajasthan",
      +  "sikkim",
      +  "tamil-nadu",
      +  "telangana",
      +  "tripura",
      +  "uttar-pradesh",
      +  "uttarakhand",
      +  "west-bengal"
      +]
    • addedInput schema / properties / state / examples
      Added value: +[
      +  "maharashtra"
      +]
    • addedInput schema / properties / yearFrom / examples
      Added value: +[
      +  2015
      +]
    • addedInput schema / properties / yearTo / examples
      Added value: +[
      +  2024
      +]
  3. First observed

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: boolean and phrase query support, filters by category/state/year/status, the return shape (sections with title, chapter, sourceUrl), the 2-credit cost, and the fact that actId feeds downstream acts tools. This is useful, non-derivable context.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and use case, then efficiently covers query capabilities, return values, downstream integration, and cost in five sentences. No obvious filler, though the opening sentence partially restates the title.

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

Completeness4/5

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

For a 17-parameter tool with full schema coverage and an output schema, the description covers scope, use case, filters, return shape, cost, and integration with other acts tools. The main gap is not explaining how it relates to sibling tools like list_acts or the generic search tool, but the schema and output schema carry most operational detail.

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

Parameters3/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. The description only summarizes filter categories already present in the schema (category, state, year, status) and does not add new parameter-level semantics. The schema carries the parameter detail.

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?

The description names a specific verb ('Search'), a specific resource ('Indian legislation down to the individual section'), and explicitly enumerates the coverage: Central and State Acts plus regulator instruments. It also distinguishes itself from siblings by stating that the returned actId feeds every acts tool.

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?

The description gives an explicit invocation context: 'Use for any "what does Indian law say" question.' It does not, however, list when not to use this tool or name direct alternatives such as list_acts, search, or resolve_india_citation, so it falls just short of 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.