Collection of MCP server examples and exercises for a Python MCP course, including tools for arXiv paper search, OMDb movie lookup, Sakila database queries, RAG-based incident support, and multi-server orchestration
This is a teaching/exercise repository with 36 tools spread across 9 different MCP servers. The tool definitions are present and mostly properly structured with FastMCP, but quality is uneven. Most tools have descriptions (good), but many descriptions are short (10-50 chars) and lack depth about WHEN to use the tool or WHAT the actual behavior is. Parameter descriptions exist but are often minimal. No input schemas are visible in the provided source code, we can see parameter names and types via function signatures, but not explicit JSON Schema declarations. Output schemas are undocumented. Error handling guidance is absent. The teaching focus means many tools are intentionally simplified or stub implementations (especially in ej12_mcp_token_optimization/many_tools_mcp_server.py, where 12 of 14 tools are deliberate no-ops). Overall, this represents typical teaching material quality: functional but not production-grade.
Ejemplo de elicitation con FastMCP. Flujo: - El servidor pide al usuario qué paper de arXiv analizar y si confirma el análisis. - El cliente (Inspector, Claude, Cursor...) mostrará el formulario en la zona de "When the server requests information from the user…".
Devuelve un chiste de padre aleatorio desde una lista en Python.
Compara dos papers de arXiv y resume sus similitudes, diferencias metodológicas y contribuciones relativas.
Busca una película en OMDb por título (y opcionalmente año), obtiene sus detalles y crea un registro en la tabla film de sakila. Esto demuestra que MCP no solo sirve para leer datos, sino también para escribir/editar registros en una base de datos.
Descarga el PDF de un paper de arXiv dado su id y devuelve la ruta local del archivo guardado.
Devuelve exactamente el mismo texto recibido. Útil para probar el cableado MCP sin lógica de negocio.
Input schemas not visible in source code. FastMCP decorators present but no explicit JSON Schema declaration provided in the code sample. Cannot verify full schema compliance (types, constraints, required vs optional fields). Assumed schemas are generated from function signatures, but this cannot be confirmed.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2025-06-18+ | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Exporta una o varias referencias de arXiv a formato BibTeX para gestores bibliográficos como Zotero, Mendeley o LaTeX.
Extrae las figuras y tablas de un paper de arXiv y devuelve sus leyendas junto con las URLs de las imágenes.
Devuelve la información detallada de un artículo concreto de arXiv a partir de su identificador (arxiv_id), incluyendo título, autores, año y un resumen ampliado. Úsala cuando el usuario quiera profundizar en un paper concreto que ya conoce por su id.
Versión MCP de extract_info. Igual que la anterior, pero expuesta como tool MCP.
Encuentra papers relacionados con uno dado, usando similitud de tema y de citas, y devuelve la lista de candidatos más cercanos.
Devuelve la cita bibliográfica de un paper en el estilo solicitado (APA, MLA, Chicago, IEEE), lista para pegar en un documento.
Recupera el perfil de un autor (afiliación, número de publicaciones, áreas principales y papers más citados) a partir de su nombre.
Devuelve el número de citas que ha recibido un paper y su evolución aproximada por año.
Devuelve información detallada de una película concreta.
Devuelve películas de una categoría concreta (por nombre). Ejemplo de prompt al modelo: - "Quiero algunas películas de acción recientes."
Devuelve las últimas películas registradas en sakila. No usa datos de OMDb, solo la base de datos local.
Devuelve detalles sobre la película indicada, necesita un imdb_id válido. Se puede especificar un plot resumido o uno detallado.
Devuelve el número de películas por rating (G, PG, PG-13, etc.). Esta salida es ideal para construir una visualización (p. ej. gráfico de barras) en el cliente Streamlit.
Devuelve los temas en tendencia dentro de una categoría de arXiv para el periodo indicado (week, month, year), ordenados por volumen de publicación.
Reconstruye el índice de embeddings desde la base de datos.
Lista las categorías y subcategorías temáticas de arXiv (cs.AI, cs.CL, stat.ML, ...) con una breve descripción de cada una.
Devuelve las últimas entradas de feedback guardadas.
Devuelve una descripción sencilla de los servidores que este orquestador usa. No llama a los servidores, solo documenta la topología que se espera.
Ejecuta el pipeline RAG y devuelve la respuesta junto con las fuentes.
Tool de orquestación que combina dos servidores MCP del curso: - Servidor RAG de incidencias (ej7_mcp_rag_db/rag_mcp_server.py) - Servidor arXiv (ej2_4_chatbot_arxiv/arxiv_mcp_server.py) Flujo: - Pregunta al servidor RAG para obtener una respuesta basada en tickets internos. - Usa arXiv para buscar papers relevantes sobre el mismo tema.
Guarda feedback de un usuario sobre una respuesta RAG.
Busca películas cuyo título contenga el texto dado (case insensitive). Devuelve una lista acotada de películas con algunos campos básicos. Esta tool ilustra una consulta muy dirigida: el host debe saber qué quiere buscar y pasar un patrón concreto.
Permite buscar películas en la api rest de omdb
Busca artículos científicos en arXiv sobre un tema y devuelve una lista con sus metadatos básicos (arxiv_id, título, autores, año y resumen). Úsala como primer paso cuando el usuario pide encontrar papers sobre un tema, autor o área de investigación.
Versión MCP de search_papers. Internamente reutiliza la función Python local, pero se expone como herramienta MCP. De cara al modelo, la herramienta se descubre dinámicamente vía list_tools().
Get information about the current server.
Suma dos números y devuelve el resultado. OJO: está mal a propósito (a + b * 0.5) para demostrar en clase que el que hace la operación es el servidor MCP, no el modelo.
Genera un resumen en lenguaje llano de un paper de arXiv dado su id, con una longitud máxima configurable en palabras.
Traduce un texto (por ejemplo, el resumen de un paper) al idioma destino indicado mediante su código ISO (en, es, fr, de, ...).
Tool de introspección sencillo para mostrar el "estado" del servidor MCP. Útil en clase para que veas que el servidor tiene identidad propia (nombre, tipo de transporte, etc.) y que ese contexto se puede leer desde los tools.
Output schemas completely undocumented. No tool explicitly documents what fields are returned, their types, or what chaining IDs are available for downstream tool calls. This forces LLMs to infer response structure from tool names alone, increasing hallucination risk.
Short, minimal descriptions for several tools. Tools like 'index_tickets' (40 chars: 'Reconstruye el índice de embeddings desde la base de datos.'), 'server_info' (50 chars), and 'analyze_paper_with_confirmation' lack detail on WHEN to call them vs similar tools, what dependencies exist, or what side effects occur. LLMs cannot reliably select between similar tools with vague descriptions.
Stub implementations without clear labeling. In ej12_mcp_token_optimization/many_tools_mcp_server.py, 12 of 14 tools (summarize_paper, translate_text, format_citation, export_bibtex, find_related_papers, get_author_profile, list_categories, get_trending_topics, download_pdf, compare_papers, extract_figures, get_citation_count) return _stub() placeholder objects with no real functionality. The description comments note they are 'stubs', but an LLM calling these will receive synthetic data that does not match the description promises, leading to hallucination or confidence in false results.
No error handling guidance. No tool descriptions explain what errors can occur, how to recover, or what the LLM should do next. Tools like 'create_film_from_omdb' (WRITE operation) and 'download_pdf' (network-dependent) have no documented retry logic, rate limits, or failure modes.
Destructive operations lack confirmation. Tools like 'index_tickets' (WRITE), 'save_feedback' (WRITE), and 'create_film_from_omdb' (WRITE) have no explicit confirmation or dry-run support. Descriptions do not warn LLMs about irreversible consequences.
Ambiguous tool naming in orchestration layer. Tool 'research_incident_with_papers' combines two concerns (RAG incident lookup + arXiv search) in one tool, and the name does not follow strict verb_noun convention (lacks clear action verb). This violates single-responsibility principle and makes composition harder.
Parameter descriptions sometimes missing or generic. Several tools have parameters with minimal guidance: 'plot' in get_movie_detail says 'Plot detail level' (30 chars) without explaining the difference or use case. 'period' in get_trending_topics says 'Time period' without units or examples.
Elicitation tool (analyze_paper_with_confirmation) documents user interaction but lacks clarity on what questions are asked, what input format is expected, or how to interpret the response. Description is explanatory prose rather than actionable guidance for LLM integration.