Search / io.github.ahmedEid1/lumen
Lumen
not classifiedSelf-hostable agentic-AI LMS: catalog, RAG tutor, FSRS reviews, AI authoring, ingest.
v2.0.0 · active · repository · website · descriptor JSON · versions
Search / io.github.ahmedEid1/lumen
Self-hostable agentic-AI LMS: catalog, RAG tutor, FSRS reviews, AI authoring, ingest.
v2.0.0 · active · repository · website · descriptor JSON · versions
No connection block: no_connection.
Not scored: fewer than three checks apply, usually because no remote answered a credential-free probe or the server is a local package.
protocol.modern, protocol.stateless, protocol.transport, protocol.list_ttlno remote answered a protocol handshake (not probed yet, unreachable, or local-only)auth.prm, auth.as_metadata, auth.cimdno remote uses OAuthauth.secret_in_urlno templated URLtools.descriptions, tools.description_length, tools.schemas, tools.annotations, tools.directory_hints, tools.token_cost, tools.api_dumptool list unknown (behind auth, not probed, or empty)stability.changes, stability.rug_pulltool list unknowndeps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI packageNo tool definition changes recorded. A server's first observation is its baseline; later probes record what changes.
Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.
+repository +namespace-matches-repo +website ~liveness-unmeasured ~updated-134d-ago -no-connection
Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.
Nothing to connect to.
No tools observed. Tools appear once a credential-free probe can list them.
Schemas: list_tools.
{
"name": "io.github.ahmedEid1/lumen",
"_meta": {
"io.modelcontextprotocol.registry/publisher-provided": {
"tools": [
{
"auth": "public",
"name": "list_courses",
"description": "List Lumen courses in the public catalog. Optional `filter` does free-text search over title + overview."
},
{
"auth": "public",
"name": "get_course",
"description": "Fetch one course by slug. Returns the full syllabus tree (modules + lessons) plus the course overview."
},
{
"auth": "user",
"name": "search_lesson_content",
"description": "Semantic search across a course's lesson chunks. Returns top-K passages with lesson titles and pgvector cosine-distance scores (lower = better)."
},
{
"auth": "user",
"name": "ask_tutor",
"description": "Ask the Lumen course tutor a question. Returns a cited answer or refusal if the course content doesn't cover the topic. Requires enrollment."
},
{
"auth": "user",
"name": "list_my_due_reviews",
"description": "Spaced-repetition queue for the calling user: cards whose FSRS-6 due-at has passed. Oldest-due first."
},
{
"auth": "user",
"name": "grade_review_card",
"description": "Submit one FSRS-6 rating against a review card. `rating` is 1=again, 2=hard, 3=good, 4=easy."
},
{
"auth": "user",
"name": "create_course_draft",
"description": "Generate a course outline from a brief and persist it as a draft course owned by the calling user. Requires the `can_author` capability (any active user)."
},
{
"auth": "admin",
"name": "ingest_url_to_draft",
"description": "Import a YouTube / Notion / Google Docs URL into a draft course. Creates a fresh course when `course_id` is omitted, otherwise appends. Admin-only and gated by the `ingest_url_enabled` flag (off by default)."
},
{
"auth": "user",
"name": "list_my_progress",
"description": "Per-enrolled-course completion + mastery rollup for the calling user. Newest enrollment first."
}
],
"install": {
"notes": "Lumen is self-hosted: bring up your own backend, mint a token with `make mcp-token`, then register the server. No public artifact (PyPI / OCI) is shipped yet.",
"claude_code": "LUMEN_MCP_AUTH_TOKEN=<client_secret> claude mcp add lumen -- python -m app.mcp --transport stdio",
"claude_desktop": {
"mcpServers": {
"lumen": {
"env": {
"DATABASE_URL": "postgresql+asyncpg://lumen:lumen@localhost:5432/lumen",
"LUMEN_MCP_AUTH_TOKEN": "<your-client-secret>"
},
"args": [
"-m",
"app.mcp",
"--transport",
"stdio"
],
"command": "python"
}
}
}
},
"license": "MIT",
"categories": [
"learning",
"education",
"agents",
"rag",
"spaced-repetition"
],
"maintainer": {
"url": "https://www.linkedin.com/in/ahmedhobeishy/",
"name": "Ahmed Hobeishy"
},
"authentication": {
"http": {
"type": "oauth2",
"grant_types": [
"client_credentials"
],
"token_endpoint": "/oauth/token",
"metadata_endpoint": "/.well-known/oauth-authorization-server"
},
"stdio": {
"type": "bearer",
"env_var": "LUMEN_MCP_AUTH_TOKEN",
"description": "Mint with `make mcp-token` on the Lumen instance; paste the printed client_secret into the env block."
}
},
"supported_transports": [
"stdio",
"streamable-http"
]
}
},
"title": "Lumen",
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
"version": "2.0.0",
"repository": {
"url": "https://github.com/ahmedEid1/lumen",
"source": "github",
"subfolder": "apps/backend/app/mcp"
},
"websiteUrl": "https://github.com/ahmedEid1/lumen/blob/main/docs/mcp.md",
"description": "Self-hostable agentic-AI LMS: catalog, RAG tutor, FSRS reviews, AI authoring, ingest."
}