lease-qa-mcp
by amadeuserras
README.md
# leaseclear-mcp
A [Model Context Protocol](https://modelcontextprotocol.io) server that exposes [LeaseClear](https://github.com/amadeuserras/leaseclear) lease Q&A.
<!-- mcp-name: io.github.amadeuserras/leaseclear-mcp -->
Listed in the [official MCP Registry](https://registry.modelcontextprotocol.io) as `io.github.amadeuserras/leaseclear-mcp`.
## Tools
- `lease_qa` — ask one question about lease terms; returns an answer grounded in the lease, or states that the lease is silent
## Usage
Add this to your MCP client config (e.g. `claude_desktop_config.json` or Cursor `mcp.json`):
```json
{
"mcpServers": {
"lease-qa": {
"command": "uvx",
"args": ["leaseclear-mcp"]
}
}
}
```
The package is on [PyPI](https://pypi.org/project/leaseclear-mcp/). `uvx` fetches and runs it as a local subprocess, communicating over stdio. [uv](https://docs.astral.sh/uv/getting-started/installation/) required.
### Optional environment variables
| Variable | Description | Default |
| -------------------- | ------------------------------------------------------ | ----------------------------- |
| `LEASECLEAR_API_KEY` | Use the server with your own LeaseClear account | LeaseClear demo mode |
| `LEASECLEAR_API_URL` | Override the API endpoint (local or private instances) | LeaseClear production backend |
```json
{
"mcpServers": {
"lease-qa": {
"command": "uvx",
"args": ["leaseclear-mcp"],
"env": {
"LEASECLEAR_API_KEY": "lc_...",
"LEASECLEAR_API_URL": "https://..."
}
}
}
}
```
## `lease_qa` usage
**Argument**
- `question` (string, required) — one question about the lease
`_meta`
- `document_ids` (string[], optional) — UUIDs of the documents to query. Omitted means all.
**Security**: The `_meta` field is used to pass metadata to the tool call that the model doesn't see. Having `document_ids` there is intentional: it prevents cross-document prompt injection because the model is never able to choose which documents it has access to. See a real-world example in [LeaseOps: prompt injection and the tenants table](https://github.com/amadeuserras/leaseops#security-prompt-injection-and-the-tenants-table).
## MCP Python SDK example
Tool call:
```python
result = await session.call_tool(
name="lease_qa",
arguments={
"question": "How much is the security deposit for Yuna Kim?"
},
meta={
"document_ids": [
"a1b2c3d4-e5f..."
]
}
)
```
Output:
```json
{
"answer": "The security deposit is $6,400.00. This deposit is held in Owner's Broker's trust account [california-johnson-kim §4]."
}
```
## Tech stack
- Python 3.12
- Model Context Protocol Python SDK (`mcp[cli]`) over stdio
- `httpx` for LeaseClear API calls
- Pydantic and `pydantic-settings` for schemas and config
- `uv` and `uv_build` for running and packaging
- pytest, Ruff, and Pyright for tests, linting, and type checking
## Project structure
```
leaseclear-mcp/
├── src/leaseclear_mcp/
│ ├── server.py # MCP server + lease_qa
│ ├── leaseclear.py # LeaseClear HTTP client
│ ├── schemas.py
│ └── config.py
├── tests/
├── pyproject.toml
├── .env.example
└── README.md
```
## Local Development
```bash
git clone https://github.com/you/leaseclear-mcp.git
cd leaseclear-mcp
uv sync
cp .env.example .env
uv run pytest
uv run ruff check .
uv run pyright
```
### Debugging
Use the [MCP Inspector](https://github.com/modelcontextprotocol/inspector) to test the server interactively:
```bash
npx @modelcontextprotocol/inspector uvx leaseclear-mcp
```
From a checkout, use `uv run leaseclear-mcp` instead of `uvx leaseclear-mcp`.
## License
MITTDQS
A4.2/5.0
Scored across 1 tool
Disambiguation5/5
With only one tool, there is no possibility of confusion or overlap. The tool's purpose is clear and unique.
Naming Consistency5/5
A single tool name cannot be inconsistent with others. The name 'lease_qa' is straightforward and matches the server's purpose.
Tool Count3/5
Having only one tool feels thin for a typical server, but it may be appropriate for this narrow scope. The calibration suggests 1-2 tools is borderline.
Completeness4/5
The tool directly fulfills the stated purpose of asking lease questions and getting grounded answers. Minor gaps exist, such as no ability to retrieve the full lease or ask multiple questions in a batch, but the core workflow is covered.
Maintenance
ActivitySlowing
ResponsivenessNo issues