# v0idseeker/rag-mcp architecture

> Architecture diagram of the GitHub repository v0idseeker/rag-mcp, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/v0idseeker/rag-mcp
- Repository: https://github.com/v0idseeker/rag-mcp

## Overview

DocMCP ingests local PDFs into ChromaDB, then exposes semantic search and document-management tools through JavaScript or Python MCP servers; its web UI adds ingestion, search, collection management, and RLM-backed asking. The graph preserves both implementations and the UI path. Some Python server and UI routes are only partially excerpted, so edges for documented capabilities use the README; unsampled implementation details are not expanded.

Main entry points: [`ui/app.js`](https://github.com/v0idseeker/rag-mcp/blob/main/ui/app.js) (UI Client), [`src2/server.py`](https://github.com/v0idseeker/rag-mcp/blob/main/src2/server.py) (RLM Reasoning), [`src/ingest.js`](https://github.com/v0idseeker/rag-mcp/blob/main/src/ingest.js) (JS Ingestion), [`src2/ingest.py`](https://github.com/v0idseeker/rag-mcp/blob/main/src2/ingest.py) (Python Ingestion)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["PDF Ingestion"]
  node_js_ingest["JS Ingestion<br/>[ingest.js]"]
  node_js_embed["JS Embedder<br/>[embedder.js]"]
  node_py_ingest["Python Ingestion<br/>[ingest.py]"]
  node_py_embed["Python Embedder<br/>[embedder.py]"]
end

subgraph group_mcp["MCP Search"]
  node_js_server["JS MCP Tools<br/>[index.js]"]
  node_py_server["Python MCP Tools<br/>[server.py]"]
end

subgraph group_ui["Web Interface"]
  node_ui_pages["UI Pages"]
  node_ui_logic["UI Client<br/>[app.js]"]
  node_ui_api["UI API<br/>[ui-server.js]"]
  node_ui_ingest["UI Ingestion<br/>[ingest.js]"]
  node_ui_search["UI Search<br/>[ui-server.js]"]
  node_ui_ask["UI Ask<br/>[ui-server.js]"]
end

subgraph group_reason["RLM Reasoning"]
  node_rlm["RLM Reasoning<br/>[server.py]"]
  node_rlm_lib["RLM Library"]
end

node_user(("User"))
node_mcp_client(("MCP Client"))
node_pdfs["PDF Files"]
node_chroma[("ChromaDB")]
node_local_llm{{"Local LLM"}}
node_browser(("Browser"))

node_user -->|"provides PDFs"| node_pdfs
node_pdfs -->|"ingests files"| node_js_ingest
node_pdfs -->|"ingests files"| node_py_ingest
node_js_ingest -->|"embeds chunks"| node_js_embed
node_js_ingest -->|"stores chunks"| node_chroma
node_py_ingest -->|"embeds chunks"| node_py_embed
node_py_ingest -->|"stores chunks"| node_chroma
node_mcp_client -->|"calls tools"| node_js_server
node_mcp_client -->|"calls tools"| node_py_server
node_js_server -->|"embeds query"| node_js_embed
node_js_server -->|"queries and manages"| node_chroma
node_py_server -->|"embeds query"| node_py_embed
node_py_server -->|"queries and manages"| node_chroma
node_user -->|"uses UI"| node_browser
node_browser -->|"opens pages"| node_ui_pages
node_ui_pages -->|"loads client"| node_ui_logic
node_ui_logic -->|"calls API"| node_ui_api
node_ui_api -->|"starts ingestion"| node_ui_ingest
node_ui_ingest -->|"embeds chunks"| node_js_embed
node_ui_logic -->|"requests search"| node_ui_search
node_ui_search -->|"searches vectors"| node_chroma
node_ui_logic -->|"asks question"| node_ui_ask
node_ui_ask -->|"dispatches reasoning"| node_rlm
node_rlm -->|"retrieves documents"| node_chroma
node_rlm -->|"uses library"| node_rlm_lib
node_rlm -->|"delegates sub-LLM"| node_local_llm

click node_js_ingest "https://github.com/v0idseeker/rag-mcp/blob/main/src/ingest.js"
click node_js_embed "https://github.com/v0idseeker/rag-mcp/blob/main/src/embedder.js"
click node_py_ingest "https://github.com/v0idseeker/rag-mcp/blob/main/src2/ingest.py"
click node_py_embed "https://github.com/v0idseeker/rag-mcp/blob/main/src2/embedder.py"
click node_js_server "https://github.com/v0idseeker/rag-mcp/blob/main/src/index.js"
click node_py_server "https://github.com/v0idseeker/rag-mcp/blob/main/src2/server.py"
click node_ui_pages "https://github.com/v0idseeker/rag-mcp/tree/main/ui"
click node_ui_logic "https://github.com/v0idseeker/rag-mcp/blob/main/ui/app.js"
click node_ui_api "https://github.com/v0idseeker/rag-mcp/blob/main/ui-server.js"
click node_ui_ingest "https://github.com/v0idseeker/rag-mcp/blob/main/src/ingest.js"
click node_ui_search "https://github.com/v0idseeker/rag-mcp/blob/main/ui-server.js"
click node_ui_ask "https://github.com/v0idseeker/rag-mcp/blob/main/ui-server.js"
click node_rlm "https://github.com/v0idseeker/rag-mcp/blob/main/src2/server.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_js_ingest,node_js_embed,node_py_ingest,node_py_embed,node_user,node_mcp_client,node_browser toneBlue
class node_js_server,node_py_server,node_chroma toneAmber
class node_ui_pages,node_ui_logic,node_ui_api,node_ui_ingest,node_ui_search,node_ui_ask toneMint
class node_rlm,node_rlm_lib toneRose
class node_pdfs,node_local_llm toneIndigo
```

## Components

### PDF Ingestion

- [JS Ingestion](https://github.com/v0idseeker/rag-mcp/blob/main/src/ingest.js): `src/ingest.js`
- [JS Embedder](https://github.com/v0idseeker/rag-mcp/blob/main/src/embedder.js): `src/embedder.js`
- [Python Ingestion](https://github.com/v0idseeker/rag-mcp/blob/main/src2/ingest.py): `src2/ingest.py`
- [Python Embedder](https://github.com/v0idseeker/rag-mcp/blob/main/src2/embedder.py): `src2/embedder.py`

### MCP Search

- [JS MCP Tools](https://github.com/v0idseeker/rag-mcp/blob/main/src/index.js): `src/index.js`
- [Python MCP Tools](https://github.com/v0idseeker/rag-mcp/blob/main/src2/server.py): `src2/server.py`

### Web Interface

- [UI Pages](https://github.com/v0idseeker/rag-mcp/tree/main/ui): `ui`
- [UI Client](https://github.com/v0idseeker/rag-mcp/blob/main/ui/app.js): `ui/app.js`
- [UI API](https://github.com/v0idseeker/rag-mcp/blob/main/ui-server.js): `ui-server.js`
- [UI Ingestion](https://github.com/v0idseeker/rag-mcp/blob/main/src/ingest.js): `src/ingest.js`
- [UI Search](https://github.com/v0idseeker/rag-mcp/blob/main/ui-server.js): `ui-server.js`
- [UI Ask](https://github.com/v0idseeker/rag-mcp/blob/main/ui-server.js): `ui-server.js`

### RLM Reasoning

- [RLM Reasoning](https://github.com/v0idseeker/rag-mcp/blob/main/src2/server.py): `src2/server.py`
- **RLM Library**

### Other components

- **User**
- **MCP Client**
- **PDF Files**
- **ChromaDB**
- **Local LLM**
- **Browser**

## Connections

- User → PDF Files: provides PDFs (evidence: `Readme.md`)
- PDF Files → JS Ingestion: ingests files (evidence: `Readme.md`)
- PDF Files → Python Ingestion: ingests files (evidence: `Readme.md`)
- JS Ingestion → JS Embedder: embeds chunks (evidence: `src/ingest.js`)
- JS Ingestion → ChromaDB: stores chunks (evidence: `src/ingest.js`)
- Python Ingestion → Python Embedder: embeds chunks (evidence: `src2/ingest.py`)
- Python Ingestion → ChromaDB: stores chunks (evidence: `Readme.md`)
- MCP Client → JS MCP Tools: calls tools (evidence: `Readme.md`)
- MCP Client → Python MCP Tools: calls tools (evidence: `Readme.md`)
- JS MCP Tools → JS Embedder: embeds query (evidence: `src/index.js`)
- JS MCP Tools → ChromaDB: queries and manages (evidence: `src/index.js`)
- Python MCP Tools → Python Embedder: embeds query (evidence: `src2/server.py`)
- Python MCP Tools → ChromaDB: queries and manages (evidence: `src2/server.py`)
- User → Browser: uses UI (evidence: `Readme.md`)
- Browser → UI Pages: opens pages (evidence: `Readme.md`)
- UI Pages → UI Client: loads client (evidence: `Readme.md`)
- UI Client → UI API: calls API (evidence: `ui/app.js`)
- UI API → UI Ingestion: starts ingestion (evidence: `ui-server.js`)
- UI Ingestion → JS Embedder: embeds chunks (evidence: `src/ingest.js`)
- UI Client → UI Search: requests search (evidence: `ui/app.js`)
- UI Search → ChromaDB: searches vectors (evidence: `Readme.md`)
- UI Client → UI Ask: asks question (evidence: `ui/app.js`)
- UI Ask → RLM Reasoning: dispatches reasoning (evidence: `ui-server.js`)
- RLM Reasoning → ChromaDB: retrieves documents (evidence: `src2/server.py`)
- RLM Reasoning → RLM Library: uses library (evidence: `Readme.md`)
- RLM Reasoning → Local LLM: delegates sub-LLM (evidence: `Readme.md`)
