Skip to content
Conduit

mcp server

ScholarGen

AI-powered continuous learning & talent intelligence platform — multi-agent LangGraph ReAct system with MCP tools, real-time skill profiling, org-level workforce analytics, and 7 LLM providers.

zeeshanparwez/ScholarGencommunitylistedunreviewed

Set up

Runs on your computer. Pick your agent and operating system.

This project does not publish an install method we can turn into a config. Follow the README instead.

README

synced Oct 23, 2026

UpskillOS is a multi-agent AI platform that transforms how professionals learn and how organisations understand their talent. It started as a personal tool for an AI engineer who needed to stay current — and evolved into a full organisational intelligence system.

Unlike traditional LMS platforms that track completions, UpskillOS uses behavioural data — what people actually search, ask, and study — to build living skill profiles, identify org-wide capability gaps, and generate executive-ready talent briefs. All powered by a multi-agent architecture where each LLM provider operates as an independent agent with access to real-time research tools via the Model Context Protocol (MCP).


What Makes This Different

Traditional LMSUpskillOS
Tracks course completionsExtracts skills from actual learning behaviour
Static skill matrices from self-reportingLiving profiles that update after every session
Annual surveys for org insightsReal-time dashboards from aggregated behaviour
Generic course cataloguesAI agent that reasons, searches, and builds curricula
Single LLM or no AIMulti-agent system with 7 LLM providers and cascading fallback

Core Capabilities

1. Multi-Agent AI Assistant with MCP Tool Integration

This is not a single-model chatbot wrapper. UpskillOS runs a multi-agent architecture where each LLM provider (Azure OpenAI, Gemini, NVIDIA NIM, Groq, DeepSeek, QwQ) is registered as an independent LangGraph ReAct agent with full access to a shared tool layer.

The tool layer is built entirely on the Model Context Protocol (MCP) — the open standard for connecting LLMs to external data sources. Each tool runs as a separate MCP server subprocess, communicating over stdio transport. The agent reasons about which tools to invoke, executes them (sometimes in parallel), and synthesises the results into a structured response — all streamed token-by-token via SSE.

Built-in MCP Tools:

ToolMCP ServerWhat It Does
search_papersresearch_mcp.py (FastMCP)Searches arXiv and caches results in an in-session ChromaDB vector store
extract_inforesearch_mcp.py (FastMCP)Retrieves full metadata for a specific arXiv paper
search_cached_papersresearch_mcp.py (FastMCP)Semantic search across all papers fetched in the current session
get_transcriptyoutube_mcp.py (FastMCP)Extracts full transcripts from YouTube videos
fetchmcp-server-fetch (uvx)Retrieves and processes content from any web URL
find_nptel_coursesLangChain ToolSemantic vector search across 3,200+ NPTEL courses (ChromaDB, 768d embeddings)

Extensible by design — you can add your own MCP tools by dropping a new FastMCP server script into backend/mcp/ and registering it in agent_orchestrator.py. The agent will automatically discover and use the new tools. Any tool that speaks the MCP protocol (stdio or SSE transport) plugs in directly.

2. Org Analytics & Workforce Intelligence

Every interaction on the platform generates behavioural data. That data is aggregated into an org-level intelligence dashboard designed for CHROs and Talent Development leaders — no surveys, no forms, no self-reporting.

  • Skill Gap Heatmap — which capabilities are critically thin across the organisation
  • Learning Velocity — average streak, active learners, completion rates
  • AI Executive Brief — one-click generation of a board-ready workforce intelligence report (org health score, risk areas, priority actions with 30/60/90-day timelines)
  • Gap Training Campaigns — click any skill gap → get a structured multi-week training plan with objectives, resources, and success metrics

3. Employee × Skill Matrix

A dense, real-time view of every employee mapped against the organisation's top skills. Green means developing. Missing means gap. Click any gap to generate a targeted training campaign.

Derived from actual learning behaviour, not annual self-assessments. The matrix updates as people learn.

4. Career Intelligence & Learning Path Generation

Map the journey from Current Role → Target Role with a structured, phased learning plan. The engine analyses the skill delta, identifies the gaps, and maps specific NPTEL courses and resources to each phase — generated in seconds, not weeks.

Also includes: Onboarding Planner (role + department → 30-day structured plan), Career Readiness Score, and JD Analyser (paste a job description → get a gap analysis against your profile).

5. Semantic Course & Research Discovery

Vector search across 3,200+ NPTEL courses using Gemini embeddings (768 dimensions) stored in ChromaDB. Search by concept, not keyword — "distributed consensus algorithms" finds courses on Paxos, Raft, and Byzantine fault tolerance even if those exact words aren't in the title.

Live arXiv integration surfaces today's papers, not a cached database.

6. Behavioural Profile Extraction

Every conversation is silently analysed by the LLM. Skills and interests are extracted from what users do — not what they claim on a form. The profile updates itself after every session.

This is the foundation of everything else. The skill matrix, the org analytics, the talent network — all built on top of these auto-extracted profiles.

7. Additional Capabilities

FeatureDescription
Skill AssessmentAI-generated MCQs on any topic — fresh questions every attempt, no question bank
Learning TrackerProgress tracking with daily streak — measures consistency, not just completions
Talent NetworkSemantic skill matching to discover mentors, collaborators, and complementary expertise
Saved ResponsesBookmark any AI response to build a personal knowledge base
Pomodoro TimerBuilt-in focus sessions for structured learning
Career ToolsJD analyser, resume parser, cover letter generator, playlist study guide

Architecture

Multi-Agent LLM Routing

UpskillOS doesn't depend on a single LLM. It maintains multiple independent agents, each backed by a different provider, with automatic cascading fallback:

Azure OpenAI (GPT-4o Mini)     ← Primary agent (tool-capable, LangGraph ReAct)
  ↓ fallback
Google Gemini (3.1 Flash Lite)  ← Secondary agent (tool-capable, LangGraph ReAct)
  ↓ fallback
NVIDIA NIM (Llama 3.3 70B)     ← Tertiary agent (tool-capable, LangGraph ReAct)
NVIDIA NIM (Llama 4 Maverick)  ← Tool-capable agent
NVIDIA NIM (DeepSeek R1)       ← Reasoning model (chat-only, no tools)
NVIDIA NIM (QwQ 32B)           ← Reasoning model (chat-only, no tools)
Groq (GPT-OSS 120B)           ← Fast inference (chat-only, no tools)

Every tool-capable agent has access to the full MCP tool layer. Users can switch between providers in the UI. The system gracefully degrades — if Azure is down, it falls through to Gemini, then NIM.

System Architecture

graph TD
    subgraph Frontend
        UI[React 18 + Vite + Tailwind CSS]
    end

    subgraph Backend
        API[FastAPI + Uvicorn]
        AUTH[JWT Authentication]
    end

    subgraph Agent Layer
        ORCH[LangGraph Agent Orchestrator]
        AZURE[Azure OpenAI Agent]
        GEMINI[Gemini Agent]
        NIM[NVIDIA NIM Agents]
        GROQ[Groq Client]
    end

    subgraph MCP Tool Layer
        MCP1[research_mcp.py — arXiv + ChromaDB Cache]
        MCP2[youtube_mcp.py — Transcript Extraction]
        MCP3[mcp-server-fetch — Web Content]
        MCP4[Course Retriever — NPTEL Vector Search]
        MCP5[Your Custom MCP Tool]
    end

    subgraph Data
        DB[(SQLite WAL — Users, Profiles, Progress)]
        VEC[(ChromaDB — 3,200 Course Vectors)]
    end

    UI -->|HTTPS + SSE| API
    API --> AUTH
    API --> ORCH
    ORCH --> AZURE
    ORCH --> GEMINI
    ORCH --> NIM
    ORCH --> GROQ
    AZURE --> MCP1
    AZURE --> MCP2
    AZURE --> MCP3
    AZURE --> MCP4
    AZURE --> MCP5
    API --> DB
    MCP4 --> VEC

Adding Your Own MCP Tools

The tool layer is fully extensible. To add a new MCP tool:

1. Create a FastMCP server in backend/mcp/:

# backend/mcp/my_tool.py
# /// script
# dependencies = ["fastmcp", "mcp"]
# ///
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("my_tool")

@mcp.tool()
def my_custom_search(query: str) -> str:
    """Search your internal knowledge base."""
    # Your logic here
    return results

if __name__ == "__main__":
    mcp.run(transport="stdio")

2. Register it in backend/agent_orchestrator.py:

server_configs = [
    ("research", StdioServerParameters(command=_uv, args=["run", "backend/mcp/research_mcp.py"])),
    ("youtube",  StdioServerParameters(command=_uv, args=["run", "backend/mcp/youtube_mcp.py"])),
    ("fetch",    StdioServerParameters(command=_uvx, args=["mcp-server-fetch"])),
    ("my_tool",  StdioServerParameters(command=_uv, args=["run", "backend/mcp/my_tool.py"])),  # ← add this
]

That's it. The agent orchestrator auto-discovers all tools from each MCP server at startup. Every agent (Azure, Gemini, NIM) will immediately have access to your new tool.


Project Structure

ScholarGen/
├── backend/
│   ├── main.py                         # FastAPI app, lifespan, CORS, router registration
│   ├── agent_orchestrator.py           # MCP session manager — launches tool subprocesses
│   ├── jwt_utils.py                    # JWT token creation and verification
│   ├── dependencies.py                 # FastAPI auth dependency
│   ├── services/
│   │   └── chatbot_service.py          # Multi-agent orchestration, SSE streaming
│   ├── routers/
│   │   ├── auth.py                     # POST /register, POST /login
│   │   ├── chat.py                     # POST /stream (SSE), DELETE /clear
│   │   ├── courses.py                  # GET /search — NPTEL semantic search
│   │   ├── papers.py                   # GET /search — arXiv paper search
│   │   ├── flashcards.py              # POST /generate — AI MCQ generation
│   │   ├── collaborate.py             # GET / — semantic user matching
│   │   ├── learningpath.py            # POST /generate — role-to-role curriculum
│   │   ├── profile.py                 # GET/PUT — behavioural profile management
│   │   ├── career.py                  # POST /analyze, /readiness, /onboarding
│   │   ├── analytics.py              # GET /, /skill-matrix, POST /brief, /gap-plan
│   │   ├── bookmarks.py              # GET/POST/DELETE — saved responses
│   │   └── progress.py               # GET/POST/PUT/DELETE — learning tracker
│   ├── core/
│   │   ├── database.py                # SQLite WAL — schema, queries, analytics aggregation
│   │   ├── azure_llm.py              # Azure OpenAI helper (SDK + LangChain wrapper)
│   │   ├── course_retriever.py       # ChromaDB loader + LangChain tool wrapper
│   │   ├── collaboration.py          # Profile extraction + cosine similarity matching
│   │   ├── flashcards.py             # MCQ generation with multi-LLM fallback
│   │   └── key_manager.py            # API key rotation for Gemini
│   └── mcp/
│       ├── research_mcp.py            # FastMCP — arXiv search + in-session paper cache
│       └── youtube_mcp.py             # FastMCP — YouTube transcript extraction
├── frontend/
│   ├── src/
│   │   ├── api.js                     # API client with SSE streaming parser
│   │   ├── pages/
│   │   │   ├── LoginPage.jsx          # Authentication UI
│   │   │   └── ChatPage.jsx           # Main app shell — 11 feature panels
│   │   └── components/
│   │       ├── Sidebar.jsx            # Navigation + active tool indicators
│   │       ├── ChatInput.jsx          # Message input with voice support
│   │       ├── ChatMessage.jsx        # Markdown rendering with syntax highlighting
│   │       ├── AnalyticsPanel.jsx     # Org dashboard + skill matrix + executive brief
│   │       ├── LearningPathPanel.jsx  # Career path generator
│   │       ├── CareerPanel.jsx        # JD analyser, readiness score, onboarding
│   │       ├── CoursesPanel.jsx       # NPTEL semantic search
│   │       ├── PapersPanel.jsx        # arXiv paper discovery
│   │       ├── FlashcardModal.jsx     # AI skill assessment
│   │       ├── CollaboratePanel.jsx   # Talent network
│   │       ├── ProfilePanel.jsx       # User profile with auto-extracted skills
│   │       ├── ProgressPanel.jsx      # Learning tracker + streak
│   │       ├── BookmarksPanel.jsx     # Saved AI responses
│   │       ├── PomodoroTimer.jsx      # Focus timer
│   │       └── OnboardingModal.jsx    # First-run profile setup
│   └── dist/                          # Production build — served by FastAPI
├── Config/
│   ├── .env                           # API keys and secrets (gitignored)
│   └── .env.example                   # Template with all required variables
├── Data/
│   ├── nptel_courses_with_embeddings.xlsx  # Pre-embedded NPTEL catalogue
│   └── scholargen.db                       # SQLite database (auto-created)
├── scripts/
│   └── generate_embeddings.py         # Re-embed NPTEL catalogue with Gemini API
├── images/                            # Screenshots for documentation
├── requirements.txt
└── LICENSE

Quick Start

Prerequisites

  • Python 3.11+
  • Node.js 18+
  • uv — required for MCP server subprocess management
curl -LsSf https://astral.sh/uv/install.sh | sh

1. Clone & Install

git clone https://github.com/zeeshanparwez/ScholarGen.git
cd ScholarGen
pip install -r requirements.txt

2. Configure Environment

cp Config/.env.example Config/.env

Edit Config/.env with your API keys. At minimum, you need one LLM provider and a JWT secret. Azure OpenAI is recommended as the primary provider for production use.

See .env.example for all available configuration variables.

3. Build the Frontend

cd frontend
npm install
npm run build
cd ..

4. Run

uvicorn backend.main:app --host 0.0.0.0 --port 3256

Open http://localhost:3256. Create an account and start using the platform.

Development Mode

Run backend and frontend separately with hot reloading:

# Terminal 1 — Backend (auto-reloads on Python changes)
uvicorn backend.main:app --reload --port 3256

# Terminal 2 — Frontend (Vite dev server, proxies /api → backend)
cd frontend && npm run dev

SSE Streaming Protocol

POST /api/chat/stream returns text/event-stream with the following event types:

data: {"type": "token",     "content": "Hello"}           # Streamed token
data: {"type": "tool_call", "tool": "search_papers", "status": "start"}  # Tool invocation started
data: {"type": "tool_call", "tool": "search_papers", "status": "end"}    # Tool invocation completed
data: {"type": "done"}                                     # Stream complete
data: {"type": "error",     "content": "..."}              # Error occurred

The frontend renders tool status in real-time — users see exactly which MCP tools the agent is invoking as it reasons through their query.


Tech Stack

LayerTechnology
FrontendReact 18, Vite 5, Tailwind CSS 3
BackendFastAPI 0.115, Uvicorn, Python 3.11
Agent FrameworkLangGraph 0.6.7, LangChain 0.3
LLM ProvidersAzure OpenAI, Google Gemini, NVIDIA NIM, Groq
Tool ProtocolModel Context Protocol (MCP) via FastMCP + mcp-server-fetch
Vector StoreChromaDB 0.6 (in-memory, 768d Gemini embeddings)
DatabaseSQLite with WAL mode
AuthenticationJWT (PyJWT 2.9) + bcrypt
EmbeddingsGemini Embedding API (gemini-embedding-2-preview)

Configuration

VariableDescriptionRequired
AZURE_OPENAI_API_KEYAzure OpenAI API keyRecommended
AZURE_OPENAI_ENDPOINTAzure OpenAI endpoint URLWith Azure
AZURE_OPENAI_DEPLOYMENTAzure deployment nameWith Azure
GOOGLE_API_KEYGoogle AI Studio key (Gemini + Embeddings)Yes (for embeddings)
NIM_API_KEYNVIDIA NIM API keyOptional
GROQ_API_KEYGroq API keyOptional
JWT_SECRET_KEYSecret for JWT token signingYes
COURSE_DATA_PATHPath to NPTEL embeddings fileAuto-detected
UV_PATH / UVX_PATHPath to uv/uvx binariesAuto-detected

At least one LLM provider must be configured. The system will use whatever is available and gracefully skip unconfigured providers.


License

MIT License — see LICENSE for details.

↑↓ navigate openesc close