Skip to main content
Glama
pratyushkr9420

Lawmesh MCP Server

README.md
# Lawmesh MCP Server

A comprehensive Model Context Protocol (MCP) server providing AI agents with powerful tools to access U.S. legislative data through the OpenStates API v3.

## Live Deployment

**Public MCP Server**: https://pk-dev-Lawmesh.hf.space/mcp

The server is deployed on Hugging Face Spaces and ready for immediate use with any MCP-compatible client.

## Available Tools

Lawmesh provides four comprehensive tools for querying U.S. legislative information:

### 1. `list_jurisdictions`
Retrieve all available U.S. jurisdictions (states, territories, federal districts) with optional filtering.

**Parameters:**
- `classification` (optional): Filter by type ("state", "municipality", "country")
- `include` (optional): Additional data ("organizations", "legislative_sessions", "latest_runs")
- `page`, `per_page`: Pagination support

### 2. `get_jurisdiction`
Get detailed metadata for a specific jurisdiction.

**Parameters:**
- `jurisdiction` (required): State abbreviation, full name, or OpenStates ID
- `include` (optional): Additional data to include

### 3. `get_people`
Search for legislators, governors, and government officials.

**Parameters:**
- `jurisdiction`, `name`, `id`: Filter criteria (at least one required)
- `org_classification`: Role filter ("upper", "lower", "executive")
- `district`: District filter
- `include`: Additional biographical data
- Pagination support

### 4. `get_bills`
Search legislative bills, resolutions, and documents.

**Parameters:**
- `jurisdiction`, `session`, `chamber`: Basic filters
- `identifier`: Specific bill numbers
- `classification`: Bill type ("bill", "resolution")
- `subject`, `sponsor`: Content and sponsor filters
- `q`: Full-text search
- `updated_since`, `created_since`, `action_since`: Date filters
- `include`: Additional data (votes, actions, documents, etc.)
- `sort`: Sort options
- Pagination support

## Architecture

Lawmesh is built using:
- **FastMCP**: Modern MCP server framework
- **Streamable HTTP Transport**: Optimized for web deployment
- **OpenStates API v3**: Authoritative source for U.S. legislative data
- **Async Architecture**: High-performance concurrent request handling

```
┌─────────────────┐    HTTP/MCP     ┌─────────────────┐    HTTPS/API    ┌─────────────────┐
│   MCP Client    │ <-------------> │  Lawmesh Server │ <-------------> │  OpenStates API │
│  (Claude, etc.) │                │   (FastMCP)     │                │      (v3)       │
└─────────────────┘                └─────────────────┘                └─────────────────┘
```

## Quick Start with MCP Client

### Example: Python MCP Client

```python
import asyncio
from mcp import create_client_session
from mcp.client.transports.http import create_http_transport

async def main():
    # Connect to the deployed Lawmesh server
    transport = create_http_transport("https://pk-dev-Lawmesh.hf.space/mcp")
    
    async with create_client_session(transport) as session:
        # List available tools
        tools = await session.list_tools()
        print("Available tools:", [tool.name for tool in tools.tools])
        
        # Example: Get California jurisdictions
        result = await session.call_tool("list_jurisdictions", {
            "classification": "state",
            "per_page": 10
        })
        print("Jurisdictions:", result.content)
        
        # Example: Search for bills about education in California
        bills = await session.call_tool("get_bills", {
            "jurisdiction": "ca",
            "subject": "education",
            "per_page": 5
        })
        print("Education bills:", bills.content)

if __name__ == "__main__":
    asyncio.run(main())
```

### Example: Using with Claude Desktop

Add to your Claude Desktop MCP configuration:

```json
{
  "mcpServers": {
    "lawmesh": {
      "url": "https://pk-dev-Lawmesh.hf.space/mcp"
    }
  }
}
```

## Local Development Setup

### Prerequisites

1. **Python 3.13+**
2. **OpenStates API Key**: Get one at [OpenStates.org](https://openstates.org/api/)
3. **Environment Setup**

### Installation

1. **Clone the repository:**
```bash
git clone <repository-url>
cd Lawmesh
```

2. **Install dependencies:**
```bash
# Using pip
pip install -r requirements.txt

# Or using uv (recommended)
uv sync
```

3. **Environment Configuration:**
Create a `.env` file:
```bash
# .env
OPENSTATES_API_KEY=your_openstates_api_key_here
```

4. **Run the server:**
```bash
# Development mode
python app.py

# Or with uvicorn
uvicorn app:app --host 0.0.0.0 --port 7860 --reload
```

The server will be available at: `http://localhost:7860/mcp`

### Local Testing

Test your local server with MCP Inspector:
```bash
npx @modelcontextprotocol/inspector http://localhost:7860/mcp
```

## Docker Deployment

### Using the included Dockerfile:

```bash
# Build the image
docker build -t lawmesh-mcp .

# Run with environment variable
docker run -p 7860:7860 -e OPENSTATES_API_KEY=your_key_here lawmesh-mcp
```

### Docker Compose:

```yaml
# docker-compose.yml
version: '3.8'
services:
  lawmesh:
    build: .
    ports:
      - "7860:7860"
    environment:
      - OPENSTATES_API_KEY=${OPENSTATES_API_KEY}
    env_file:
      - .env
```

## Dependencies

Core dependencies from `pyproject.toml`:

- **fastmcp>=2.12.3**: MCP server framework
- **httpx>=0.28.1**: Async HTTP client for API calls
- **uvicorn>=0.36.0**: ASGI server
- **python-dotenv>=1.1.1**: Environment variable management
- **mcp[cli]>=1.14.1**: MCP protocol support

## Security & Configuration

### Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `OPENSTATES_API_KEY` | Yes | Your OpenStates API key |
| `PORT` | No | Server port (default: 7860) |
| `HOST` | No | Server host (default: 0.0.0.0) |

### API Key Security

- Never commit API keys to version control
- Use environment variables or secure secret management
- For Hugging Face Spaces: Configure as Repository Secrets

## Use Cases

- **Political Research**: Track legislation and voting patterns
- **Government Transparency**: Access public legislative records
- **Civic Engagement**: Build tools for citizen participation
- **Academic Research**: Study U.S. political processes
- **News & Media**: Automated legislative monitoring
- **Legal Research**: Access bill text and legislative history

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests for new functionality
5. Submit a pull request

## License

This project is open source. Please check the LICENSE file for details.

## Support

- **Issues**: Report bugs and feature requests via GitHub Issues
- **Documentation**: OpenStates API v3 docs at [docs.openstates.org](https://docs.openstates.org/api-v3/)
- **MCP Protocol**: Learn more at [modelcontextprotocol.io](https://modelcontextprotocol.io/)

---

**Built with ❤️ using FastMCP and OpenStates API**