MCP.Market

OpenSolar MCP server

by Align-Software-Company·io.github.Align-Software-Company/opensolar-mcp·v0.1.3

Unofficial, self-hosted MCP server for the documented OpenSolar API.

B82/100grade B
What users say
No reviews yet
Be the first
Safety scan
B82/100

full report

Adoption
Growing

0 stars676 downloads/wk

Reviews

Write one

Nobody has reviewed OpenSolar MCP yet.

If you have run it, two minutes of your experience saves the next person an afternoon.

OpenSolar MCP tools (63, 23 write)

write = sends, deletes, buys or posts

Read from the package source without running it. The installed server may list more.

  • accept_connection_request

    Accepts a pending connection. org_to_id comes from list_connection_requests. This call is not retried. …

  • compare_project_systems

    Compares the systems on one project. Columns are included only when that system payload has them: kW, module count, annual kWh, kWh per kW, price, price per watt, battery kWh, and hardware names. No system is ranked. One system-details call runs when a listed system is missing modules, inverters, or batteries. An empty array counts as present. Groups already on the list are not replaced. A failed

  • create_connection_requestwrite action

    Requests a connection to a partner org. org_name must match exactly. This call is not retried. …

  • create_contactwrite action

    Adds a person to the live org. Send only first_name, family_name, email, and phone. This call is not retried.

  • create_permission_rolewrite action

    Creates a team permission role. role_type is always 1, the value the page uses for a partner role. These permissions only reduce what a partner can do. This call is not retried.

  • create_private_filewrite action

    Creates a private file in the live org from a path confined to OPENSOLAR_UPLOAD_ROOT on this server. Uploads are disabled until that root is configured. The resolved real path must remain inside the root, including through symlinks. The server reads that file as multipart title and file_contents. Files over 25 MB are refused. File bytes are not accepted from the model. The download URL is omitted.

  • create_projectwrite action

    Creates a project in the live org. A new project can be blocked when the wallet is empty. API Access uses project-level paid entitlement while it is enabled. This call is not retried.

  • create_webhookwrite action

    Creates a webhook in the live org. Requires endpoint, enabled, and debug. Leave trigger_fields and payload_fields unset to use OpenSolar defaults. project.* plus event.* plus contact.* is broader than most callers want. This call is not retried.

  • create_workflowwrite action

    Creates a workflow in the live org. OpenSolar assigns the stages. Actions are omitted from the result. This call is not retried.

  • delete_connectionwrite action

    Deletes a connection and its sharing settings. This call is not retried. …

  • delete_contactwrite action

    Removes the person from the live org. This call is not retried.

  • delete_costingwrite action

    Removes the costing from the live org. This call is not retried.

  • delete_payment_optionwrite action

    Removes the payment option from the live org. This call is not retried.

  • delete_pricing_schemewrite action

    Removes the pricing scheme from the live org. This call is not retried.

  • delete_private_filewrite action

    Removes the private file from the live org. This call is not retried.

  • delete_projectwrite action

    Removes the project from the live org. This call is not retried.

  • delete_workflowwrite action

    Removes the workflow from the live org. This call is not retried.

  • generate_project_documentwrite action

    Creates a project document in the live org and returns the private file id. Omit format for the document type's default. pdf and csv set file_format on generate_document; docx calls generate_document_docx. The call sends action=save so OpenSolar stores a private file. File bytes are not returned. Use get_private_file for contents. This call is not retried.

  • get_contact

    Returns one contact by id, including `is_synthetic_email`. Passport, licence, and date of birth are redacted. Contacts have no created_date or modified_date.

  • get_costing

    Returns one costing by id: title, description, and boolean priority. Per-unit rates are omitted.

  • get_event

    Returns one event by id. Adds `event_type_name` and omits `url` and `org`. Use an id from get_project events. Unknown types become `Unknown event type`.

  • get_org

    Returns the connected OpenSolar org: id, name, address, contact info, and measurement units. `verbose: true` returns the full redacted payload.

  • get_payment_option

    Returns one payment option by id: title, payment type, priority, auto-apply, and archived. `configuration_json` is omitted.

  • get_pricing_scheme

    Returns one pricing scheme by id: title, formula, priority, auto-apply, and archived. `configuration_json` is omitted.

  • get_private_file

    Returns one private file by id: title, file tag titles, project id, and size when OpenSolar sent it. The download URL stays on the server. `include_contents: true` downloads the file and refuses a body over 10 MB. Text is included for the model, capped at 100,000 characters. Images are image content. PDFs include extracted text and a PDF resource; other binary files use an embedded resource. Binar

  • get_project

    Returns one project by id: address, stage, stage_milestone, workflow ids, contacts, assigned role, system_count, design_available, and events. Use it for fields a search row does not include. When search_projects reports `resolution: unique`, that target does not need this call before a write. `verbose: true` returns the full redacted object; `design` is `[REDACTED]`. API Access may omit design.

  • get_project_design

    Reads the compressed design on one project. section defaults to summary: system count and system_price_including_tax. components and energy return unmapped true because the decompress section does not name those keys. geometry reports whether autoFacetsGeoJson is present and does not return coordinates. financials returns numeric pricing keys on each system and does not return pricing objects. Req

  • get_project_snapshot

    Reads one project plus its workflow, systems, and file metadata. A section that fails is a gap, not an empty list. Design, file URLs, and configuration JSON are omitted. payment_option is included only when the project payload points at payment_option_sold. Usage keeps the source period. Daily-per-month values are not summed into an annual total. Systems are one page from the systems list. File ti

  • get_proposal_data

    Returns proposal figures for one project: system name, annual kWh, monthly kWh, payback year, net present value, IRR, and return on investment. Requires Raw Data API Access. A 402 means this org does not have that plan. One inaccessible project returns 403. A compressed output string is decoded on the server and is not returned.

  • get_role

    Returns one role by id: display, email, phone, job title, and is_admin. Chat API keys are omitted. Optional fieldset is list only.

  • get_system

    Returns one system by id, with the list fields plus module, inverter, and battery codes and quantities when OpenSolar sent them.

  • get_system_details

    Returns modules, inverters, batteries, module groups, and incentives for systems on a project the org owns. Shared team projects cannot use this endpoint. include_parts and exclude_parts only filter the upstream `data` field, which is not returned. OpenSolar can time out on large projects; do not retry in a loop. custom_data is omitted.

  • get_system_image

    Gets a system image. Width and height are required. The server follows redirects after checking each redirect target. The first call can create a private file on the project, and a later design change regenerates it. The default result is the private file id when the response exposes one, plus content type. include_contents returns the image as MCP image content and refuses a body over 10 MB. Imag

  • get_workflow

    Returns one workflow by id, including stage id, title, milestone, order, and is_archived. Actions are omitted. Use a stage id as active_stage_id.

  • list_connected_orgs

    Lists established org connections. …

  • list_connection_requests

    Lists pending connection requests. …

  • list_contacts

    Lists one page of contacts as `{ contacts }`. Each contact includes `is_synthetic_email` for `@os.code` addresses. Passport, licence, and date of birth are redacted. Contacts have no created_date or modified_date.

  • list_costings

    Lists one page of costings as `{ costings, page, limit }`. The only optional filter is boolean priority. Per-unit rates are omitted.

  • list_event_types

    Returns the OpenSolar event type ids and titles, including gaps. This is a copied docs table, not an API call.

  • list_file_tags

    Returns private-file tag titles. The title is the identifier. This is a copied docs table, not an API call.

  • list_payment_options

    Lists one page of payment options as `{ payment_options, page, limit }`. Optional filters are payment_type, auto_apply_enabled, and priority. `configuration_json` is omitted.

  • list_pricing_schemes

    Lists one page of pricing schemes as `{ pricing_schemes, page, limit }`. Optional filters are priority, auto_apply_enabled, and pricing_formula. `configuration_json` is omitted.

  • list_private_files

    Lists one page of private files as `{ private_files, page, limit }`. Each row is id, title, file tag titles, and project id. The download URL is omitted.

  • list_project_systems

    Lists one page of systems for a project as `{ systems, page, limit }`. Each row has id, name, size, module count, battery kWh, annual output, and price. Not the full pricing breakdown.

  • list_projects

    Lists one page of projects in the connected org. Default result is `{ projects, page, limit }` with id, title, address, dates, stage, stage_milestone, and workflow ids when OpenSolar sent them. `verbose: true` returns `{ projects, page, limit }` with the full redacted list objects. Use search_projects when you know a name, address, email, or phone. Use get_project only when you need detail beyond

  • list_roles

    Lists roles in the connected org as `{ roles }`: id, display, email, phone, job title, and is_admin. Chat API keys are omitted.

  • list_roof_types

    Returns the OpenSolar roof type ids and titles. This is a copied docs table, not an API call.

  • list_webhook_logs

    Lists one page of webhook logs as `{ webhook_logs, page, limit }`. Each row is id, webhook_id, event_queue_name, created_date, modified_date, and event_timestamp. An empty page can return HTTP 500. …

  • list_webhook_queue

    Lists one page of the webhook queue as `{ webhook_queue, page, limit }`. Each row is id, webhook_id, model_name, event, number_of_attempts, next_attempt_at, and processing_started_at.

  • list_webhooks

    Lists the org webhooks as `{ webhooks }`. Each webhook is id, endpoint, enabled, debug, trigger_fields, and payload_fields. The webhooks page does not document paging. …

  • list_workflows

    Lists one page of workflows as `{ workflows, page, limit }`. Each stage includes id, title, milestone, order, and is_archived. Use a stage id as active_stage_id. Actions are omitted.

  • preflight_project_share
  • search_contacts
  • search_projects
  • share_entities

    Shares or unshares one kind of entity with connected orgs. resource is the same value as entity_type. This call is not retried.

  • share_project

    Shares one project with one connected org. The server builds the permission role URL from permission_role_id. is_shared defaults to true when omitted. This call is not retried.

  • update_connectionwrite action

    Sets is_active on a connection. false disables sharing both ways. true enables it again. This call is not retried. …

  • update_contactwrite action

    Updates a person in the live org. Send at least one of first_name, family_name, email, and phone. This call is not retried.

  • update_private_filewrite action

    Updates a private file title in the live org. The published sample sends only title. The download URL is omitted. This call is not retried.

  • update_projectwrite action

    Updates address, notes, and related fields on one project in the live org. Send at least one field besides id. Stage, design, workflow, and usage are not accepted. This call is not retried.

  • update_project_stagewrite action

    Sets the workflow stage on a project in the live org. Send active_stage_id with workflow_id, or stage_name. A stage title is resolved on that workflow and never matches an archived stage. No match or two matches with the same title do not PATCH. The deprecated stage field is not accepted. This call is not retried.

  • update_project_usagewrite action

    Sets energy consumption on a project in the live org. Only the usage object is sent. values must match the source: one integer for annual, 12, 6, or 4 integers for the period sources, or Low, Medium, or High for estimate. This call is not retried.

  • update_webhookwrite action

    Updates a webhook in the live org. A blank trigger_fields or payload_fields on an existing webhook is treated as null. This call is not retried. …

Public scan report

scanner v0.1.10 · 2026-10-01 · same rubric, same numbers if you re-run it

no findings
  • Code scan2 source files scanned25/25
  • –Live reliabilityno gateway calls yet and no remote to proben/a
  • –Tool poisoningtools not inspected (local package is not executed); not countedn/a
  • Auth qualitystatic API keys via environment variables6/15
  • Maintenancelast push 1 days ago15/15
  • Maintainer identityregistry namespace matches repository owner7/10
Overall 82/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

How OpenSolar MCP compares

Against every graded MCP server, from our own scans and uptime checks. Updated after each scan run.

Safety score
82/100
higher than 63% of 48,255 servers
Tools
63
the typical server has 7
Tools that change things
37%
typical: 0%. Fewer write tools means less an agent can break
Downloads a week
676
more than 91% of 12,191 servers with a package

What its tools let an agent do: 38 read · 8 create · 7 change · 8 delete · 2 send or post

Install OpenSolar MCP in Claude Code, Cursor or VS Code

Runs npx -y @alignco/opensolar-mcp on your machine. Read the scan report first; the gateway never runs local packages.

claude mcp add opensolar-mcp -- npx -y @alignco/opensolar-mcp
Add to Cursor

What the publisher says

From the OpenSolar MCP repository's README, as published. We do not edit it. Read it on GitHub

OpenSolar MCP

Give Claude, Cursor, VS Code, and any other MCP client safe, structured access to your OpenSolar organisation.

Unofficial · Self-hosted · Bring your own OpenSolar API token

Quick start · Connect a client · Tools · Configuration · Remote deployment · Security · Troubleshooting

OpenSolar MCP is a Model Context Protocol server for the documented OpenSolar API. It runs on your machine or your infrastructure, uses your own OpenSolar credentials, and gives AI agents a curated set of tools for projects, contacts, systems, files, commercial settings, and Teams sharing.

flowchart LR
    client["MCP client<br/>Claude · Cursor · VS Code · Codex"]
    server["OpenSolar MCP<br/>runs where you run it"]
    api[("OpenSolar API<br/>api.opensolar.com")]
    client -- "stdio or Streamable HTTP" --> server
    server -- "HTTPS with your bearer token" --> api

[!IMPORTANT]

This project is not affiliated with, endorsed by, or maintained by OpenSolar Pty Ltd. It calls only the public, documented OpenSolar API and does not operate a shared or hosted OpenSolar service.

Highlights

  • Curated for agents. A 31-tool default profile covers everyday work. All 75 registered tools are one setting away.
  • Semantic operations, not just endpoints. Project and contact search, operational snapshots, stage changes by name, side-by-side system comparison, design summaries, and a read-only share preflight.
  • Conservative by design. Searches report whether a match is unique, ambiguous, or incomplete, and agents are told not to guess. Writes are never retried automatically, and read-only mode removes every mutation.
  • Faithful to OpenSolar's documentation. Every tool is backed by the official API documentation or by recorded live verification, and writes are exposed only when their request body is established. The evidence for each tool is in the API contract matrix.
  • Clean model context. Structured output with published schemas. Credentials, signed URLs, design blobs, and other raw or sensitive fields are removed before they reach the model.
  • Current MCP. Built on the official MCP TypeScript SDK v2 for the 2026-07-28 specification, with fallback for clients on earlier protocol versions. Supports stdio and stateless Streamable HTTP, and every tool declares a title, output schema, and behavior annotations.

What you can ask

Shortened. The full README is on GitHub.

Nothing above is checked by us. What we check is on the safety report.

OpenSolar MCP: common questions

Is OpenSolar MCP server safe?
Mostly: it is graded B (82/100). Read the OpenSolar MCP safety report
How do I install OpenSolar MCP?
It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
Does OpenSolar MCP need an API key?
Yes. The registry entry asks for OPENSOLAR_API_TOKEN.
Is OpenSolar MCP maintained?
The last commit was 35 days ago (2026-09-30). The latest release is v0.1.3.
How does OpenSolar MCP compare with other MCP servers?
safety score 82/100 (higher than 63% of 48,255 servers); tools 63 (the typical server has 7); tools that change things 37% (typical: 0%. Fewer write tools means less an agent can break). Full comparison.