Skip to main content
Glama
kartikeya788

pharma-rag-mcp

by kartikeya788

pharma-rag-mcp

Un sistema de Generación Aumentada por Recuperación (RAG) totalmente local y de extremo a extremo para inteligencia de ventas farmacéuticas, construido con LangChain, ChromaDB, Ollama y el Protocolo de Contexto de Modelo (MCP).

El sistema ingiere etiquetas de medicamentos, documentos de ensayos clínicos y notas de llamadas de ventas en una base de datos vectorial local, los expone como herramientas MCP y responde preguntas en lenguaje natural a través de un agente ReAct de LangGraph respaldado por un LLM que se ejecuta localmente.


Arquitectura

data/sources/          ← raw .txt files (drug labels, trials, call notes)
      │
      ▼
data/ingest.py         ← loads, splits into chunks, embeds with all-MiniLM-L6-v2
      │
      ▼
chroma_db/             ← persisted ChromaDB collections (384-dim vectors)
  ├── drug_info/
  ├── competitor_intel/
  └── pitch_content/
      │
      ▼
mcp_server/server.py   ← MCP server over stdio — exposes 4 retrieval tools
      │   (MCP JSON-RPC)
      ▼
agent/agent.py         ← LangGraph ReAct agent (ChatOllama + MCP tools)
      │
      ▼
ui/app.py              ← Gradio chat interface (browser)

Módulos de soporte

Módulo

Propósito

rag/embeddings.py

Envoltorio del modelo de embeddings de HuggingFace (all-MiniLM-L6-v2)

rag/vectorstore.py

Constructor / cargador de colecciones de ChromaDB

eval/evaluate.py

Evaluación de calidad de recuperación (Hit Rate, MRR, Precisión de Contexto)


Related MCP server: DocAgent-MCP

Base de conocimiento

11 medicamentos × 3 tipos de documentos = 33 archivos fuente:

Colección

Carpeta fuente

Contenidos

drug_info

data/sources/drug_labels/

Resúmenes de etiquetas de medicamentos estilo FDA

competitor_intel

data/sources/clinical_trials/

Resultados de ensayos clínicos

pitch_content

data/sources/call_notes/

Transcripciones de llamadas de representantes de ventas

Medicamentos: Dupixent, Eliquis, Entresto, Farxiga, Fasenra, Jardiance, Rinvoq, Skyrizi, Trelegy Ellipta, Trulicity, Xarelto


Requisitos previos

  • Python 3.13+

  • Ollama ejecutándose localmente con un modelo descargado:

    ollama pull llama3.2
  • Un entorno virtual de Python con las dependencias instaladas (ver Configuración).


Configuración

# 1. Clone and enter the project
git clone <repo-url>
cd pharma-rag-mcp

# 2. Create and activate a virtual environment
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS / Linux:
source .venv/bin/activate

# 3. Install dependencies
pip install -r requirements.txt

# 4. Configure environment (optional — defaults work out of the box)
cp .env.example .env
# Edit .env to set OLLAMA_MODEL and OLLAMA_BASE_URL if needed

# 5. Build the vector database (only needed once)
python -m data.run_ingest

Ejecución del sistema

Cada capa se puede usar de forma independiente. Inicia Ollama antes de usar el agente o la interfaz de usuario.

Agente (CLI)

python -m agent.agent

Chat interactivo de línea de comandos con memoria de dos niveles:

  • Memoria de sesión — la consulta de cada turno, las herramientas utilizadas, el modo de fuente y la respuesta se mantienen en RAM durante la ejecución actual.

  • Memoria a largo plazo — al salir, la sesión se añade (con marcas de tiempo) a memory/long_term.json en disco.

Escribe cualquiera de bye, close, end, exit, goodbye, quit para salir: el agente imprimirá un resumen de la sesión y vaciará la memoria antes de terminar.

Modos de fuente de respuesta

El agente detecta y etiqueta cómo se produjo cada respuesta:

Insignia

Significado

[Fuente: Base de conocimiento]

Respuesta fundamentada completamente en fragmentos recuperados

[Fuente: Base de conocimiento + Conocimiento general]

Hechos recuperados combinados con experiencia general; los puntos fuera de la base de conocimiento se marcan [GK] en línea

[Fuente: Solo conocimiento general]

Las herramientas no devolvieron nada relevante; se respondió desde conocimiento general farmacéutico/de ventas

Contexto multi-turno

El agente pasa los últimos N turnos del historial de conversación al LLM en cada pregunta, de modo que preguntas de seguimiento como "me ignoró, ¿cómo vuelvo a involucrarlo?" se responden en contexto. N se controla mediante config.yaml:

agent:
  history_window: 3   # number of prior turns to include

Interfaz de usuario Gradio (navegador)

python -m ui.app

Abre una interfaz de chat en http://localhost:7860.

Solo servidor MCP (transporte stdio)

python -m mcp_server.server

Carga las tres colecciones de ChromaDB y espera mensajes JSON-RPC de MCP en stdin.

Herramientas registradas:

Herramienta

Descripción

search_drug_info

Buscar documentos de etiquetas de medicamentos

search_competitor_intel

Buscar datos de ensayos clínicos

search_pitch_content

Buscar notas de llamadas de ventas

search_all

Buscar en las tres colecciones, combinadas

Evaluación de recuperación

# Evaluate all three collections
python -m eval.evaluate

# Evaluate one collection with k=5
python -m eval.evaluate --collection drug_info --k 5

Imprime Hit Rate, MRR y Precisión de Contexto por colección y en conjunto.


Configuración

Archivo

Propósito

.env

Modelo de Ollama y URL base (copiar de .env.example)

config.yaml

Comportamiento del agente (ventana de historial de conversación)

.env

Variable

Valor predeterminado

Descripción

OLLAMA_MODEL

llama3.2

Nombre del modelo de Ollama (debe descargarse primero)

OLLAMA_BASE_URL

http://localhost:11434

URL del daemon HTTP de Ollama

config.yaml

agent:
  history_window: 3   # prior turns passed to LLM for multi-turn context

Estructura del proyecto

pharma-rag-mcp/
├── config.yaml             # Agent configuration
├── data/
│   ├── ingest.py           # IngestionPipeline class
│   ├── run_ingest.py       # CLI: build + spot-check all collections
│   └── sources/
│       ├── drug_labels/    # 11 × drug label .txt files
│       ├── clinical_trials/# 11 × clinical trial .txt files
│       └── call_notes/     # 11 × sales call note .txt files
├── rag/
│   ├── embeddings.py       # EmbeddingModel (all-MiniLM-L6-v2)
│   └── vectorstore.py      # VectorStoreManager (ChromaDB)
├── mcp_server/
│   ├── server.py           # MCP server entrypoint (stdio)
│   └── tools.py            # 4 retrieval tool definitions
├── agent/
│   └── agent.py            # PharmaAgent + CLI loop with memory
├── ui/
│   └── app.py              # Gradio chat UI
├── eval/
│   └── evaluate.py         # Hit Rate / MRR / Context Precision
├── memory/
│   └── long_term.json      # Persisted session history (auto-created)
├── chroma_db/              # Persisted vector collections (git-ignored)
├── .env.example
├── pyproject.toml
└── requirements.txt

Decisiones de diseño clave

Local primero — sin APIs en la nube, sin claves de API. Embeddings mediante HuggingFace, almacenamiento vectorial mediante ChromaDB, generación mediante Ollama.

MCP como capa de recuperación — el servidor MCP separa limpiamente la recuperación de la generación. Cualquier cliente compatible con MCP puede llamar a las herramientas de búsqueda.

Modos de respuesta adaptativos — el agente detecta automáticamente si una pregunta se puede responder solo desde la base de conocimiento, requiere combinarse con experiencia general, o cae completamente fuera de la base de conocimiento. Cada respuesta está claramente etiquetada para que el usuario siempre sepa la fuente.

Ventana de historial deslizante — solo los últimos N turnos se envían al LLM, manteniendo acotado el uso de la ventana de contexto mientras se admiten conversaciones naturales de múltiples turnos.

Memoria de dos niveles — la memoria de sesión (en RAM) se vacía a un registro JSON persistente al salir, lo que proporciona un rastro de auditoría completo de cada consulta, herramienta utilizada, modo de fuente y respuesta en todas las ejecuciones.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables natural language queries on technical specifications and automated code compliance checks using local RAG with vector search, integrated via MCP.
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables local document question-answering and retrieval via MCP, supporting multi-turn conversation, intent recognition, and tools for document search, Q&A, and summarization.
    5
  • A
    license
    Not graded
    quality
    C
    maintenance
    A privacy-preserving local RAG system integrated with MCP, enabling natural language queries over ingested documents and a SQLite database through vector search and local database tools.
    MIT

View all related MCP servers

Related MCP Connectors

  • Multi-engine search for AI agents. Trust scoring, local corpus, MCP-native. Self-hostable, BYOK.

  • Certified SEC EDGAR fact memory for AI agents with zero hallucination and filing provenance.

  • Hosted MCP server exposing US hospital procedure cost data to AI assistants

View all MCP Connectors

Latest Blog Posts

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/kartikeya788/pharma-rag-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server