Unofficial, read-only MCP server for the public Querido Diário API (Brazilian municipal gazettes)
A local-first Model Context Protocol server that gives AI clients structured, read-only access to Brazilian municipal official gazettes indexed by Querido Diário.
No API key · Runs locally · Read-only · No telemetry · Open source
The package is published on PyPI and the MCP Registry.
Querido Diário provides searchable municipal official gazettes through a public API. This server exposes a small, typed MCP interface on top of that API so an MCP client can:
The server runs as a local stdio subprocess and only performs read-only HTTPS requests to the public Querido Diário API.
Requires Python 3.12+ and uv.
No repository clone is required:
uvx querido-diario-mcp-server
This starts the MCP server on stdio. It is intended to be launched by an MCP client rather than used as an interactive terminal application.
All supported clients use the same command:
uvx querido-diario-mcp-server
{
"mcpServers": {
"querido-diario": {
"command": "uvx",
"args": ["querido-diario-mcp-server"]
}
}
}
Use this in claude_desktop_config.json for Claude Desktop or a project-level .mcp.json for Claude Code.
{
"mcpServers": {
"querido-diario": {
"command": "uvx",
"args": ["querido-diario-mcp-server"]
}
}
}
Add it to .cursor/mcp.json or your global Cursor MCP configuration.
[mcp_servers.querido-diario]
command = "uvx"
args = ["querido-diario-mcp-server"]
Other MCP clients that support local stdio servers can launch the same command.
The server intentionally exposes a small, read-only tool surface.
| Tool | Purpose |
|---|---|
search_cities | Search Brazilian municipalities by name and resolve the 7-digit IBGE territory ID. Supports an optional state filter. |
get_city | Fetch one municipality by its exact 7-digit IBGE territory ID. |
search_gazettes | Full-text search over indexed gazettes with municipality, publication date, pagination and sorting filters. |
search_gazettes uses the simple-query-string syntax supported by the upstream search API. Examples include +required, -excluded and "exact phrase".
A user can ask:
Find mentions of ACME Ltda in Porto Alegre gazettes
from January through July 2026.
An MCP client can then execute:
1. search_cities(city_name="Porto Alegre")
-> territory_id: "4314902"
2. search_gazettes(
query='"ACME Ltda"',
territory_ids=["4314902"],
published_since="2026-01-01",
published_until="2026-07-31",
)
The result is returned as structured tool output for the client to summarize, filter or combine with other tools.
MCP client
|
| stdio / MCP
v
server.py
|
| validated tool arguments
v
client.py
|
| typed read-only HTTPS requests
v
Querido Diário public API
The implementation keeps the protocol boundary separate from the HTTP integration:
src/querido_diario_mcp_server/
__init__.py package version and CLI entry point
config.py environment-driven configuration
errors.py integration error hierarchy
models.py typed Pydantic domain models
client.py async HTTP client with no MCP dependency
server.py MCP lifespan, validation and tool definitions
A single httpx.AsyncClient connection pool is created for the server lifecycle and reused across tool calls. The HTTP client can be tested independently of MCP, while integration tests exercise the real MCP server in process.
The server never automatically follows gazette URLs returned by the upstream API and does not accept arbitrary target URLs from tool callers. Territory IDs, dates, pagination and sort options are validated before use.
For vulnerability reporting and the supported security scope, see SECURITY.md.
| Variable | Default | Purpose |
|---|---|---|
QD_API_BASE_URL | https://api.queridodiario.org.br | Base URL for the Querido Diário API. Can be overridden for local or staging environments. |
Normal users do not need to set any environment variables.
Clone the repository only if you want to contribute or work on the implementation:
git clone https://github.com/lucaspmgomess/querido-diario-mcp-server.git
cd querido-diario-mcp-server
uv sync
Run the same checks enforced by CI:
uv run ruff check .
uv run ruff format --check .
uv run pyright
uv run pytest --cov
Run the server from the checkout:
uv run querido-diario-mcp-server
Inspect the MCP tools interactively:
uv run mcp dev src/querido_diario_mcp_server/server.py:mcp
Unit tests mock the HTTP boundary with httpx.MockTransport, so the automated suite does not depend on the public API.
Coverage includes:
Manual smoke-test scripts are available for validating the real production API and the full MCP-to-API path:
uv run python scripts/smoke_test_api.py
uv run python scripts/smoke_test_mcp.py
The project is currently in beta. The MCP tool surface is intentionally small and changes are kept conservative. Release history is documented in CHANGELOG.md.
The following are intentionally outside the current scope:
This is a community-built, unofficial project.
Querido Diário is maintained by Open Knowledge Brasil and its community. This repository is not an official Open Knowledge Brasil project, is not endorsed or maintained by the organization, and only consumes the project's public API.
Relevant upstream repositories:
Additional notes about upstream endpoint history are kept in docs/upstream-api-history.md.
Issues and pull requests are welcome. See CONTRIBUTING.md for the development workflow, project scope and review checklist.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
uvx querido-diario-mcp-serverMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-lucaspmgomess-querido-diario-mcp-server": {
"command": "uvx",
"args": [
"querido-diario-mcp-server"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceQuerido Diário MCP Server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.