An MCP (Model Context Protocol) server that turns the book Deep Learning with Python (François Chollet) into a searchable knowledge base, so Claude can act as a deep-learning/ML expert grounded in the book's content.
The server runs locally over stdio. It reads the PDF in input/
and builds an in-memory index of the book's ~200 leaf sections (down to
subsections like 3.4.3) from the PDF's own bookmark outline. The book has to be put in place manually.
- Create MCP MVP
- Connect and validate
- Add error handling
- Add MCP inspector
# from the project root
pip install -r requirements.txtRequires the book PDF at input/Deep_Learning_with_Python_Chollet.pdf
.venv\Scripts\python.exe server.pyThis blocks, speaking MCP over stdio — it's meant to be launched by an MCP client, not run interactively. Ctrl+C to stop.
Claude Code (from the project root):
claude mcp add dl-python-expert -- "C:\Users\leowa\Projekte\mcp_deepLearning\.venv\Scripts\python.exe" "C:\Users\leowa\Projekte\mcp_deepLearning\server.py"Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"dl-python-expert": {
"command": "C:\\Users\\leowa\\Projekte\\mcp_deepLearning\\.venv\\Scripts\\python.exe",
"args": ["C:\\Users\\leowa\\Projekte\\mcp_deepLearning\\server.py"]
}
}
}Tools
search_book(query, top_k=5)— keyword-ranked search over all book sections; returns id, title, breadcrumb, page, and a snippet.get_section(section_id)— full text of one section by id (e.g.3.4.3,6.2.2), as returned bysearch_bookorlist_sections. Only leaf sections are addressable; a heading with subsections (e.g.5.1) is not itself fetchable — use its children instead.list_sections(chapter=None)— no argument lists chapters/appendices; passing one of those exact strings lists its sections and ids.
Resource
book://toc— the full table of contents with section ids and page numbers, for browsing structure without a tool call.
Prompt
explain_concept(topic)— instructs Claude to search the book, cite section id and page for claims, and include the book's Keras code examples where relevant.
Once connected, ask Claude things like:
Using the DL knowledge base, explain how dropout fights overfitting, with the book's code example.
Claude will call search_book, pull the relevant section(s) via
get_section, and answer citing e.g. [4.4.3] Adding dropout (p. 130).
- Search is simple keyword/term-overlap scoring (stdlib only) — no embeddings. Good enough for retrieval-then-explain; Claude does the actual reasoning.
- Section granularity is leaf-only. A few sentences of "chapter intro" text that sits between a parent heading and its first subsection isn't attached to any section and is effectively skipped.
- The index is rebuilt from the PDF on every server start (~3s for 384 pages); there's no persistent cache, by design, so book content never lands in a file that could accidentally get committed.
- Indexed scope is the book's technical content only (chapters 1–9 + appendices A/B) — front matter and the back-of-book index are excluded.
server.py— entry point; creates theMCPServer, registers tools fromtools.py, runs over stdio.tools.py— tool/resource/prompt definitions.knowledge_base.py— PDF loading, outline-based section indexing, and search.input/— source PDF (gitignored).