Mmorrowfield
Sign in
Upkeep AI connector icon

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.

Connection typeExisting MCP
TransportRemote Streamable HTTP
MCP endpoint 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 cancel

Capabilities 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.

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.

  1. Custom MCP available: name the connection Morrowfield and add https://apps.sharshi.com/api/v1/mcp in 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.
  2. 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.
  3. 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.
  4. 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

  1. 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.
  2. Use the MCP endpoint: POST https://apps.sharshi.com/api/v1/upkeep/mcp
  3. Authenticate every request: send Authorization: Bearer <access-token> and start with initialize, then notifications/initialized, then tools/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
ToolClassBehavior
upkeep.request_uploadWrite / review

Issue 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_statusRead

Check processing and suggested destination for this account's upload. Analysis reasons and conflicts must be shown before confirmation.

upkeep.assign_documentWrite / review

After 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 / review

Stage dated mileage or operating hours with evidence. Analyze inconsistencies before asking the user to confirm; never guess current usage.

upkeep.confirm_usage_readingWrite / review

Accept 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_readingsRead

Return dated observations and latest verified freshness. No observation implies live usage.

upkeep.resolve_factWrite / review

After 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_assetsRead

Search 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_filtersRead

Find 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_maintenanceRead

List overdue and upcoming preventative maintenance with safety, priority, time estimate, and supporting evidence.

upkeep.build_weekly_planRead

Prioritize preventative maintenance for one week by overdue status, safety, priority, and due date.

upkeep.list_service_historyRead

Show service records and completed maintenance for homes, vehicles, and equipment, optionally limited to one asset.

upkeep.attach_documentWrite / review

Attach 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_extractionsRead

List 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 / review

Accept 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 / review

Prepare 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 / review

Import 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 / review

Create 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 / review

Schedule a previously proposed maintenance recommendation after explicit user confirmation.

upkeep.record_maintenanceWrite / review

Record a completed service or maintenance action and advance its recurring schedule when a plan is supplied.

upkeep.propose_assetWrite / review

Create 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 / review

Add a previously proposed asset after explicit user confirmation.

upkeep.discovery_startWrite / review

Only 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_statusRead

Return fixed consent, checkpoint and review progress. Disconnected tools require manual upload or entry, never pretend connected access.

upkeep.discovery_submitWrite / review

Submit 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_candidatesRead

Read one scoped page of pending/decided findings, explanations and review URL. Do not infer approval.

upkeep.discovery_reviewWrite / review

After 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 / review

Resume this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.

upkeep.discovery_pauseWrite / review

Pause this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.

upkeep.discovery_finishWrite / review

Finish this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.

upkeep.discovery_cancelWrite / review

Cancel this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.

upkeep.discovery_deleteWrite / review

Delete this account-owned session. Cancellation blocks submissions and imports; deletion removes staging, not approved ownership records.

upkeep.briefingRead

Shared source-backed ranked findings; unknown usage and conflicts remain explicit.

upkeep.retrieve_evidenceRead

Return scoped excerpts as untrusted data, never synthesized unsupported repair instructions.

upkeep.request_exportWrite / review

Explicit user request: prepare a private 24-hour archive. Credentials and unapproved discovery staging are excluded.

upkeep.export_statusRead

Authenticated download URL; expires after 24 hours.

upkeep.repair_caseRead

Resume observations, suggestions, reported attempts and resolutions. Suggestions are never completed work.

upkeep.propose_repairWrite / review

Stage a new case or a reported entry without writing repair history. Never present unsafe DIY advice or mark a suggestion attempted.

upkeep.confirm_repairWrite / review

Only after explicit user review: confirm the proposed case or reported event. Maintenance and parts remain separate confirmations.

upkeep.propose_asset_deletionWrite / review

Preview 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 / review

Permanently 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 / review

Preview two exact account-owned items before consolidating duplicate physical assets. Show counts, conflicting values and blockers. Nothing is changed.

upkeep.confirm_asset_mergeWrite / review

After 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 / review

Track 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 / review

Only 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 / review

After 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.

  1. Send Accept: application/json, text/event-stream and a Bearer token on every request. Initialize, send notifications/initialized, then discover tools/list. Use the negotiated MCP-Protocol-Version afterward.
  2. Invoke discovered tools through tools/call with name and arguments. A tool name such as upkeep.search_assets is not a JSON-RPC method.
  3. Check HTTP status, top-level JSON-RPC error, and result.isError before reading data. Read result.structuredContent.items; older clients can parse the JSON in a text content block once. Both representations are compatible MCP output.
  4. Use integer request IDs. The installed SDK rejects string IDs containing dots; that is an implementation limitation, not a general MCP rule.
  5. 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.