A book search application that provides access to the OpenLibrary API through both FastAPI and MCP (Model Context Protocol) servers.
- Book Search: Search for books using the OpenLibrary API
- Dual Server Support: Available as both FastAPI web server and MCP server
- Data Validation: Robust Pydantic models with proper validation
- Error Handling: Graceful handling of incomplete API responses
- Comprehensive Logging: Detailed logging for monitoring and debugging
- Code Quality: Pre-commit hooks for maintaining code standards
- Python 3.11+
- Poetry (recommended) or pip
# Clone the repository
git clone <repository-url>
cd openlibrary_mcp
# Install dependencies
poetry install
# Install pre-commit hooks
poetry run pre-commit install
# Activate virtual environment
poetry shell# Clone the repository
git clone <repository-url>
cd openlibrary_mcp
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txtStart the FastAPI web server:
python -m openlibrary_mcp.fastapi_serverThe server will be available at http://localhost:8000
GET /search?query=<search_term>- Search for booksGET /health- Health check endpointGET /- API informationGET /docs- Interactive API documentation
Example:
curl "http://localhost:8000/search?query=python+programming"The MCP server provides tool-based access for AI assistants:
python -m openlibrary_mcp.mcp_serverOr use the installed command:
openlibrary-mcpThis MCP server can be easily integrated with Claude Desktop to provide book search capabilities directly in your conversations with Claude.
- Claude Desktop application installed
- This openlibrary_mcp project installed and working
- Poetry or Python environment set up
Find your Claude Desktop configuration file:
macOS:
~/Library/Application\ Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.jsonEdit the claude_desktop_config.json file and add the openlibrary-mcp server:
{
"mcpServers": {
"books-search": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/uysalserkan/openlibrary-mcp",
"openlibrary-mcp"
]
},
...
}
}Close and restart Claude Desktop for the changes to take effect.
Once configured, you can use the book search functionality in Claude Desktop:
You: "Can you help me find books about Python programming?"
Claude: I'll search for Python programming books for you.
[Claude uses the search_books tool]
Claude: I found several Python programming books:
-
"Learning Python" by Mark Lutz (2013)
- 5 editions available
- Language: English
-
"Python Crash Course" by Eric Matthes (2019)
- 3 editions available
- Language: English
[...more results...]
- "Find books by J.R.R. Tolkien"
- "Search for books about machine learning"
- "Look up George Orwell's 1984"
- "Find cookbooks published after 2020"
The MCP server provides one tool:
search_books(query: str)
- Purpose: Search for books using OpenLibrary API
- Input: Search query string
- Output: Structured book data including titles, authors, publication years, and more
- Examples:
"python programming""tolkien lord of the rings""george orwell 1984"
After setup, you should see:
- In Claude Desktop: The openlibrary-mcp server listed in available tools
- In Conversations: Ability to ask Claude to search for books
- In Logs: MCP server startup messages when Claude Desktop starts
The integration allows Claude to seamlessly search for books and provide detailed information about authors, publication years, editions, and more, making it a powerful research and discovery tool!
This project uses pre-commit hooks to ensure code quality and consistency. The following tools are configured:
- Black: Code formatting (line length: 88)
- isort: Import sorting with black compatibility
- Ruff: Fast Python linter (replaces flake8)
- mypy: Static type checking
- Bandit: Security vulnerability scanner
- Trailing whitespace: Automatically removes trailing spaces
- End of file: Ensures files end with newline
- YAML/TOML validation: Validates configuration files
- Large files: Prevents committing large files
- Merge conflicts: Detects merge conflict markers
- Debug statements: Finds debug statements in code
# Install hooks (run once)
poetry run pre-commit install
# Run on all files
poetry run pre-commit run --all-files
# Run on specific files
poetry run pre-commit run --files openlibrary_mcp/models.py
# Skip hooks for a commit (not recommended)
git commit -m "message" --no-verifyAll tools are configured in pyproject.toml:
[tool.black]
line-length = 88
target-version = ['py311']
[tool.isort]
profile = "black"
line_length = 88
[tool.ruff.lint]
select = ["E", "W", "F", "I", "B", "C4", "UP"]
[tool.mypy]
python_version = "3.11"
disallow_untyped_defs = true{
"num_found": 1234,
"q": "python programming",
"docs": [
{
"author_name": "John Doe",
"edition_count": 5,
"first_publish_year": 2020,
"language": "en",
"title": "Python Programming Guide"
}
]
}openlibrary_mcp/
βββ openlibrary_mcp/ # Main package directory
β βββ __init__.py # Package initialization
β βββ fastapi_server.py # FastAPI web server
β βββ mcp_server.py # MCP server implementation
β βββ models.py # Pydantic data models
β βββ providers.py # OpenLibrary API provider
βββ .pre-commit-config.yaml # Pre-commit configuration
βββ claude_desktop_config.json # Sample Claude Desktop configuration
βββ pyproject.toml # Project configuration
βββ poetry.lock # Dependency lock file
βββ README.md # This file
βββ dist/ # Built packages
- FastAPI: Web framework for building APIs
- FastMCP: MCP server implementation
- Pydantic: Data validation and settings management
- Uvicorn: ASGI server for FastAPI
- HTTPX: Async HTTP client for API calls
- Requests: HTTP library for synchronous requests
- pre-commit: Git hooks for code quality
- black: Code formatter
- isort: Import sorter
- ruff: Fast Python linter
- mypy: Static type checker
- bandit: Security linter
Represents individual book information with optional fields to handle incomplete API responses:
author_name: Author's nameedition_count: Number of available editionsfirst_publish_year: Year of first publicationlanguage: Book language(s)title: Book title
Represents the complete API response:
num_found: Total number of books foundq: Search querydocs: List of book details
The application includes comprehensive logging to help with monitoring and debugging:
- API Calls: Track OpenLibrary API requests, responses, and timing
- Data Validation: Monitor model validation, data cleaning, and incomplete records
- Server Activity: Log server startup, endpoint access, and request processing
- Error Handling: Detailed error logging with context
- INFO: General application flow and important events
- DEBUG: Detailed validation steps and data processing
- WARNING: Non-critical issues (empty queries, missing fields)
- ERROR: Failures and exceptions with full context
2025-07-15 16:57:40,733 - openlibrary_mcp.providers - INFO - π Starting book search for query: 'python'
2025-07-15 16:57:40,734 - openlibrary_mcp.models - INFO - β οΈ 1/3 books have missing critical fields
π§ OpenLibraryProvider initialized with base_url: https://openlibrary.org
π Starting book search for query: 'python programming'
π‘ API Response: 200 | Content-Length: 12345
β
Search completed: 1234 total books found, 20 returned in response
π― Successfully processed 20 book records
π MCP tool called: search_books with query='python'
π GET /search - Query: {'query': 'python'}
π Response: 200 | Time: 0.523s
Run a quick test to verify the installation:
# Test FastAPI server
python -c "from openlibrary_mcp.providers import OpenLibraryProvider; print('β
OpenLibrary provider works!')"
# Test models
python -c "from openlibrary_mcp.models import BookDetails, OpenLibrary; print('β
Models imported successfully!')"
# Test pre-commit hooks
poetry run pre-commit run --all-files- Fork the repository
- Create a feature branch
- Make your changes
- Ensure pre-commit hooks pass:
poetry run pre-commit run --all-files - Add tests if applicable
- Submit a pull request
- Type hints: All functions must have proper type annotations
- Documentation: Use docstrings for all public functions and classes
- Error handling: Use proper exception chaining with
raise ... from e - Security: Avoid binding to all interfaces (
0.0.0.0) in production - Logging: Include meaningful log messages with appropriate levels
This project is open source and available under the MIT License.
- OpenLibrary API Documentation
- FastAPI Documentation
- MCP Documentation
- Pydantic Documentation
- Pre-commit Documentation
If you encounter any issues, please create an issue on the GitHub repository with:
- Description of the problem
- Steps to reproduce
- Expected vs actual behavior
- Your environment details
