OpenSolar MCP
Click on "Deploy 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., "@OpenSolar MCPFind the Harbour Street project and summarise where it's at"
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.
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" --> apiThis 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, orincomplete, 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.
Related MCP server: AppFolio MCP Server
What you can ask
Ask your agent… | What happens |
"Find the Harbour Street project and summarise where it's at." |
|
"Compare the system options on that project." |
|
"Move it to Installing." |
|
"What's the payback and NPV on the proposal?" |
|
"Add Jordan Lee as a contact, unless they already exist." |
|
"Generate the proposal PDF for that project." |
|
"Can we share this project with our installer partner?" |
|
Quick start
Requirements
Node.js 24 or newer
An OpenSolar organisation with API Access enabled
Your OpenSolar organisation ID and a bearer token
Raw Data API Access only if you want
get_proposal_dataorget_project_design
Standard OpenSolar user tokens expire after seven days. For a long-running setup, create a dedicated OpenSolar user for API work andmake it a machine user, whose token does not expire. This server never changes that setting for you.
1. See the tools you'll get (no credentials needed):
npx -y @alignco/opensolar-mcp --list-tools2. Check your configuration and token:
OPENSOLAR_API_TOKEN=your_token OPENSOLAR_ORG_ID=12345 \
npx -y @alignco/opensolar-mcp --check--check makes one read of your organisation. Add --no-probe to validate the configuration without contacting OpenSolar.
3. Add it to your MCP client using one of the options below.
Connect your MCP client
Every client needs the same two settings: OPENSOLAR_API_TOKEN and OPENSOLAR_ORG_ID. Replace your_token and 12345 below with your own values.
claude mcp add opensolar \
-e OPENSOLAR_API_TOKEN=your_token \
-e OPENSOLAR_ORG_ID=12345 \
-- npx -y @alignco/opensolar-mcpAdd --scope user to make it available in every project.
Open Settings → Developer → Edit Config and add:
{
"mcpServers": {
"opensolar": {
"command": "npx",
"args": ["-y", "@alignco/opensolar-mcp"],
"env": {
"OPENSOLAR_API_TOKEN": "your_token",
"OPENSOLAR_ORG_ID": "12345"
}
}
}
}Restart Claude Desktop after saving.
Use the Add to Cursor button above, or add this to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):
{
"mcpServers": {
"opensolar": {
"command": "npx",
"args": ["-y", "@alignco/opensolar-mcp"],
"env": {
"OPENSOLAR_API_TOKEN": "your_token",
"OPENSOLAR_ORG_ID": "12345"
}
}
}
}Use the Install in VS Code button above, or add this to .vscode/mcp.json. VS Code prompts for the token and stores it securely:
{
"inputs": [
{
"type": "promptString",
"id": "opensolar_api_token",
"description": "OpenSolar API token",
"password": true
},
{
"type": "promptString",
"id": "opensolar_org_id",
"description": "OpenSolar organisation ID"
}
],
"servers": {
"opensolar": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@alignco/opensolar-mcp"],
"env": {
"OPENSOLAR_API_TOKEN": "${input:opensolar_api_token}",
"OPENSOLAR_ORG_ID": "${input:opensolar_org_id}"
}
}
}
}Add this to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"opensolar": {
"command": "npx",
"args": ["-y", "@alignco/opensolar-mcp"],
"env": {
"OPENSOLAR_API_TOKEN": "your_token",
"OPENSOLAR_ORG_ID": "12345"
}
}
}
}Add this to ~/.codex/config.toml:
[mcp_servers.opensolar]
command = "npx"
args = ["-y", "@alignco/opensolar-mcp"]
env = { OPENSOLAR_API_TOKEN = "your_token", OPENSOLAR_ORG_ID = "12345" }Add this to ~/.gemini/settings.json:
{
"mcpServers": {
"opensolar": {
"command": "npx",
"args": ["-y", "@alignco/opensolar-mcp"],
"env": {
"OPENSOLAR_API_TOKEN": "your_token",
"OPENSOLAR_ORG_ID": "12345"
}
}
}
}Run npx -y @alignco/opensolar-mcp as a stdio server with OPENSOLAR_API_TOKEN and OPENSOLAR_ORG_ID in its environment. For a client that connects over HTTP, see Remote deployment.
To install the command once instead of through npx:
npm install -g @alignco/opensolar-mcp
opensolar-mcp --versionStart withOPENSOLAR_READ_ONLY=1 in the env block while you get comfortable. It removes every tool that can change OpenSolar data.
Tools
Profiles
A profile is a curated operating surface. Toolsets are functional areas you can select directly. Read-only mode and the access-plan filter apply on top of either.
Surface | Tools | Use it for |
| 31 | Everyday project, contact, system, file, and sharing work |
| 22 | Research, reporting, and trying things out safely |
| 29 | Organisations without Raw Data API Access |
| 75 | Administration: component catalogs, workflows, webhooks, deletes, and Teams setup |
--list-tools always prints the exact surface your settings produce:
npx -y @alignco/opensolar-mcp --list-tools
OPENSOLAR_PROFILE=full npx -y @alignco/opensolar-mcp --list-tools
OPENSOLAR_TOOLSETS=webhooks npx -y @alignco/opensolar-mcp --list-toolsDefault agent tools
✏️ marks tools that change OpenSolar data. 🔒 marks tools that need Raw Data API Access.
Area | Tools |
Projects |
|
Contacts |
|
Organisation |
|
Systems |
|
Commercial |
|
Files & documents |
|
Reference |
|
Teams sharing |
|
Raw Data |
|
Set OPENSOLAR_PROFILE=full to expose everything, or name toolsets with OPENSOLAR_TOOLSETS (for example projects,contacts,systems).
Toolset | Tools |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Some documented OpenSolar operations are intentionally not exposed because the documentation does not establish their request body — for example creating pricing schemes, payment options, costings, or component activations, and updating workflows or the organisation. The current implementation lists them.
Configuration
Variable | Purpose | Default |
| OpenSolar bearer token. Required for stdio and | — |
| Your OpenSolar organisation ID. | required |
| OpenSolar API base URL. Must be https (http only for localhost). |
|
| Tool profile: |
|
| Comma-separated toolsets. Replaces the profile's selection when set. | unset |
|
| off |
|
| unset |
| Directory | unset |
|
| stdio |
| HTTP bind address. |
|
| HTTP port. |
|
| MCP endpoint path. |
|
| Comma-separated | unset |
| Browser | the Host allowlist |
OPENSOLAR_TOOLSETS takes precedence over the profile. OPENSOLAR_READ_ONLY and OPENSOLAR_PLAN are applied afterwards. See .env.example for a commented template; the server itself does not load .env files.
Option | Description |
(none) | Serve MCP over stdio |
| Serve MCP over Streamable HTTP |
| HTTP bind settings (override the |
| Validate configuration and make one read of your organisation |
| Validate configuration without contacting OpenSolar |
| Print the tool names your settings expose |
| Print the package version |
| Show help |
Local file uploads
create_private_file uploads a file from the machine running the server, so it is off by default. To enable it, point it at a directory:
export OPENSOLAR_UPLOAD_ROOT=/absolute/path/to/uploadsRelative paths resolve inside that directory. Absolute paths and symlinks are accepted only when their real path stays inside it. The model never sends file bytes.
Downloads through get_private_file and get_system_image are capped at 10 MB. Text content is returned to the model; images and other binary files are returned as MCP image or resource content rather than copied into JSON.
Remote deployment
The server also speaks stateless Streamable HTTP, for clients that connect over the network.
OPENSOLAR_API_TOKEN=your_token OPENSOLAR_ORG_ID=12345 \
npx -y @alignco/opensolar-mcp --httpEndpoint | Purpose |
| MCP |
| Liveness. Returns |
| Readiness. Returns |
On a loopback address, an Authorization: Bearer <token> header takes precedence and the OPENSOLAR_API_TOKEN variable is a local fallback.
Exposing it beyond localhost
Any non-loopback bind requires the OpenSolar bearer token on every MCP request. The OPENSOLAR_API_TOKEN variable is ignored as a fallback, and a malformed Authorization header is rejected.
export OPENSOLAR_ORG_ID=12345
export MCP_HTTP_HOST=0.0.0.0
export MCP_HTTP_ALLOWED_HOSTS=mcp.example.com
npx -y @alignco/opensolar-mcp --httpConnect a client with the token in the request header, for example:
claude mcp add --transport http opensolar https://mcp.example.com/mcp \
--header "Authorization: Bearer your_token"The built-in server speaks plain HTTP. Put it behind a reverse proxy or platform that terminates TLS before any token crosses a network.MCP_HTTP_ALLOWED_HOSTS and MCP_HTTP_ALLOWED_ORIGINS protect against DNS rebinding and cross-site browser requests; they are not authentication.
Docker
The image runs the HTTP transport as an unprivileged user and includes a health check.
docker pull ghcr.io/align-software-company/opensolar-mcp:latest
docker run --rm \
-e OPENSOLAR_ORG_ID=12345 \
-p 127.0.0.1:3000:3000 \
ghcr.io/align-software-company/opensolar-mcp:latestTo build it from a clone of this repository instead:
docker build -t opensolar-mcp .
docker run --rm \
-e OPENSOLAR_ORG_ID=12345 \
-p 127.0.0.1:3000:3000 \
opensolar-mcpInside the container the server binds to 0.0.0.0, so clients must send Authorization: Bearer <token> on every request. The image allows localhost and 127.0.0.1 as Host values; set MCP_HTTP_ALLOWED_HOSTS to your public hostname for anything else.
Security model
No telemetry. The server sends no analytics or usage data. Its only outbound requests are to the OpenSolar API and to the file and image URLs that OpenSolar returns.
Your credentials, your process. Tokens stay in your environment or your client's configuration. Nothing is persisted, and this project runs no hosted service.
Writes are explicit. Mutating tools carry MCP
readOnlyHint: falseannotations, destructive ones carrydestructiveHint: true, and none are retried automatically.OPENSOLAR_READ_ONLY=1removes them entirely.No guessing. A search confirms a target only when it reports
resolution: unique, oridentifier_match_idfor a single exact email or phone match on a complete scan. The server never retries writes and exposes no hidden bulk writes.Minimal output. Signed download URLs, integration secrets, webhook secrets, personal identity fields, and raw design data are redacted or omitted.
Bounded work. Searches, downloads, and Raw Data decompression all have fixed limits. Only ordinary reads retry, and only on HTTP 429, up to three attempts.
HTTP mode passes your OpenSolar token through. The bearer token a client sends is the OpenSolar token itself, forwarded to OpenSolar. It is not an MCP OAuth token. If several people share one deployment, put an authenticating gateway in front of it.
Please report vulnerabilities privately — see SECURITY.md.
Compatibility
MCP protocol | 2026-07-28, with fallback for clients on 2025-11-25, 2025-06-18, and earlier revisions |
Transports | stdio; stateless Streamable HTTP |
Tool results |
|
Runtime | Node.js 24+, ESM |
Successful structured tool results also include the same payload serialized as compact JSON text. Clients that do not forward structuredContent can therefore still pass the complete structured result to the model.
Troubleshooting
Symptom | What to do |
| Standard tokens expire after seven days. Get a new token, or use a machine user. |
| Enable Raw Data API Access in OpenSolar, or set |
| The token's user lacks permission, or the project is outside your API Access entitlement. |
| You hit an OpenSolar throttle limit. Wait before retrying. |
A tool you expect is missing | Run with |
| Use |
The server won't start from your client | Check |
HTTP returns | Non-loopback binds ignore |
HTTP returns | Add your hostname to |
Logs go to stderr as JSON lines, so stdout stays clean for the MCP protocol.
Development
git clone https://github.com/Align-Software-Company/opensolar-mcp.git
cd opensolar-mcp
corepack enable
pnpm install --frozen-lockfile
pnpm check:all # repository hygiene, registry metadata, lint, typecheck, offline tests
pnpm build
pnpm test:docker # build and smoke-test the Docker imageThe regular test suite runs offline. Live integration tests read .env.local and run read-only by default; writes need OPENSOLAR_INTEGRATION_WRITES=1 and dedicated fixture records:
pnpm test:integration
OPENSOLAR_INTEGRATION_WRITES=1 pnpm test:integrationRead CONTRIBUTING.md before opening a pull request, especially the rules for OpenSolar API evidence.
Documentation
Document | What's in it |
Shipped behavior: exposure rules, transports, client behavior, redaction, and limits | |
Endpoint, method, parameters, plan, throttle, and evidence for every tool | |
OpenSolar behavior that surprised us, and how the server handles it | |
Documentation pages and live checks behind each contract | |
Behavioral evaluation of the default profile and its release adjustment | |
OpenSolar terms, throttles, and access plans that affect deployment | |
The release gate | |
Notable changes by version |
Contributing
Contributions are welcome. See CONTRIBUTING.md and the Code of Conduct. For security issues, follow SECURITY.md instead of opening an issue.
License
MIT © 2026 Align Software Company.
OpenSolar is a trademark of OpenSolar Pty Ltd. This project is independent and is not endorsed by OpenSolar.
This server cannot be deployed
Maintenance
Related MCP Connectors
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
Give your AI agent persistent, governed memory for every project. At task start it recalls the approved decisions, conventions, risks and architecture (semantic search, ranked by importance); at close it proposes what was learned as typed memories that you review and approve — governance, not a notes dump. Agents propose, humans govern: edits go back to pending and deletion is human-only by design. Connect Claude Code, Cursor, Claude Desktop or any MCP client in two minutes with just your API key — hosted (nothing to install) or locally via `uvx solucortex-mcp`. Built by SoluAI and dogfooded daily: SoluCortex is developed using its own living memory.
Zotero MCP server for Claude and ChatGPT: search, citations, safe writes, PDF passages and pages.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenance556-tool MCP server giving AI agents full access to the FutureSense business platform. Covers 10 app domains: invoicing, payroll, accounting, CRM, booking, content creation, website builder, quotations, email, and more. Works with Claude, ChatGPT, Gemini, Cursor, and any MCP-compatible client.MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that wraps AppFolio's REST API so Claude can call it natively in any conversation. 38 tools covering portfolio structure, leasing, financials, maintenance, and admin.1-

makeleaps-mcpofficial
AlicenseAqualityCmaintenanceUnofficial MCP server to operate MakeLeaps clients, quotes, and invoices from LLMs via the MakeLeaps API, with local execution and no telemetry.8MIT- AlicenseAqualityCmaintenanceA local MCP server that wraps the Housecall Pro Public API, enabling Claude to read and write Housecall Pro data (customers, jobs, estimates, invoices, etc.) via natural language.23125 npmMIT