GovBR-DS MCP
GovBR DS MCP
Servidor Model Context Protocol (MCP) open source para o Design System do Governo Federal Brasileiro (GovBR-DS).
O govbr-ds-mcp fornece a agentes de IA acesso estruturado à documentação do GovBR-DS, seus componentes, orientações de acessibilidade, busca, Resources e workflows reutilizáveis para desenvolvimento.
O objetivo é permitir que ferramentas como Codex, Claude Code, Kiro e outros clientes compatíveis com MCP compreendam e utilizem o GovBR Design System com base em sua documentação oficial sincronizada, em vez de depender apenas do conhecimento prévio do modelo.
O pacote está publicado no npm como govbr-ds-mcp e pode ser executado diretamente com:
npx -y govbr-ds-mcpEste é um projeto comunitário e independente. Não é um projeto oficial do Governo Federal Brasileiro nem da equipe responsável pelo GovBR-DS.
Destaques técnicos
Desenvolvido em TypeScript
Pacote publicado no npm
Servidor MCP com Tools, Resources e Prompts
Pipeline próprio de sincronização e parsing de documentação
Busca textual local com ranking de relevância
Arquitetura modular e independente de serviços externos em runtime
Suíte automatizada cobrindo serviços, parsing, busca e integrações MCP
Related MCP server: PortOne Global MCP Server
Por que este projeto?
Agentes de IA conseguem gerar código de frontend rapidamente, mas nem sempre sabem:
qual componente GovBR-DS deve ser utilizado;
como determinado componente deve se comportar;
quais recomendações de acessibilidade se aplicam;
quais padrões de uso são recomendados;
onde uma informação específica está localizada na documentação do GovBR-DS.
O govbr-ds-mcp busca resolver esse problema disponibilizando a documentação do GovBR-DS por meio do Model Context Protocol.
Agente de IA
│
▼
govbr-ds-mcp
│
├── Tools
├── Resources
├── Prompts
└── Busca
│
▼
Dados estruturados locais
▲
│
Sincronização da documentação
▲
│
Repositório oficial GovBR-DSO servidor MCP não utiliza um LLM internamente e não realiza requisições externas durante sua execução normal.
Funcionalidades
Sincronização da documentação
A documentação é obtida do repositório oficial do GovBR-DS e transformada em dados estruturados locais.
GitLab GovBR-DS
│
▼
GitLab API
│
▼
Parser Markdown
│
▼
Componentes estruturados
│
▼
components.generated.tsOs dados gerados são armazenados localmente, permitindo que o servidor MCP funcione sem acesso à internet depois da sincronização.
Atualmente, o projeto sincroniza 37 componentes documentados do GovBR-DS.
Tools MCP
list_components
Lista os componentes GovBR-DS disponíveis no índice local da documentação.
Exemplo:
{}Resposta:
[
{
"name": "Button",
"slug": "button",
"description": "..."
},
{
"name": "Input",
"slug": "input",
"description": "..."
}
]get_component
Retorna a documentação estruturada completa de um componente específico do GovBR-DS.
Exemplo:
{
"name": "button"
}A busca não diferencia letras maiúsculas e minúsculas.
As chamadas abaixo são equivalentes:
button
Button
BUTTONsearch_docs
Pesquisa dentro da documentação GovBR-DS sincronizada localmente.
Exemplo:
{
"query": "como usar um botão",
"limit": 5
}O mecanismo de busca possui suporte a:
busca case-insensitive;
busca sem diferenciação de acentos;
remoção de stopwords em português;
aliases de componentes;
canonicalização de variações morfológicas;
priorização do componente identificado;
ranking por relevância de seções;
geração de snippets relevantes;
filtro por componente.
Exemplo:
{
"query": "acessibilidade aria",
"component": "button",
"limit": 5
}A busca acontece inteiramente em memória.
Não são utilizados:
embeddings;
banco vetorial;
Elasticsearch;
LLM;
serviços externos de busca.
Resources MCP
A documentação do GovBR-DS também é disponibilizada através de MCP Resources.
Catálogo de componentes
govbr-ds://catalogDisponibiliza um índice de todos os componentes sincronizados.
Documentação de componente
govbr-ds://components/{slug}Exemplo:
govbr-ds://components/buttonRetorna a documentação completa do componente em Markdown.
Documentação de acessibilidade
govbr-ds://components/{slug}/accessibilityExemplo:
govbr-ds://components/button/accessibilityRetorna as orientações de acessibilidade disponíveis para o componente.
Nem todos os componentes do GovBR-DS possuem documentação específica de acessibilidade.
Os Resources são gerados inteiramente a partir dos dados sincronizados localmente.
Prompts MCP
O servidor disponibiliza Prompts reutilizáveis para workflows comuns de desenvolvimento com GovBR-DS.
implement_govbr_component
Fornece a documentação oficial sincronizada de um componente e instruções para auxiliar sua implementação.
Exemplo:
{
"component": "button",
"requirements": "Preciso de uma ação principal para confirmar o formulário."
}O Prompt fornece ao modelo a documentação relevante do componente para que a implementação seja fundamentada no GovBR-DS.
review_govbr_component
Fornece a documentação do componente juntamente com um trecho de código que deve ser revisado.
Exemplo:
{
"component": "button",
"code": "<button class=\"br-button\">Enviar</button>"
}A revisão pode então comparar a implementação fornecida com as orientações disponíveis na documentação sincronizada.
check_govbr_accessibility
Fornece as orientações de acessibilidade de um componente para auxiliar na revisão de uma implementação.
Exemplo:
{
"component": "button",
"code": "<button class=\"br-button circle\"><i class=\"fas fa-plus\"></i></button>"
}O servidor MCP não executa nem interpreta o código recebido.
O código é tratado somente como texto e disponibilizado como contexto para o modelo conectado.
Arquitetura
src/
├── data/
│ ├── components.ts
│ └── components.generated.ts
│
├── ingestion/
│ ├── gitlab-client.ts
│ ├── component-parser.ts
│ └── component-sync.ts
│
├── services/
│ ├── component.service.ts
│ └── search.service.ts
│
├── tools/
│ ├── list-components.ts
│ ├── get-component.ts
│ └── search-docs.ts
│
├── resources/
│ ├── register-resources.ts
│ ├── component.resource.ts
│ └── accessibility.resource.ts
│
├── prompts/
│ ├── register-prompts.ts
│ ├── implement-component.prompt.ts
│ ├── review-component.prompt.ts
│ └── accessibility-review.prompt.ts
│
├── formatters/
│ └── component-markdown.ts
│
├── types/
│
└── index.ts
scripts/
└── sync-components.tsO fluxo principal da aplicação é:
Cliente MCP
│
▼
govbr-ds-mcp
│
┌─────────────┼─────────────┐
│ │ │
Tools Resources Prompts
│ │ │
└─────────────┼─────────────┘
▼
Services locais
│
▼
Dados sincronizados
▲
│
sync:components
▲
│
GovBR-DS oficialUso rápido
Node.js 22+
npm
Não é necessário clonar ou instalar o pacote globalmente. Clientes MCP podem iniciar o servidor publicado diretamente via npx:
npx -y govbr-ds-mcpO servidor utiliza o transporte MCP stdio e funciona com os dados GovBR-DS incluídos no pacote, sem chamadas HTTP durante as consultas.
Configuração nos clientes MCP
Claude Desktop
Adicione o servidor ao arquivo de configuração do Claude Desktop:
{
"mcpServers": {
"govbr-ds": {
"command": "npx",
"args": ["-y", "govbr-ds-mcp"]
}
}
}Depois de salvar o arquivo, reinicie o Claude Desktop.
Consulte também a documentação MCP do Claude.
Claude Code
Registre o servidor pelo terminal:
claude mcp add govbr-ds -- npx -y govbr-ds-mcpUse claude mcp list para confirmar o registro.
Codex
Adicione ao arquivo ~/.codex/config.toml:
[mcp_servers.govbr-ds]
command = "npx"
args = ["-y", "govbr-ds-mcp"]Também é possível registrar pelo terminal:
codex mcp add govbr-ds -- npx -y govbr-ds-mcpReinicie o Codex depois de alterar manualmente a configuração.
Consulte também a documentação MCP do Codex.
Kiro
No Kiro, abra ou crie .kiro/settings/mcp.json no workspace. Para disponibilizar o servidor globalmente, use ~/.kiro/settings/mcp.json:
{
"mcpServers": {
"govbr-ds": {
"command": "npx",
"args": ["-y", "govbr-ds-mcp"],
"disabled": false,
"autoApprove": []
}
}
}Após salvar, abra o painel MCP do Kiro e confirme que govbr-ds está conectado.
Consulte também a documentação MCP do Kiro.
Desenvolvimento local
Clone o repositório e instale as dependências:
git clone https://github.com/FelipeVergaraChico/govbr-ds-mcp.git
cd govbr-ds-mcp
npm installExecutando o servidor MCP
Inicie o servidor em modo de desenvolvimento:
npm run devO servidor utiliza o transporte MCP stdio.
Como o stdout é reservado para a comunicação do protocolo MCP, logs da aplicação devem ser enviados para stderr.
Evite:
console.log("Servidor iniciado");Prefira:
console.error("Servidor iniciado");MCP Inspector
O projeto pode ser testado utilizando o MCP Inspector.
Execute:
npx @modelcontextprotocol/inspector npx -y govbr-ds-mcpNo Inspector é possível testar as funcionalidades disponíveis.
Tools
list_components
get_component
search_docsResources
govbr-ds://catalog
govbr-ds://components/{slug}
govbr-ds://components/{slug}/accessibilityPrompts
implement_govbr_component
review_govbr_component
check_govbr_accessibilitySincronizando a documentação do GovBR-DS
Para atualizar o índice local:
npx tsx scripts/sync-components.tsO processo de sincronização:
acessa o repositório público do GovBR-DS através da API do GitLab;
identifica os componentes documentados;
baixa os arquivos Markdown de cada componente;
baixa a documentação de acessibilidade quando disponível;
interpreta os arquivos Markdown;
normaliza os dados;
gera o dataset local utilizado pelo MCP.
Os dados gerados são armazenados em:
src/data/components.generated.tsO arquivo é gerado automaticamente e não deve ser editado manualmente.
Durante a execução normal, o servidor MCP não consulta o GitLab.
Isso permite utilizar as Tools, Resources, Prompts e busca mesmo sem conexão com a internet.
Executando os testes
Execute:
npm testA suíte de testes cobre áreas como:
parsing de Markdown;
busca de componentes;
busca case-insensitive;
normalização de acentos;
aliases;
canonicalização;
ranking da busca;
geração de snippets;
MCP Tools;
MCP Resources;
MCP Prompts;
formatação da documentação;
tratamento de componentes inexistentes.
Os testes unitários não dependem da disponibilidade do GitLab.
Desenvolvimento
Instale as dependências:
npm installExecute o servidor:
npm run devExecute os testes:
npm testAtualize a documentação local:
npx tsx scripts/sync-components.tsAbra o MCP Inspector:
npx @modelcontextprotocol/inspector npx tsx src/index.tsFonte dos dados
A documentação utilizada por este projeto é obtida do repositório oficial do GovBR Design System:
O processo atual de ingestão utiliza principalmente:
ds/componentes/A documentação dos componentes normalmente possui uma estrutura semelhante a:
ds/componentes/button/
├── button.md
├── button-access.md
└── imagens/O arquivo principal geralmente contém informações como:
descrição;
uso;
anatomia;
tipos;
comportamento;
especificações.
Quando disponível, o arquivo *-access.md contém as orientações específicas de acessibilidade.
Nem todos os componentes possuem exatamente o mesmo conjunto de arquivos.
O processo de sincronização foi desenvolvido para lidar com essas diferenças sem interromper a geração do dataset.
Princípios do projeto
Documentação oficial primeiro
Sempre que possível, as informações fornecidas pelo MCP devem estar fundamentadas na documentação oficial sincronizada do GovBR-DS.
O objetivo é reduzir situações em que um agente de IA inventa uma regra ou comportamento que não existe no Design System.
Independente de LLM
O servidor MCP não depende de:
OpenAI;
Anthropic;
Google;
modelos locais;
qualquer outro fornecedor de IA.
O modelo é responsabilidade do cliente MCP conectado.
Runtime local
Requisições externas são utilizadas durante a sincronização da documentação, e não durante consultas normais ao MCP.
npx tsx scripts/sync-components.ts
│
└── Internet necessária
npm run dev
│
└── Documentação localBusca simples antes de infraestrutura complexa
A busca atual utiliza ranking textual determinístico.
O projeto não depende de:
embeddings;
banco vetorial;
infraestrutura de RAG;
serviço externo de pesquisa.
Para a quantidade atual de documentação, uma busca local bem estruturada mantém o projeto mais simples, previsível e leve.
Respostas pequenas
A Tool search_docs retorna snippets relevantes em vez de enviar documentos inteiros para o modelo.
Isso ajuda a reduzir:
quantidade de contexto;
consumo de tokens;
informações irrelevantes;
respostas excessivamente grandes.
Quando o documento completo for necessário, o agente pode utilizar get_component ou os MCP Resources.
Roadmap
Concluído
servidor MCP com transporte
stdiolistagem de componentes
consulta individual de componentes
sincronização da documentação GovBR-DS
parser estruturado de Markdown
geração automática do dataset local
busca local na documentação
ranking de relevância
normalização de consultas em português
MCP Resources
Resources de acessibilidade
catálogo de componentes
MCP Prompts
autocomplete de componentes nos Prompts
Planejado
exemplos oficiais de implementação HTML e CSS
integração com
@govbr-ds/coredocumentação dos GovBR Web Components
documentação dos GovBR React Components
exemplos de implementação por componente
validação de código GovBR-DS
helpers para validação de acessibilidade
publicação no npm
publicação no MCP Registry
transporte HTTP
Projeto relacionado
Este MCP foi desenvolvido para complementar a skill govbr-design-system.
Os dois projetos possuem responsabilidades diferentes:
govbr-design-system
│
└── Instruções, regras e boas práticas
para orientar agentes de IA
govbr-ds-mcp
│
└── Documentação, busca, Resources,
Tools e PromptsEles podem ser utilizados juntos por agentes compatíveis.
Conceitualmente:
Agente de IA
│
┌───────────┴───────────┐
│ │
Skill MCP
│ │
Como se comportar O que a documentação diz
Boas práticas Componentes
Regras de uso Acessibilidade
Orientações Busca
ResourcesComo contribuir
Contribuições são bem-vindas.
Algumas áreas interessantes para contribuição:
melhoria do parser de documentação;
melhoria da relevância da busca;
criação de novos testes;
suporte a novas fontes oficiais do GovBR-DS;
melhoria da compatibilidade com clientes MCP;
suporte às bibliotecas oficiais;
identificação de componentes não documentados;
correção de dados interpretados incorretamente.
Antes de enviar um Pull Request:
npm testTambém confirme que o projeto continua passando pelo typecheck/build utilizado no repositório.
Aviso
O govbr-ds-mcp é um projeto open source independente.
Ele não é mantido, endossado ou oficialmente suportado pelo Governo Federal Brasileiro ou pela equipe responsável pelo GovBR Design System.
A documentação e os recursos do GovBR-DS utilizados pelo projeto continuam sujeitos às licenças e termos de seus respectivos projetos originais.
Licença
Consulte o arquivo LICENSE para informações sobre a licença deste projeto.
Available Tools
3 toolsget_componentA
Obtém a documentação oficial sincronizada completa de um componente do GovBR Design System. Use quando já souber qual componente GovBR-DS precisa consultar.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The tool name and description imply a read-only operation without side effects, but it does not explicitly state that the operation is safe or what the response format will be. Since no annotations are provided, the description carries the burden but remains reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of one functional sentence and a usage note. It is well-structured and directly addresses the tool's purpose without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides sufficient context for a simple retrieval tool, indicating the source (GovBR Design System) and the condition for use (knowing the component). It does not detail the output structure, but given the lack of an output schema and the straightforward nature of the operation, it is adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'name' is defined in the schema with type and minLength but no description. The tool description implies that 'name' should be the component name, but does not provide explicit format or examples. The parameter semantics are only partially conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves complete official documentation for a specific GovBR Design System component, and explicitly notes it should be used when the component name is already known, distinguishing it from the sibling tools list_components and search_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool: 'Use quando já souber qual componente GovBR-DS precisa consultar.' This clearly indicates it is for direct retrieval by name, contrasting with listing or searching.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_componentsA
Lista os componentes documentados do GovBR Design System disponíveis neste servidor. Use para descobrir quais componentes GovBR-DS podem ser consultados.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses an important scope constraint (components 'available on this server'), but does not describe output format, ordering, pagination, or confirm the read-only nature beyond the verb 'list'. Adequate for a simple operation, but lacks richer behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action and resource, and every sentence adds value. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless listing tool with no output schema, the description is sufficiently complete: it states what is listed, the scope (this server), and the intended use case. While it doesn't specify the return shape, the simplicity of a list tool makes this an acceptable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema covers 100% (empty schema). Baseline for 0 params is 4. The description adds no parameter-specific meaning, but none is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Lists the documented components of GovBR Design System available on this server' with a specific verb and resource. It also distinguishes itself from siblings by framing this as the discovery gateway for which GovBR-DS components can be queried, contrasting with get_component and search_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'Use to discover which GovBR-DS components can be consulted.' This tells the agent when to invoke the tool, though it does not explicitly name alternatives or exclusionary conditions. A clear, non-exhaustive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsA
Pesquisa na documentação oficial sincronizada do GovBR Design System (GovBR-DS). Use esta ferramenta sempre que precisar responder perguntas sobre componentes, uso, comportamento, acessibilidade, padrões ou recomendações do GovBR-DS. Prefira esta fonte em vez de pesquisa web para dúvidas sobre GovBR-DS.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| component | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does not mention side effects, read-only nature, authentication, rate limits, or any behavioral traits beyond the obvious 'search' action. The description adds no insight into what happens during the search or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with purpose, and goes straight to the point. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately simple but has no output schema, no annotations, and no parameter documentation. The description covers the what and when but omits return format, query construction, component filter usage, and potential limitations. Given the available structured data, it remains incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
schema_description_coverage is 0% and the description does not reference any parameters (query, limit, component). It only implies searching for components but does not explain how to use parameters or their semantics. The description fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Pesquisa na documentação oficial sincronizada do GovBR Design System' (searches the official synchronized documentation), which clearly identifies the action (search) and resource (GovBR-DS docs). It distinguishes from siblings like list_components and get_component by focusing on searching across documentation rather than retrieving specific component details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use the tool ('sempre que precisar responder perguntas sobre componentes, uso, comportamento, acessibilidade, padrões ou recomendações do GovBR-DS') and even recommends it over web search for GovBR-DS questions. It lacks an explicit 'when not to use' relative to sibling tools, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
get_component - First observed
list_components - First observed
search_docs
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: list_components is for discovery, get_component is for retrieving full docs of a known component, and search_docs is for answering arbitrary questions across the documentation. Their usage guidance avoids ambiguity.
All tools follow a consistent verb_noun pattern: list_components, get_component, and search_docs. The naming clearly signals the operation being performed, and any plural/singular variation follows conventional API naming.
With three tools, the server is lean but well-scoped for its purpose of querying GovBR-DS documentation. Each tool earns its place by covering a distinct access mode: browsing, direct retrieval, and searching.
For a read-only documentation server, the surface is complete: users can discover available components, fetch complete documentation for a known component, and search for behavioral or accessibility guidance. No obvious dead ends or missing operations exist for the stated domain.
Maintenance
Related MCP Connectors
Access and search Branch's official API documentation directly within any AI agent or client.
Serves your design system and coding standards to coding agents, so they stop guessing.
Access and maintain design system docs, tokens, components, skills, and contexts across any project.
Connect AI agents to ProductNow's context engine to search, create, review, and act.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol implementation that enables AI-powered access to documentation resources, featuring URI-based navigation, template matching, and structured documentation management.9MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching and reading of PortOne documentation, including OpenAPI schemas and product guides, through the Model Context Protocol. It allows AI agents to easily access and integrate payment-related technical specifications into their workflows.8 npmISC
- AlicenseAqualityDmaintenanceProvides AI assistants with direct access to the complete Godot Engine documentation, including classes, tutorials, and features. It enables developers to retrieve and analyze official documentation through natural language interfaces using the Model Context Protocol.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to query Brazilian public data such as CEP, CNPJ, DDD, exchange rates, banks, and holidays via the Model Context Protocol.12MIT