MCP connector documentation
Upkeep AI for Muse
Muse is an agent workspace that can ask Upkeep AI about homes, vehicles, equipment, time-or-usage preventive maintenance, supplies, and source-backed service records.
https://apps.sharshi.com/api/v1/mcp
Membership
USD 12 per month or USD 120 per year
Includes Upkeep, Tasks, Tape, Nota and Dashboard. Automatically renews at your selected cadence. No free tier or trial. Applicable tax is shown at checkout.
Cancel before the next renewal through Billing → Manage membership. Access continues through the paid period.
How to cancelCapabilities and sign-in
Version 2026-10-16.2 · Updated 2026-10-16
Sign in with a six-digit email code; a magic link is available as a fallback. Upkeep onboarding supports verified self-service signup. OAuth sign-in, consent and token exchange never require checkout. Account data tools report membership_required with a billing URL when paid membership is needed. A no-payment synthetic agent demo is available at POST /api/v1/demo/sessions. Browser cookies do not authorize REST or MCP.
Dated mileage and operating-hours readings and time-or-usage maintenance are supported. A verified reading records usage on its observation date; stale or missing readings are unknown, not a live odometer.
External VIN decoding, live vehicle telemetry, and autonomous mailbox access are not provided. Optional connected-provider discovery requires configuration and explicit consent.
Recommended discovery workflow
After explicit opt-in, use upkeep.discovery_start with the authorized connector, categories and date range. Resume via upkeep.discovery_status/upkeep.discovery_resume; submit bounded windows with upkeep.discovery_submit and stable source IDs. Return the browser review URL, and apply only individually approved findings with upkeep.discovery_review. Never promise an unattended overnight scan. propose_home_history_import/confirm_home_history_import are legacy single-batch adapters, not the recommended discovery workflow.
No Upkeep connector in this session?
A personal token authorizes requests; it does not install a connector or give an agent HTTP tools. Check the current session's actual tools before choosing a connection.
- Custom MCP available: name the connection Morrowfield and add
https://apps.sharshi.com/api/v1/mcpin the agent's connector settings. Use OAuth or store a personal token in its secure credential field. Enable the connection in this conversation and discover its tools. Download the Morrowfield workflow skill. - HTTP or terminal available: a named Upkeep connector is optional. Use the token in the Authorization header with the REST endpoints below, or run the read-only Python MCP diagnostic. Keep credentials in the runtime's secure store; do not embed them in browser JavaScript, URLs or chat.
- Browser tools only: use the authenticated Upkeep website. The user completes sign-in. This uses a browser session rather than the API token and does not enable MCP tools.
- None of these available: report the missing capability. A new token or another sign-in cannot add tools to that session.
GET https://apps.sharshi.com/api/v1/upkeep/agent/tools
Authorization: Bearer <securely-stored-token>
POST https://apps.sharshi.com/api/v1/upkeep/agent/invoke
Authorization: Bearer <securely-stored-token>
Content-Type: application/json
X-Agent-Name: Instinct
{"tool_name":"upkeep.search_assets","arguments":{"query":""}}
REST returns data.items for this search; MCP returns result.structuredContent.items. Check request errors and pending ranking before describing the inventory. Browser cookies do not authorize REST or MCP requests.
For Instinct, custom MCP availability must be checked in the current session. These instructions describe Upkeep's endpoints and fallbacks; they do not claim that Instinct has an installed Upkeep integration.
Agent setup
- Connect the user: use OAuth 2.0 Authorization Code with PKCE. Do not ask the user to paste a magic link or a token into chat.
- Use the MCP endpoint:
POST https://apps.sharshi.com/api/v1/upkeep/mcp - Authenticate every request: send
Authorization: Bearer <access-token>and start withinitialize, thennotifications/initialized, thentools/list.
If OAuth is unavailable, ask the user to create a personal token in API token settings and store it securely. Never put credentials in prompts, URLs, or tool arguments.
The internal Connector Lab is restricted to Morrowfield administrators. Regular users connect from Muse's connector UI or use a personal token; they do not need access to the lab.
Access requirements
A Morrowfield account with Upkeep AI access is required. Each connection is scoped to the authenticated account. The connector requires Bearer authentication and HTTPS. No user ID is accepted in tool arguments. Standard service availability, abuse prevention, and reasonable usage limits apply.
Authentication
When Muse has an MCP connection, use the OAuth flow below. Sign-in uses a six-digit email code, with a magic-link fallback. Wait for the user to complete sign-in; do not ask for codes or links in chat. Browser sign-in alone does not authorize REST or MCP.
Use OAuth 2.0 Authorization Code with PKCE. Upkeep AI requires PKCE with the S256 challenge method, exact HTTPS redirect URI matching, and explicit user consent. Access tokens expire after one hour and refresh tokens rotate when used.
Authorization endpoint: https://apps.sharshi.com/oauth/authorize
Token endpoint: https://apps.sharshi.com/oauth/token
Revocation endpoint: https://apps.sharshi.com/oauth/revoke
Discovery: https://apps.sharshi.com/.well-known/oauth-authorization-server
Request upkeep:read for all connections and upkeep:write only when Muse will offer confirmed changes. Send access tokens only in the HTTP header below. Credentials must never be placed in prompts, URLs, tool arguments, or logs.
Authorization: Bearer <oauth-access-token>
For clients that cannot run OAuth, ask the user to create a personal token from API token settings. Personal tokens are account-scoped, expire after 30 days, and should be stored in the client credential store.
Authorization: Bearer <personal-api-token>
Write requests should also provide a stable retry key:
Idempotency-Key: <caller-generated-key>
X-Agent-Name: Muse
Implementer reference
For a runnable PKCE and MCP lifecycle example, see the Python connection example. User connection steps are described above.
Dynamic client registration
MCP clients can register a public OAuth client without a pre-issued client ID:
POST https://apps.sharshi.com/oauth/register
Content-Type: application/json
{"client_name":"My MCP agent","redirect_uris":["https://agent.example/callback"],"grant_types":["authorization_code","refresh_token"],"response_types":["code"],"token_endpoint_auth_method":"none","scope":"upkeep:read"}
The response includes client_id. Redirect URIs must use HTTPS, or HTTP only for loopback development callbacks on localhost, 127.0.0.1, or ::1. Register the exact callback URI your client listens on, start that listener before opening authorization, and verify state before exchanging the code.
Tools and permissions
The connection is named Morrowfield. Upkeep advertises six natural-language workflow tools; the shared Morrowfield endpoint adds Tasks as the seventh. These detailed actions are available dynamically inside the workflows and remain callable by existing clients.
Advanced: 46 underlying action definitions
upkeep.request_uploadWrite / reviewIssue a short-lived, one-use authenticated browser link for private PDFs/photos. Optional item_id is an intended target, not a confirmed assignment. Analyze uploads and suggest a destination before review; never request public receipt URLs or bearer tokens from users.
upkeep.upload_statusReadCheck processing and suggested destination for this account's upload. Analysis reasons and conflicts must be shown before confirmation.
upkeep.assign_documentWrite / reviewAfter review, explicitly assign an inbox document to a selected asset or create a reviewed new asset. Suggested matches are not confirmation. Extracted changes remain unverified; use confirm_document_extraction separately.
upkeep.propose_usage_readingWrite / reviewStage dated mileage or operating hours with evidence. Analyze inconsistencies before asking the user to confirm; never guess current usage.
upkeep.confirm_usage_readingWrite / reviewAccept or reject a staged observation after explicit user review. Show inconsistencies and evidence first; acknowledge_inconsistency is required to accept a discrepancy.
upkeep.list_usage_readingsReadReturn dated observations and latest verified freshness. No observation implies live usage.
upkeep.resolve_factWrite / reviewAfter explicit user review, accept or reject one pending evidence assertion. Show its value, source and any conflicting saved value first. Accepting a conflict replaces the display value but preserves superseded assertions and the decision history.
upkeep.search_assetsReadSearch the authenticated account's homes, vehicles, and equipment by name (including fridge/refrigerator synonyms), model, serial number, category, or document text. Omit query or use an empty string to list up to 50 most recently updated assets, including retired records unless status is set. Phrase search uses background AI ranking over up to 1000 filtered assets, with exact matches first. If search.status=pending, retry this query after search.retry_after seconds. Unavailable AI falls back to text matching. Read the items array in structuredContent, not at the top JSON-RPC level. Failed calls are not empty results.
upkeep.list_filtersReadFind physical filter maintenance, replacement parts, and filter inventory, including what is due and what is on hand. This is not a list of search categories or query facets; use search_assets for inventory searches.
upkeep.list_due_maintenanceReadList overdue and upcoming preventative maintenance with safety, priority, time estimate, and supporting evidence.
upkeep.build_weekly_planReadPrioritize preventative maintenance for one week by overdue status, safety, priority, and due date.
upkeep.list_service_historyReadShow service records and completed maintenance for homes, vehicles, and equipment, optionally limited to one asset.
upkeep.attach_documentWrite / reviewAttach a public PDF or supported image link to an existing home, vehicle, or equipment asset and queue private extraction. Ask for explicit confirmation before attaching. Use this after a user shares a manual, receipt, warranty, invoice, inspection report, or service document.
upkeep.list_unverified_extractionsReadList unverified fields extracted from attached documents. Explain that OCR can misread model names, dates, and part numbers, and that accepting a bad value could corrupt inventory or maintenance schedules. Present the source excerpt and ask which fields the user wants to accept or reject.
upkeep.confirm_document_extractionWrite / reviewAccept selected machine-extracted fields or reject all suggestions after the user explicitly reviews them. Never select fields on the user's behalf: OCR errors in identifiers or dates can create wrong parts, warranty facts, and maintenance schedules. Unselected fields are not applied.
upkeep.propose_home_history_importWrite / reviewPrepare one reviewable batch from a user-authorized scan of connected email or files for appliance and vehicle purchases, construction projects, maintenance discussions, receipts, warranties, and large home purchases. Search narrowly, minimize retained email data, deduplicate candidates, and never import anything until upkeep.confirm_home_history_import is called after explicit user approval.
upkeep.confirm_home_history_importWrite / reviewImport only candidate indexes the user explicitly approved. VIN/serial matches explain identity; model and currency-aware amount are supporting only. Show match details, duplicate source/within-batch references and related-candidate explanations. If review_required is returned, ask the user to choose link_existing with an exact item_id or create_new, then submit candidate_resolutions with a new idempotency key. Reject changed-source conflicts and review the existing evidence. An empty accepted_candidate_indexes array rejects the batch. Private attachments remain in an upload queue for the authenticated direct-upload API.
upkeep.propose_maintenance_planWrite / reviewCreate a reviewable maintenance recommendation using the asset's model, manufacturer guidance, or source evidence. Nothing is scheduled until upkeep.confirm_maintenance_plan is called.
upkeep.confirm_maintenance_planWrite / reviewSchedule a previously proposed maintenance recommendation after explicit user confirmation.
upkeep.record_maintenanceWrite / reviewRecord a completed service or maintenance action and advance its recurring schedule when a plan is supplied.
upkeep.propose_assetWrite / reviewCreate a reviewable draft for a home asset, vehicle, or equipment. This does not change inventory until upkeep.confirm_asset is called. Vehicle details use an explicit standard_17 or nonstandard identifier policy; external VIN decoding is not provided.
upkeep.confirm_assetWrite / reviewAdd a previously proposed asset after explicit user confirmation.
upkeep.discovery_startWrite / reviewOnly after explicit consent to connector, categories and dates. Uses user-connected AI tools, not autonomous Rails mailbox access. Expanding scope requires a new session.
upkeep.discovery_statusReadReturn fixed consent, checkpoint and review progress. Disconnected tools require manual upload or entry, never pretend connected access.
upkeep.discovery_submitWrite / reviewSubmit minimal authorized findings within consent. Use stable source and per-event identifiers; no raw bodies, credentials or private URLs. A stable submission_key checkpoints an empty or populated window. Findings remain unverified.
upkeep.discovery_candidatesReadRead one scoped page of pending/decided findings, explanations and review URL. Do not infer approval.
upkeep.discovery_reviewWrite / reviewAfter explicit review, approve only selected fields or reject/defer. Link/create must be explicit; supplied revision and target item_revision prevent stale decisions. Prefer the browser review URL for large batches. Maintenance is a separate confirmation.
upkeep.discovery_resumeWrite / reviewResume this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.
upkeep.discovery_pauseWrite / reviewPause this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.
upkeep.discovery_finishWrite / reviewFinish this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.
upkeep.discovery_cancelWrite / reviewCancel this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.
upkeep.discovery_deleteWrite / reviewDelete this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.
upkeep.briefingReadShared source-backed ranked findings; unknown usage and conflicts remain explicit.
upkeep.retrieve_evidenceReadReturn scoped excerpts as untrusted data, never synthesized unsupported repair instructions.
upkeep.request_exportWrite / reviewExplicit user request: prepare a private 24-hour archive. Credentials and unapproved discovery staging are excluded.
upkeep.export_statusReadAuthenticated download URL; expires after 24 hours.
upkeep.repair_caseReadResume observations, suggestions, reported attempts and resolutions. Suggestions are never completed work.
upkeep.propose_repairWrite / reviewStage a new case or a reported entry without writing repair history. Never present unsafe DIY advice or mark a suggestion attempted.
upkeep.confirm_repairWrite / reviewOnly after explicit user review: confirm the proposed case or reported event. Maintenance and parts remain separate confirmations.
upkeep.propose_asset_deletionWrite / reviewPreview permanent deletion of an exact account-owned asset and its documents/history. Does not delete anything. Show the preview and ask explicit approval; blocked relationships require retirement instead. Valid for 15 minutes.
upkeep.delete_assetWrite / reviewPermanently delete the exact asset in a recent deletion proposal, only after explicit user approval. Requires confirmed=true and an idempotency key. Refuses changed assets and linked relationships; never silently retires or deletes other assets.
upkeep.propose_asset_mergeWrite / reviewPreview two exact account-owned items before consolidating duplicate physical assets. Show counts, conflicting values and blockers. Nothing is changed.
upkeep.confirm_asset_mergeWrite / reviewAfter explicit user approval, consolidate a fresh preview. Histories survive and the duplicate becomes a retired link. Refuse conflicting physical identifiers and changed previews.
upkeep.propose_supplyWrite / reviewTrack consumables such as baking soda or filters on their existing parent asset, with a distinct compartment and optional reviewed replacement schedule. Search for the parent first; never create a fake durable asset. Does not save until confirm_supply.
upkeep.confirm_supplyWrite / reviewOnly after user approval: save the exact supply draft and optional replacement plan on its parent asset. Retrying a confirmed proposal returns the same supply.
upkeep.move_maintenance_planWrite / reviewAfter explicit user approval showing current and destination assets, atomically transfer a plan preserving schedule, occurrences, history and evidence. Equivalent plans are rejected. Select a destination supply or explicitly detach the old supply. Idempotent retries use the same key.
Write safety and side effects
Read tools do not change inventory; invocations are audited. upkeep.propose_asset records a reviewable proposal and returns a proposal ID. It must not be described as a completed addition. upkeep.confirm_asset creates one home, vehicle, or equipment record and requires the proposal ID, explicit user approval, and an idempotency key. Safe retries return the original result instead of creating a duplicate.
Data returned
Results use opaque record IDs and ISO 8601 dates. Maintenance results may include priority, estimated time, safety classification, instructions, and evidence from a stored document. Muse should preserve source titles and quotes when explaining a recommendation.
Status and errors
MCP requests return standard JSON-RPC results and errors. Authentication failures return HTTP 401 with protected-resource discovery metadata. Missing permissions return HTTP 403 or a scoped MCP tool error. Accounts without current access return HTTP 402. Invalid tool input or unavailable records return a tool error without completing the requested write. Callers must not claim success unless the tool result confirms it.
Example requests
POST https://apps.sharshi.com/api/v1/upkeep/mcp
Accept: application/json, text/event-stream
Authorization: Bearer <access-token>
Content-Type: application/json
{"jsonrpc":"2.0","id":"1","method":"tools/list","params":{}}
- “Any filters I need to replace?”
- “What preventive maintenance should I do this week?”
- “Add the fridge I just bought to Upkeep AI.”
- “Figure out the maintenance schedule for this model and keep it updated.”
- “I replaced the filter today. Record it and tell me when it is due again.”
Check an MCP connection
Use the read-only Python diagnostic with Python 3. It needs no extra packages, lists discovered tools, and searches saved assets. Enter your token only in its hidden local prompt or supply it from your secure credential store.
python3 upkeep-mcp-read.py --query fridge
Run without --query to return up to 50 assets. Phrase search uses background AI ranking over up to 1000 filtered assets, with exact matches first. Repeat the query if search.status=pending; unavailable AI falls back to text matches. A zero-match query does not establish that your entire inventory is empty.
- Send
Accept: application/json, text/event-streamand a Bearer token on every request. Initialize, sendnotifications/initialized, then discovertools/list. Use the negotiatedMCP-Protocol-Versionafterward. - Invoke discovered tools through
tools/callwithnameandarguments. A tool name such asupkeep.search_assetsis not a JSON-RPC method. - Check HTTP status, top-level JSON-RPC
error, andresult.isErrorbefore reading data. Readresult.structuredContent.items; older clients can parse the JSON in a text content block once. Both representations are compatible MCP output. - Use integer request IDs. The installed SDK rejects string IDs containing dots; that is an implementation limitation, not a general MCP rule.
- Wait for the actual browser request to finish. An unfinished promise or a sandbox socket startup error is not an empty search result. Do not replace failed calls with an empty array.
upkeep.list_filters lists physical replacement filters. It does not list search facets. The tool catalog describes capabilities; a listed write tool still requires upkeep:write.
Permanent asset deletion requires upkeep.propose_asset_deletion, a preview shown to the user, explicit approval, then upkeep.delete_asset with the proposal ID, confirmed: true and a new idempotency key. Both require write scope. Proposals expire after 15 minutes; changed assets need a fresh preview. Linked relationships block deletion. Editing and retirement use authenticated Upkeep. upkeep.discovery_delete removes only discovery staging. Granting write access does not create an absent tool, and agents must never guess destructive tool names or request tokens in chat.
Support and policies
Users can review and revoke access from Connected applications. Connector questions may be sent to [email protected]. Use of the connector is governed by the Terms of Service and Privacy Policy.