storedge-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@storedge-mcpshow me my current tenants"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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".
Related MCP server: mcp-tap
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-mcpIn 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-missingCI 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
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sanjibani/storedge-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server