LeXML-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LeXML-mcpsearch for Brazilian consumer protection law"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LeXML-mcp
MCP server for LexML Brasil — search the legislative SRU acervo, resolve URNs, and inspect service metadata. Built with FastMCP + httpx.
Features
Tool | Description |
| Search the LexML SRU acervo with CQL queries |
| Resolve a LexML URN to its public URL |
| Retrieve metadata about the SRU service |
Every response includes a provenance envelope (source_url, source_kind, authority, retrieved_at, content_hash, backend_name, backend_version, schema_version).
Related MCP server: MCP-LEI
Quick start
# Install
uv sync
# Run the server (stdio transport)
uv run lexml-mcpThe server listens on stdio — configure your MCP client to launch it:
{
"mcpServers": {
"lexml": {
"command": "uv",
"args": ["run", "--directory", "/path/to/LeXML-mcp", "lexml-mcp"]
}
}
}Usage examples
lexml_search
# Search for documents about consumer protection law
result = await lexml_search(
query='dc.title any "código de defesa do consumidor"',
start_record=1,
maximum_records=10,
record_schema="dc"
)Returns structured records with Dublin Core fields, number_of_records, next_record_position, and provenance.
lexml_resolve_urn
# Resolve a URN to its public URL
result = await lexml_resolve_urn(
urn="urn:lex:br:federal:lei:1990-09-11;8078"
)Returns public_url, status_code, redirect_chain, and provenance.
lexml_explain
# Inspect SRU service capabilities
result = await lexml_explain()Returns SRU explain record data with server info, database info, and supported schemas.
Challenge detection
The SRU endpoint may return an HTML verification page instead of XML. The server detects this and returns a structured object:
{
"is_challenge_like": true,
"content_type": "text/html",
"raw_excerpt": "<!DOCTYPE html>...",
"status_code": 200,
"provenance": { ... }
}Error handling
All errors are returned as structured objects — never crashes:
Error type | Trigger |
| Connection refused, DNS failure |
| Request exceeded timeout (default 15s) |
| SRU returned malformed XML |
| Non-2xx HTTP status |
Caching
LRU cache with configurable TTL (default 300s, max 256 entries). Challenges are never cached as successes. Configure via environment:
LEXML_CACHE_TTL— seconds (default300)LEXML_CACHE_MAXSIZE— max entries (default256)
Configuration
Env variable | Default | Description |
|
| SRU endpoint |
|
| URN resolution template |
|
| HTTP request timeout (seconds) |
|
| Cache TTL (seconds) |
|
| Max cache entries |
Project structure
src/lexml_mcp/
├── server.py # FastMCP server, tool registration
├── config.py # Environment-based configuration
├── connectors/
│ └── acervo.py # SRU search, explain, URN resolution
├── models/
│ ├── provenance.py # Provenance envelope
│ ├── search.py # Search result models
│ └── error.py # Structured error objects
└── utils/
├── cache.py # LRU TTL cache
└── challenge.py # Challenge HTML detectionTesting
uv run pytest29 tests covering:
SRU success parsing (Dublin Core records)
Challenge HTML detection
Malformed XML handling
Timeout simulation
URN resolution
Explain response parsing
Provenance envelope construction
Cache set/get/expiry/eviction
Structured error types
Tool registration
Limitations
Parser, linker, renderer not implemented — these require JVM/Scala/Haskell infrastructure and are roadmap items
SRU endpoint may return challenge HTML — the server detects and reports this transparently
No multi-tenancy — single-user, local-first design
No DOCX output — renderer integration is future scope
No Unicode normalization — preserves original content as-is
No external health checks — liveness is local only
Dependencies
mcp— official Python SDK (FastMCP)httpx— async HTTP clientstdlib only beyond those two
License
GPL-3.0-or-later
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/prof-ramos/LeXML-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server