Developer experience

Python-first. AI-ready.

Build a tool in a single file. Register a county in another. Wire it into Claude, GPT, or a local Ollama model with the same MCP client.

Developer experience

Python-first.
AI-ready.

Build a tool in a single file. Register a county in another. Wire it into Claude, GPT, or a local Ollama model with the same MCP client.

  • Typed schemas for every domain
  • Built-in observability + tracing
  • Local LLM compatible (Ollama, llama.cpp)
  • Opt-in human-review gates
  • Pytest fixtures for adapters
packages/jurisdictions/us/oh/franklin/recorder/src/franklin_auditor_mcp_server.py
python
from titlemcp.server import build_server, tool
from titlemcp.schemas import AssessmentRecord
from .auditor import FranklinCountyAuditor

server = build_server(
    name="titlemcp-us-oh-franklin-recorder",
    version="0.4.1",
)

@tool(
    name="franklin_county_auditor_search",
    description="Search the Franklin County, OH auditor by parcel, address, or owner.",
    output_schema=AssessmentRecord,
    requires_review=False,
)
async def search(parcel_id: str | None = None,
                 address: str | None = None,
                 owner_name: str | None = None) -> AssessmentRecord:
    """Return the canonical assessment record for a Franklin County parcel."""
    auditor = FranklinCountyAuditor()
    raw = await auditor.lookup(
        parcel_id=parcel_id,
        address=address,
        owner_name=owner_name,
    )
    return AssessmentRecord.from_franklin(raw)

if __name__ == "__main__":
    server.run(transport="stdio")

The future of title
should be open.

Star the repo, ship an adapter, or wire your first MCP-powered title workflow today.