OpenSolar MCP server
io.github.Align-Software-Company/opensolar-mcp·v0.1.3Unofficial, self-hosted MCP server for the documented OpenSolar API.
0 stars676 downloads/wk
Reviews
Write oneNobody 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 postsRead from the package source without running it. The installed server may list more.
accept_connection_requestAccepts a pending connection. org_to_id comes from list_connection_requests. This call is not retried. …
compare_project_systemsCompares 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 actionRequests a connection to a partner org. org_name must match exactly. This call is not retried. …
create_contactwrite actionAdds a person to the live org. Send only first_name, family_name, email, and phone. This call is not retried.
create_permission_rolewrite actionCreates 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 actionCreates 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 actionCreates 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 actionCreates 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 actionCreates a workflow in the live org. OpenSolar assigns the stages. Actions are omitted from the result. This call is not retried.
delete_connectionwrite actionDeletes a connection and its sharing settings. This call is not retried. …
delete_contactwrite actionRemoves the person from the live org. This call is not retried.
delete_costingwrite actionRemoves the costing from the live org. This call is not retried.
delete_payment_optionwrite actionRemoves the payment option from the live org. This call is not retried.
delete_pricing_schemewrite actionRemoves the pricing scheme from the live org. This call is not retried.
delete_private_filewrite actionRemoves the private file from the live org. This call is not retried.
delete_projectwrite actionRemoves the project from the live org. This call is not retried.
delete_workflowwrite actionRemoves the workflow from the live org. This call is not retried.
generate_project_documentwrite actionCreates 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_contactReturns 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_costingReturns one costing by id: title, description, and boolean priority. Per-unit rates are omitted.
get_eventReturns 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_orgReturns the connected OpenSolar org: id, name, address, contact info, and measurement units. `verbose: true` returns the full redacted payload.
get_payment_optionReturns one payment option by id: title, payment type, priority, auto-apply, and archived. `configuration_json` is omitted.
get_pricing_schemeReturns one pricing scheme by id: title, formula, priority, auto-apply, and archived. `configuration_json` is omitted.
get_private_fileReturns 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_projectReturns 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_designReads 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_snapshotReads 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_dataReturns 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_roleReturns one role by id: display, email, phone, job title, and is_admin. Chat API keys are omitted. Optional fieldset is list only.
get_systemReturns one system by id, with the list fields plus module, inverter, and battery codes and quantities when OpenSolar sent them.
get_system_detailsReturns 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_imageGets 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_workflowReturns 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_orgsLists established org connections. …
list_connection_requestsLists pending connection requests. …
list_contactsLists 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_costingsLists one page of costings as `{ costings, page, limit }`. The only optional filter is boolean priority. Per-unit rates are omitted.
list_event_typesReturns the OpenSolar event type ids and titles, including gaps. This is a copied docs table, not an API call.
list_file_tagsReturns private-file tag titles. The title is the identifier. This is a copied docs table, not an API call.
list_payment_optionsLists 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_schemesLists 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_filesLists 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_systemsLists 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_projectsLists 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_rolesLists roles in the connected org as `{ roles }`: id, display, email, phone, job title, and is_admin. Chat API keys are omitted.
list_roof_typesReturns the OpenSolar roof type ids and titles. This is a copied docs table, not an API call.
list_webhook_logsLists 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_queueLists 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_webhooksLists 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_workflowsLists 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_sharesearch_contactssearch_projectsshare_entitiesShares or unshares one kind of entity with connected orgs. resource is the same value as entity_type. This call is not retried.
share_projectShares 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 actionSets is_active on a connection. false disables sharing both ways. true enables it again. This call is not retried. …
update_contactwrite actionUpdates 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 actionUpdates 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 actionUpdates 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 actionSets 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 actionSets 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 actionUpdates 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
- 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
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
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.