storedge-mcp
MCP server for StorEdge self-storage management platform, enabling agents to manage tenants, units, leads, billing, insurance, tasks, and move-in/out pipelines via natural language.
README
storedge-mcp
The first MCP server for StorEdge (Storable Edge) - the self-storage management platform that 5,000+ storage facilities rely on.
Read and write tenants, units, leads, ledgers, move-ins/outs, insurance, tasks, and surcharge calculations for a self-storage facility - straight from Claude, Cursor, or any MCP client.
Why this exists
StorEdge is the operations backbone for tens of thousands of self-storage facilities (under the Storable / Red Nova Labs umbrella). Its REST API at api.storedgefms.com powers tenant management, lead tracking, billing, insurance enrollment, task workflows, and move-in/out pipelines.
The existing integration options all require building OAuth 1.0 signing + paginated list handling + typed-error mapping from scratch every time:
- Tray.ai connector - locked inside Tray's walled garden, no MCP, no local-first.
- Twilio integration - single-purpose, voice-channel only.
- Java/PHP/.NET sample clients (
rednovalabs/storedge-api-client-*) - boilerplate code, no Claude tool surface. - No first-party MCP server - StorEdge has not shipped one.
storedge-mcp is the open MCP surface. One stdio call away, agents can answer "what 10x10 units are available right now?", "create a reservation for unit A-12", "show me who's past due this week", and "calculate the surcharge for a $125 Visa payment".
Quick start
pip install -e .
export STOREDGE_CONSUMER_KEY=... # from StorEdge dashboard
export STOREDGE_CONSUMER_SECRET=... # from StorEdge dashboard
export STOREDGE_FACILITY_ID=<uuid> # optional; tools accept it as arg too
storedge-mcp
In Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"storedge": {
"command": "storedge-mcp",
"env": {
"STOREDGE_CONSUMER_KEY": "...",
"STOREDGE_CONSUMER_SECRET": "...",
"STOREDGE_FACILITY_ID": "..."
}
}
}
}
Tools (26)
Diagnostic
health_check(facility_id?)- verify credentials by listing one tenant. Returns fast-fail if OAuth signing is wrong.
Tenants
list_tenants(facility_id?, per_page?, page?, created_after?, created_before?, updated_since?, only_ids?)list_current_tenants(facility_id?, per_page?, page?)- only currently-active tenantssearch_tenants(account_code?, phone_number?, facility_id?)- by account code OR phone (exactly one)get_tenant(tenant_id, facility_id?)get_tenant_ledgers(tenant_id, facility_id?)- list of a tenant's rental agreementsget_tenant_notes(tenant_id, facility_id?)- operator notes attached to a tenant
Units
list_units(facility_id?, per_page?, page?, only_ids?)- every unit (rented + vacant + offline)list_available_units(facility_id?, per_page?, page?)- only units available for move-inget_unit(unit_id, facility_id?)list_unit_groups(facility_id?, per_page?, page?)- size buckets (5x5, 10x10, etc.)list_unit_types(facility_id?, per_page?, page?)- Parking, Climate, Drive-Up, etc.
Leads
list_leads(view="current", facility_id?, per_page?, page?)- view ∈ {current, reservations, inquiries, follow_up, waitlist, missed_move_ins}get_lead_counts(facility_id?)- open lead counts by statusget_lead(lead_id, facility_id?)create_lead(lead, facility_id?)- create a reservation or inquiryupdate_lead(lead_id, lead, facility_id?)- PATCH an existing lead
Ledgers (rental agreements)
list_current_ledgers(facility_id?, per_page?, page?)get_ledger(ledger_id, facility_id?)get_ledger_delinquency(ledger_id, facility_id?)- overdue balance + days lateget_ledger_invoices(ledger_id, facility_id?)
Insurance
get_insurance_summary(facility_id?)- counts + revenue rollupget_insurance_activity(facility_id?, per_page?, page?)
Tasks
list_tasks(category_id?, facility_id?, per_page?, page?)list_task_categories(facility_id?)create_task(task, facility_id?)complete_task(task_id, facility_id?)
Move-in / move-out pipeline
list_move_ins(facility_id?, per_page?, page?)- in-progress move-inslist_move_outs(facility_id?, per_page?, page?)- scheduled move-outs
Surcharge + invoices
calculate_surcharge(amount_cents, card_type?, facility_id?)- credit-card convenience fee quotelist_invoices_and_ledgers(facility_id?, per_page?, page?)
Auth
OAuth 1.0 one-legged (RFC 5849). Get your consumer key + secret from StorEdge dashboard → Corporate → Settings → API.
storedge-mcp ships its own OAuth 1.0 signer - not authlib's - because authlib's stock OAuth1Auth strips JSON request bodies during signing (silently breaking POST/PATCH/PUT). Our signer computes oauth_body_hash for non-form bodies and includes it in the signature per RFC 5849 §3.4.1.3.
Architecture
Built on industry-leading patterns from encode/httpx, stripe-python, lepture/authlib, boto3, pytest-dev/pytest, and astral-sh/ruff:
- Shared
httpx.AsyncClientwith pooling + transport-level retries. - Typed exception hierarchy (
StoredgeAuthError,StoredgeNotFoundError,StoredgeRateLimitError,StoredgeAPIError,StoredgeConnectionError) carrying structurederror_code(from StorEdge'smeta.error_codeenvelope) andrequest_id. - Application-level retry with exponential backoff + full jitter on 429/5xx, honoring
Retry-After. - isError-compliance - every tool re-raises on failure so FastMCP sets
isError: trueon the wire (Blackwell audit / MCPTox). - JSONL audit logging via
STOREDGE_AUDIT_LOGenv var (or stderr default) - every tool call emits a structured record with redaction forpassword/api_key/tokenfields. - Property-based tests (Hypothesis) for JSON round-trips.
- respx for httpx mocking - no live API calls in tests.
See engineering-playbook.md for the full pattern reference.
Development
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
# Lint + type check + test
ruff check src tests
mypy src tests
pytest
# Coverage
pytest --cov=storedge_mcp --cov-report=term-missing
CI matrix (Python 3.10-3.13 on ubuntu/macos/windows) lives in .github/workflows/ci.yml.
Sister projects
sanjibani publishes MCP servers for one niche vertical SaaS per day. See the full list for the rest:
hawksoft-mcp- independent insurance agenciesopen-dental-mcp- dental practice mgmtezyvet-mcp- veterinaryjobber-mcp- home service / field servicepracticepanther-mcp- legal practice (solo/small)realm-mp-mcp- church / nonprofitfieldroutes-mcp- pest control / lawn carecox-automotive-mcp- auto dealershipqualia-mcp- title and escrowcampspot-mcp- outdoor hospitality (campgrounds)cleancloud-mcp- laundry / dry cleaningplaymetrics-mcp- youth sports clubsforeup-mcp- golf course management
Need a custom MCP for your vertical SaaS stack? → mcp-services.landing.
License
MIT
References
- Storable Edge API docs: https://api.storedgefms.com/
- Storable Edge Swagger JSON: https://api.storedgefms.com/apidoc/schema_swagger_json_v1.json
- OAuth 1.0 RFC: https://datatracker.ietf.org/doc/html/rfc5849
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.