mcrentcast/README.md
Ryan Malloy fedfc7a6cf Update repository URLs and add production installation instructions
- Update all GitHub URLs to git.supported.systems/MCP/mcrentcast
- Add production installation using uvx --from git+https://...
- Distinguish between development and production installation methods
- Fix pyproject.toml project URLs
2025-09-09 13:16:24 -06:00

505 lines
12 KiB
Markdown

# mcrentcast - Rentcast MCP Server
A Model Context Protocol (MCP) server that provides intelligent access to the Rentcast API with advanced caching, rate limiting, and cost management features.
## 🌟 Features
- **🏠 Complete Rentcast API Integration**: Access all Rentcast endpoints for property data, valuations, listings, and market statistics
- **💾 Intelligent Caching**: Automatic response caching with hit/miss tracking and configurable TTL
- **🛡️ Rate Limiting**: Configurable daily/monthly/per-minute limits with exponential backoff
- **💰 Cost Management**: Track API usage, estimate costs, and get confirmations before expensive operations
- **🧪 Mock API for Testing**: Full mock implementation for development without consuming credits
- **✨ MCP Integration**: Seamless integration with Claude and other MCP-compatible clients
- **🐳 Docker Ready**: Complete Docker Compose setup for easy deployment
- **📊 Usage Analytics**: Track API usage patterns, cache performance, and costs
## 📋 Table of Contents
- [Quick Start](#quick-start)
- [Installation](#installation)
- [Configuration](#configuration)
- [Usage](#usage)
- [MCP Tools](#mcp-tools)
- [Mock API](#mock-api)
- [Development](#development)
- [Testing](#testing)
- [API Documentation](#api-documentation)
- [Troubleshooting](#troubleshooting)
## 🚀 Quick Start
### Prerequisites
- Python 3.13+
- [uv](https://github.com/astral-sh/uv) package manager
- Rentcast API key (or use mock mode for testing)
### Installation
```bash
# Clone the repository
git clone https://git.supported.systems/MCP/mcrentcast.git
cd mcrentcast
# Run the installation script
./install.sh
# IMPORTANT: Set your API key in the .env file
nano .env # Set RENTCAST_API_KEY=your_actual_api_key
# For development (from cloned repo)
claude mcp add mcrentcast -- uvx --from . mcrentcast
# For production (install from git)
claude mcp add mcrentcast -- uvx --from git+https://git.supported.systems/MCP/mcrentcast.git mcrentcast
```
## 📦 Installation
### Method 1: Automated Installation
```bash
./install.sh
```
This script will:
- Install Python dependencies with uv
- Create necessary directories
- Initialize the database
- Set up configuration files
### Method 2: Manual Installation
```bash
# Install dependencies
uv sync
# Create data directory
mkdir -p data
# Initialize database
uv run python -c "from mcrentcast.database import db_manager; db_manager.create_tables()"
# Copy environment configuration
cp .env.example .env
# Edit .env with your API key
nano .env
```
### Using the Installed Scripts
After installation, you can use the provided command-line scripts:
```bash
# Run the MCP server (for Claude integration)
uv run mcrentcast
# Run the mock API server (for testing)
uv run mcrentcast-mock-api
```
### Method 3: Docker
```bash
# Start with Docker Compose
make dev # Development mode
make prod # Production mode
```
## ⚙️ Configuration
### Environment Variables
Create a `.env` file with your configuration:
```env
# Rentcast API Configuration
RENTCAST_API_KEY=your_api_key_here
RENTCAST_BASE_URL=https://api.rentcast.io/v1
# Mock API Settings (for testing)
USE_MOCK_API=false # Set to true for testing without credits
MOCK_API_URL=http://localhost:8001/v1
# Rate Limiting
DAILY_API_LIMIT=100
MONTHLY_API_LIMIT=1000
REQUESTS_PER_MINUTE=3
# Cache Settings
CACHE_TTL_HOURS=24
MAX_CACHE_SIZE_MB=100
# Database
DATABASE_URL=sqlite:///./data/mcrentcast.db
```
### Claude Desktop Configuration
#### Option 1: Using `claude mcp add` with uvx (Recommended)
```bash
# Navigate to the project directory
cd /path/to/mcrentcast
# Make sure your API key is set in .env file
# Edit .env and set RENTCAST_API_KEY=your_actual_key
# For production (install directly from git)
claude mcp add mcrentcast -- uvx --from git+https://git.supported.systems/MCP/mcrentcast.git mcrentcast
# For development (from cloned repository)
claude mcp add mcrentcast -- uvx --from . mcrentcast
# Alternative: use the mcp.json configuration (development only)
claude mcp add mcrentcast .
# For testing with mock API (no real API key needed)
claude mcp add mcrentcast-test -- uvx --from git+https://git.supported.systems/MCP/mcrentcast.git mcrentcast \
-e USE_MOCK_API=true \
-e RENTCAST_API_KEY=test_key_basic
# To use different scopes
claude mcp add --scope user mcrentcast -- uvx --from . mcrentcast # Available to all projects
claude mcp add --scope local mcrentcast . # Only for current project (default)
```
#### Option 2: Manual Configuration
Add to your Claude MCP configuration file (usually `~/.config/claude/mcp.json` or similar):
```json
{
"servers": {
"mcrentcast": {
"command": "uv",
"args": ["run", "python", "-m", "mcrentcast.server"],
"cwd": "/path/to/mcrentcast",
"env": {
"PYTHONPATH": "/path/to/mcrentcast/src:${PYTHONPATH}",
"RENTCAST_API_KEY": "your_api_key_here",
"USE_MOCK_API": "false"
}
}
}
}
```
Note: The server uses the `mcp.json` file in the project root for configuration when using `claude mcp add`.
## 🔧 Usage
### With Claude
Once added to Claude, you can use natural language:
```
User: Search for properties in Austin, Texas
Claude: I'll search for properties in Austin, Texas.
[Uses search_properties tool]
Found 10 properties in Austin, TX...
```
### Direct Python Usage
```python
from mcrentcast.rentcast_client import RentcastClient
async def example():
client = RentcastClient(api_key="your_key")
# Search properties
properties, cached, age = await client.get_property_records(
city="Austin",
state="TX",
limit=10
)
# Get value estimate
estimate, cached, age = await client.get_value_estimate(
address="123 Main St, Austin, TX"
)
await client.close()
```
## 🛠️ MCP Tools
The server provides 13 MCP tools:
### Property Data Tools
| Tool | Description | Parameters |
|------|-------------|------------|
| `search_properties` | Search for property records | `city`, `state`, `zipCode`, `limit`, `offset` |
| `get_property` | Get specific property details | `property_id` |
| `get_value_estimate` | Get property value estimate | `address` |
| `get_rent_estimate` | Get rental price estimate | `address`, `bedrooms`, `bathrooms`, `squareFootage` |
### Listing Tools
| Tool | Description | Parameters |
|------|-------------|------------|
| `search_sale_listings` | Find properties for sale | `city`, `state`, `zipCode`, `limit` |
| `search_rental_listings` | Find rental properties | `city`, `state`, `zipCode`, `limit` |
| `get_market_statistics` | Get market analysis data | `city`, `state`, `zipCode` |
### Management Tools
| Tool | Description | Parameters |
|------|-------------|------------|
| `set_api_key` | Configure Rentcast API key | `api_key` |
| `expire_cache` | Expire cache entries | `cache_key`, `all` |
| `get_cache_stats` | View cache performance | - |
| `get_usage_stats` | Track API usage and costs | `days` |
| `set_api_limits` | Configure rate limits | `daily_limit`, `monthly_limit`, `requests_per_minute` |
| `get_api_limits` | View current limits | - |
## 🧪 Mock API
The project includes a complete mock of the Rentcast API for testing without consuming API credits:
### Starting Mock API
#### Using the Script Command
```bash
# Start mock API server (runs on port 8001)
uv run mcrentcast-mock-api
```
#### Using Make Commands
```bash
# Start mock API only
make mock-api
# Start full stack with mock API
make test-mock
```
### Test API Keys
The mock API includes predefined test keys with different rate limits:
| Key | Daily Limit | Use Case |
|-----|-------------|----------|
| `test_key_free_tier` | 50 | Testing free tier |
| `test_key_basic` | 100 | Standard testing |
| `test_key_pro` | 1,000 | High-volume testing |
| `test_key_enterprise` | 10,000 | Unlimited testing |
| `test_key_rate_limited` | 1 | Rate limit testing |
### Using Mock Mode
To use the mock API instead of the real Rentcast API, set in `.env`:
```env
USE_MOCK_API=true
RENTCAST_API_KEY=test_key_basic
MOCK_API_URL=http://localhost:8001/v1
```
Then run the MCP server normally:
```bash
uv run mcrentcast
```
## 🔬 Development
### Project Structure
```
mcrentcast/
├── src/mcrentcast/ # Core MCP server code
│ ├── server.py # FastMCP server implementation
│ ├── rentcast_client.py # Rentcast API client
│ ├── database.py # Database management
│ ├── models.py # Data models
│ ├── config.py # Configuration
│ └── mock_api.py # Mock API server
├── tests/ # Test suite
├── docs/ # Documentation
├── scripts/ # Utility scripts
├── docker-compose.yml # Docker configuration
├── Makefile # Build automation
└── pyproject.toml # Python dependencies
```
### Running Locally
```bash
# Install development dependencies
uv sync --dev
# Run tests
uv run pytest
# Run with mock API
USE_MOCK_API=true uv run python -m mcrentcast.server
# Run linting
uv run ruff check src/
# Format code
uv run black src/ tests/
```
### Docker Development
```bash
# Build images
make build
# Start development environment
make dev
# View logs
make logs
# Run tests in container
make test
# Access shell
make shell
```
## 🧪 Testing
### Unit Tests
```bash
uv run pytest tests/ -v
```
### Integration Tests
```bash
# Start mock API
make mock-api
# Run integration tests
uv run pytest tests/test_integration.py -v
```
### Test Coverage
```bash
uv run pytest --cov=src --cov-report=html
# View report at htmlcov/index.html
```
## 📚 API Documentation
### Rentcast API Endpoints
The server integrates with all major Rentcast endpoints:
- **Property Records**: Search and retrieve property information
- **Value Estimates**: Get property valuations
- **Rent Estimates**: Calculate rental prices
- **Sale Listings**: Find properties for sale
- **Rental Listings**: Find rental properties
- **Market Statistics**: Access market trends and analytics
### Response Caching
All API responses are automatically cached:
- Default TTL: 24 hours (configurable)
- Cache hit/miss tracking
- Manual cache expiration available
- Cache size management
### Rate Limiting
Configurable rate limits:
- Daily request limits
- Monthly request limits
- Per-minute rate limiting
- Exponential backoff on failures
## 🔍 Troubleshooting
### Common Issues
#### Server won't start
```bash
# Check Python version
python --version # Should be 3.13+
# Reinstall dependencies
uv sync --reinstall
# Check database
rm -f data/mcrentcast.db
uv run python -c "from mcrentcast.database import db_manager; db_manager.create_tables()"
```
#### API Key Issues
```bash
# Test with mock API
USE_MOCK_API=true uv run python scripts/test_mock_api.py
# Verify API key
curl -H "X-Api-Key: your_key" https://api.rentcast.io/v1/properties
```
#### Cache Issues
```bash
# Clear cache
rm -f data/mcrentcast.db
# Expire specific cache
uv run python -c "
from mcrentcast.database import db_manager
import asyncio
asyncio.run(db_manager.expire_cache_entry('cache_key_here'))
"
```
### Debug Mode
Enable debug logging:
```env
DEBUG=true
LOG_LEVEL=DEBUG
```
### Getting Help
- Check `docs/` directory for detailed guides
- Review `docs/mock-api.md` for testing documentation
- Check `docs/claude-setup.md` for MCP integration help
## 📄 License
MIT License - See LICENSE file for details
## 🤝 Contributing
Contributions are welcome! Please:
1. Fork the repository
2. Create a feature branch
3. Add tests for new features
4. Ensure all tests pass
5. Submit a pull request
## 🙏 Acknowledgments
- Built with [FastMCP](https://github.com/jlowin/fastmcp) for MCP support
- Uses [Rentcast API](https://developers.rentcast.io/) for property data
- Powered by [uv](https://github.com/astral-sh/uv) for Python management
## 📞 Support
- Documentation: See `/docs` directory
- Issues: Create an issue on GitHub
- Mock API Guide: See `docs/mock-api.md`
- Claude Setup: See `docs/claude-setup.md`
---
**Note**: This is an unofficial integration with the Rentcast API. Please ensure you comply with Rentcast's terms of service and API usage guidelines.