A .NET-based MCP server that integrates with a Books API and Ollama LLM service to provide book management and AI-powered book consultation tools
This MCP server exhibits significant quality gaps across naming, descriptions, parameter handling, and schema documentation. While tool definitions are visible in source code, most lack proper LLM-friendly descriptions and comprehensive parameter documentation. The tools are written in Portuguese, which is acceptable but reduces clarity for international agent systems. Error handling is present but generic. No output schemas are documented. The server attempts to implement custom tool registration but lacks adherence to agentic tool patterns.
Atualizar os dados de um livro
Baixa um modelo para o Ollama
Criar/Cadastrar um livro
Integração com a API de livros e o LLM do Ollama
Consulta livros e analisa o resultado com um modelo do Ollama
Exibe configurações de conexão do MCP Server
Gera texto com um modelo do Ollama
Lista os modelos disponíveis no Ollama
PascalCase naming convention throughout. All tool names use PascalCase (e.g., 'ObterAsync', 'CadastrarAsync') instead of snake_case verb_noun (e.g., 'get_books', 'create_book'). This violates the agentic tool pattern: LLMs parse intent from tool names and expect English verb_noun structure. PascalCase + Portuguese makes intent inference harder.
Duplicate and near-duplicate tools. 'ConsultarLivrosComIA' and 'ConsultarLivrosComAI' (IA vs AI suffix) perform identical operations. 'ObterAsync' and 'ObterPorAutor' both search books but with different parameters, should be unified into one 'search_books' tool with optional author/title filters. Duplicate tools force LLMs to reason unnecessarily between similar options.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 42 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 25 | - | v1 |
Buscar os livros da livraria, definindo um filtro opcional por titulo
Buscar os livros da livraria, definindo um filtro opcional por autor
Integração avançada entre a API de Livros e modelos do Ollama
Verifica a conectividade entre os sistemas (MCP Server, Ollama e API de Livros)
Vague tool name 'RealizarTarefaCompleta' (perform complete task). Violates pattern guidance: avoid generic names like 'process', 'handle', 'run'. This tool's purpose is underspecified, what types of tasks? LLMs will misuse it or call it when more specific tools are available. Name should clarify the domain (e.g., 'analyze_books_with_ollama' or 'batch_book_analysis').
No output schemas documented for any tool. Every tool returns string responses but the expected format, fields, and structure are not documented. LLMs cannot reliably parse unstructured text, they need to know: Is the response JSON? CSV? Plain text? Does it contain an array or single object? Without output schemas, LLMs must reverse-engineer response structure, wasting tokens and inviting parsing errors.
Nested object parameters lack descriptions. 'CadastrarAsync' and 'AtualizarAsync' accept a 'livro' object with properties id/titulo/autor, but the schema shows only the object type, individual nested properties (id, titulo, autor) have no descriptions. LLMs cannot infer what each nested field controls or whether it is required.
Examples in descriptions instead of constraints. 'BaixarModelo' description includes example model names ('llama3, gemma:7b'), LLMs tend to reuse example values literally. Should define valid model name format (e.g., 'alphanumeric + colon for version') or call 'ListarModelosOllama' first to enumerate valid models.
WRITE operations lack side-effect warnings. 'CadastrarAsync', 'AtualizarAsync', and 'BaixarModelo' modify state but their descriptions do not warn of irreversibility or require confirmation. According to pattern guidance, destructive/write operations should either document side effects or implement a confirmation step. No indication these operations are idempotent or retryable.
Error messages are generic catch-all strings. Tools return '$message: {ex.Message}' (e.g., 'Erro ao buscar livros: {exception}') without guiding the LLM on recovery. Per pattern guidance, error responses must indicate: is this retryable? Should I ask the user? Or is it fatal? A 'not found' error should suggest 'Try search_users() first' or list available options.
Descriptions are Portuguese. While not technically wrong, tool descriptions in Portuguese reduce clarity for LLM systems typically trained on English documentation. Most production tools standardize on English for international agent use. This will cause friction in multilingual environments.