Skip to main content
Glama

LexLint: compliance lint for AI, scraping, and privacy law

Validate an app profile

set_profile
Read-only

Step 1 of the lint. Declare what the app does (activities) and where it will operate (jurisdiction slugs); get back the validated, canonical profile plus what the law library holds for each jurisdiction, so the depth of a run is known before it is spent. Write the returned profile into the project's lexlint.yml and pass it to run_lint. Stores nothing server-side. An unknown activity or a malformed slug is refused here rather than silently weakening a lint later. Costs one upstream request for any number of jurisdictions. It answers the same coverage question check_access's own jurisdictions preview does, off a request check_access spends either way, so asking both is redundant, never costlier: they just repeat the same answer. This tool needs sign-in or an UnGovr Open Data key (metered per request; get one at https://ungovr.org/cli-login?client=lexlint).

Input Schema

NameRequiredDescriptionDefault
rolesNoWhich role this software's maker holds under each regime, keyed by axis: ai_system (provider, deployer, importer, distributor, product_manufacturer, authorised_representative, the EU AI Act's operators) and personal_data (controller, processor, the GDPR's). {"ai_system": ["provider"], "personal_data": ["processor"]}; "none" alone when asked and none applies. Ask the developer; never infer it from the code. Omitted, an axis routes nothing and run_lint counts the duties a role would move in a coverage line.
activitiesYesWhat the app does. Allowed: crawls_web, trains_models, generates_content, deploys_chatbot, automated_outreach, high_risk_decisions, processes_voice, processes_biometrics, publishes_adult_content, operates_social_platform, serves_minors, operates_app_store, ships_mobile_app, aggregates_content, distributes_software_product, handles_health_records, provides_financial_services, operates_essential_service, is_listed_company, provides_telecom_services, statutory_requests, records_calls, records_text_chat, tracks_devices, is_bank, is_lender, is_insurer, is_securities_firm, is_payment_provider, is_crypto_asset_provider, employment_decisions, credit_decisions, insurance_decisions, housing_decisions, education_decisions, health_care_decisions, public_services_decisions, justice_decisions
jurisdictionsYesJurisdiction slugs, lowercase, "/"-separated (e.g. "us", "us/ca", "eu", "kr"). A slug is the jurisdiction's UnGovr Atlas path: California is https://ungovr.org/us/ca and its Atlas ID is urn:ungovr:us/ca. Its ISO 3166 code, US-CA, is accepted too. A deeper or unresearched path resolves to the nearest jurisdiction with law, and the jurisdictions whose law is researched are listed at https://lexlint.io/law for the developer to check; name every jurisdiction the app operates in: one left off is unlinted, not passed.
public_sectorNoIs this software run by a public body (body), sold to or run for public bodies (supplier), both, or neither (none)? Ask the developer every time the profile is declared; never infer it from the code. Omitted, duties binding only public bodies are reported as the caller's, and run_lint counts them in a coverage line.
regulated_sectorNoWhose duty a financial-law row is. Is this software run by a bank, insurer or other regulated financial entity (body), supplied to one (supplier), or neither (none)? {"financial": "supplier"}. Ask when provides_financial_services or a license class (is_bank, is_lender, is_insurer, is_securities_firm, is_payment_provider, is_crypto_asset_provider) is declared; never infer it. It routes and never matches, so a supplier still declares the classes of its customers. Omitted, the entity's duties are reported as the caller's, and run_lint counts them in a coverage line.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only cover readOnlyHint and openWorldHint. The description adds substantial behavior beyond them: nothing is stored server-side, invalid activities/slugs are refused upfront, one upstream request covers any number of jurisdictions, and it requires sign-in or a metered UnGovr key with a URL to obtain one. Costs, failure mode, persistence, and auth are all disclosed.

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?

Front-loaded with purpose, workflow position, and outputs, then constraints and auth. It is on the long side and the check_access-redundancy point is stretched across two clauses ('so asking both is redundant, never costlier: they just repeat the same answer'), which is mild padding rather than waste.

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 a 5-parameter tool with nested objects and no output schema, the description explains what comes back (validated canonical profile plus per-jurisdiction law holdings), how to persist and forward it, the cost model, and the auth requirement. Nothing needed 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.

Parameters3/5

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

Schema description coverage is 100% and the schema itself carries the detailed enum lists and per-parameter explanations (roles, public_sector, regulated_sector, jurisdiction slug format). The description restates only activities and jurisdiction slugs at a high level, adding little beyond the schema, so the baseline of 3 applies.

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 gives a specific verb and resource — declare activities and jurisdictions, receive a validated canonical profile plus the law-library coverage — and frames it as 'Step 1 of the lint'. It explicitly names the siblings it relates to (run_lint, check_access), so an agent can place it in the workflow without opening another schema.

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

Usage Guidelines5/5

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

It states the downstream action ('Write the returned profile into the project's lexlint.yml and pass it to run_lint') and handles the obvious alternative directly: check_access's jurisdictions preview answers the same coverage question, so 'asking both is redundant, never costlier'. That is explicit when-to-use and when-not-to-use 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