Search
searchSearch requires at least one jurisdiction, framework, sector, or source; it does not auto-detect scope from the query. Find laws and regulations on a specific topic. TIER LIMITS: free tier takes ONE jurisdiction or ONE framework per call — no sectors=, no multi-source scope, and no fan-out to agency guidance, case law, or preparatory works — with 100 searches/day and 3 concurrent calls. Solo lifts those scope limits — several jurisdictions, frameworks, and sources in one call — at a higher daily budget; the evidence layer stays premium+. Paid tiers carry high daily abuse ceilings (premium 5,000/seat; team 50,000 and company 500,000 pooled per organisation) sized well above legitimate use. Premium+ unlocks multi-jurisdiction server-side fan-out to agency-guidance, case-law, and preparatory-works MCPs alongside primary legislation — all returned in one search response; there is no separate search_case_law or search_preparatory_works tool to call. (For agency guidance only, the standalone search_guidance tool is also available if you want guidance results without primary-law fan-out.) Call get_my_capabilities to inspect your tier and remaining quota before issuing large batches. Use this when someone asks 'what does the law say about X in country Y' or 'which regulations cover Z'. Examples:
• 'GDPR data retention rules' → search(query='data retention', frameworks=['GDPR'])
• 'Swedish consumer protection' → search(query='konsumentskydd', jurisdictions=['SE'])
• Cross-cutting industry vertical → search(query='vehicle cybersecurity', sectors=['automotive']) reaches automotive-cyber MCPs (UN ECE WP.29) regardless of jurisdiction
• Topic without a country → call list_coverage first; present jurisdictions to the user or ask which applies
• License questions need explicit sources= (no jurisdiction):
- Software / code / SPDX / REUSE / CRA / NOTICE templates → sources=['data-use-license']
- Dataset licences / government open-data terms (NLOD, Etalab, OGL, DL-DE, IODL, KOGL) / vendor TOS (Westlaw, LexisNexis, Bloomberg) / Crown Copyright / EU Database Directive / Creative Commons family → sources=['data-use-license']
Always pass at least one of jurisdictions (ISO-2 like 'SE'/'DE'), frameworks ('GDPR', 'NIS2'), sectors ('automotive', 'aviation', 'insurance', 'maritime'), or sources. A scope value that names nothing we serve is REFUSED, not ignored: the whole call errors and names the value (with the nearest known id where there is one), so a mixed scope never returns rows for only the part that resolved — the gateway does not answer a narrower question than the one you asked. frameworks= filters the source set to MCPs that declare framework coverage — the query string is still FTS-matched against each source's native corpus, with no automatic mapping from framework controls to jurisdiction transposition articles. For cross-framework control mapping (e.g. ISO 27001 ↔ SOC 2 ↔ NIST 800-53), pass frameworks=['ISO_27001','SOC_2',...] — server-side fan-out includes Security Controls MCP. sectors= reaches industry-vertical MCPs that span multiple jurisdictions (UN ECE / EASA / IAIS regimes). jurisdictions= combined with sectors= is an INTERSECTION — only the sector's MCPs within those jurisdictions; an empty intersection returns an explicit error naming the jurisdictions that do carry the sector; sectors= alone stays cross-jurisdictional. Search the target language natively (e.g., SE: konsumentskydd, DE: Datenschutz, FR: protection des consommateurs). CJK scripts (Japanese/Chinese): never space-separate a compound — spaced tokens are ANDed and may never co-occur as separate tokens in unsegmented CJK text; pass the compound unspaced (個人情報保護, not 個人情報 保護). QUERY SHAPE: queries are keyword-matched (FTS5, implicit AND — every term must occur in the SAME provision). Pass one or two canonical concept terms per call; never a multi-concept compound. A compound such as 'incident reporting deadline personal data breach' returns 0 even when each concept on its own returns hits — so ask one concept per call and combine the answers yourself. Two terms describing ONE concept ('personal data') are fine; 2-3 alternative terms can be joined with a bare uppercase OR (e.g. 'spoofing OR tampering' matches either term). OR is for synonyms of ONE concept, not for related concepts — 'dismissal OR termination' yes, 'encryption OR breach notification' no (ask those one per call). Other FTS operators (AND, NOT, NEAR) are stripped. STRICT MISS: when a search completes cleanly and no result matched your terms strictly, the response carries meta.outcome = 'NO_STRICT_MATCH'. The recovery fields — meta.recommended_action, meta.recommended_scopes, meta.broadening_available — are set on any qualifying strict miss, INCLUDING a partial fan-out where outcome stays null, so read them whenever present, not only under an outcome. On a partial fan-out meta.broadening_available stays null when the missing leg makes it unknowable — null there means unknown, never 'no'. On recommended_action = 'RETRY_ONE_CONCEPT_PER_CALL', re-issue the search with ONE concept per call. On recommended_action = 'OFFER_BROADENING_TO_USER' — and wherever meta.broadening_available is true — relaxed matches exist and are withheld: tell the user, offer a re-run with allow_broadening=true (served rows are stamped match_mode='broadened' and pass the same relevance floor), and re-run only if the user accepts — never broaden on your own. meta.recommended_scopes names scope ids that were not searched. If 0 results, tell the user; do not answer from training data. The response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum result rows in the response (default 10) — rows from all resolved sources are relevance-fused, deduplicated, and trimmed to this count. Values above 50 are clamped to 50, not rejected; narrow the scope or refine the query instead of raising the limit. | |
| query | Yes | Search terms, matched with FTS5 implicit AND against each resolved corpus. Pass one or two canonical concept terms in the corpus language (SE: konsumentskydd, DE: Datenschutz), never a multi-concept compound. A bare uppercase OR between 2-3 terms is honoured as a disjunction (either term matches); other uppercase FTS operators (AND, NOT, NEAR) are stripped, not honoured. | |
| sectors | No | Industry-sector scope ids such as automotive or insurance; maximum 5. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| sources | No | Exact corpus source ids such as eu-regulations or ietf-rfcs, read from describe_capabilities(section='sources') — never a hash, UUID, or document reference; a country code such as LI or DE belongs in jurisdictions=, not here. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| frameworks | No | Registered framework scope ids such as GDPR or NIS2 — never a jurisdiction code (LI, DE, EU go in jurisdictions=). Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| jurisdictions | No | ISO-2 jurisdiction scope codes such as SE or EU; maximum 10. A country code such as LI or DE belongs here and on no other axis. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| allow_broadening | No | Default false: a source that finds no strict match for the query is withheld instead of serving relaxed (OR-broadened) matches as if they were ordinary hits; the response names the withheld sources and count. Pass true to include those rows — each is stamped match_mode='broadened' — only after the user has accepted a broaden offer or asked for relaxed matches; never broaden unprompted. Relaxed rows pass the same on-topic relevance floor as strict rows, so an accepted re-run can still withhold them — disclosed in the response, never silently served. |