Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "ftw",
"interface": {
"displayName": "FTW"
},
"plugins": [
{
"name": "ftw",
"source": {
"source": "local",
"path": "./"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Productivity"
}
]
}
20 changes: 20 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "ftw",
"owner": {
"name": "Sourceful Labs AB",
"email": "support@sourceful.energy"
},
"metadata": {
"description": "FTW home energy plugin from Sourceful Labs AB."
},
"plugins": [
{
"name": "ftw",
"source": "./",
"description": "Set up FTW, explain home energy and plans, and check equipment health with owner-approved access.",
"version": "1.3.0",
"category": "productivity",
"homepage": "https://ftw.sourceful.energy"
}
]
}
23 changes: 23 additions & 0 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "ftw",
"version": "1.3.0",
"description": "Set up FTW, explain home energy and plans, and check equipment health with owner-approved access.",
"author": {
"name": "Sourceful Labs AB",
"email": "support@sourceful.energy",
"url": "https://ftw.sourceful.energy"
},
"homepage": "https://ftw.sourceful.energy",
"repository": "https://github.com/srcfl/ftw-plugin",
"license": "MIT",
"keywords": [
"FTW",
"home energy",
"solar",
"battery",
"electric vehicle",
"Raspberry Pi",
"setup",
"optimization"
]
}
24 changes: 24 additions & 0 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "ftw",
"displayName": "FTW",
"version": "1.3.0",
"description": "Set up FTW, explain home energy and plans, and check equipment health with owner-approved access.",
"author": {
"name": "Sourceful Labs AB",
"email": "support@sourceful.energy"
},
"homepage": "https://ftw.sourceful.energy",
"repository": "https://github.com/srcfl/ftw-plugin",
"license": "MIT",
"keywords": [
"FTW",
"home energy",
"solar",
"battery",
"electric vehicle",
"Raspberry Pi",
"setup",
"optimization"
],
"logo": "assets/logo.png"
}
23 changes: 23 additions & 0 deletions .github/workflows/check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: check
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
jobs:
manifests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install jsonschema==4.23.0
- run: python3 scripts/check.py
- run: python3 scripts/build-chatgpt-package.py
- uses: actions/setup-node@v4
with:
node-version: "22"
- name: Claude Code plugin validation
run: npx -y @anthropic-ai/claude-code@2.1.310 plugin validate .
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
dist/
.DS_Store
._*
__pycache__/
8 changes: 8 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"mcpServers": {
"ftw": {
"type": "http",
"url": "https://cloud.ftw.energy/mcp?profile=public"
}
}
}
73 changes: 69 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,72 @@
# FTW plugin

The official [FTW](https://ftw.sourceful.energy) plugin for Grok Bot, Cursor and other AI assistants.
FTW is Sourceful's open-source home energy software that you run yourself
([srcfl/ftw](https://github.com/srcfl/ftw)).
[FTW](https://ftw.sourceful.energy) is Sourceful's open-source home energy software. You run it
yourself, on a Raspberry Pi or another Linux computer at home, and it reads your meter, solar,
battery and EV charger, keeps the history and plans when to charge and discharge. The source is at
[srcfl/ftw](https://github.com/srcfl/ftw).

Work in progress. MIT licensed, see [LICENSE](LICENSE).
This plugin connects an AI assistant to FTW: Grok Bot, Cursor, Claude, Claude Code, ChatGPT and
Codex. It helps you install and set up FTW, explains your home's energy flow, plans, history and
equipment health, and, only with your approval in FTW, runs short, bounded EV charging.

## What it holds

- One remote MCP server, `https://cloud.ftw.energy/mcp?profile=public` (FTW Cloud), with 27 named
tools. Sign-in is OAuth 2.1 with PKCE; the assistant registers itself (client ID metadata document
or dynamic client registration). No keys or secrets live in this plugin.
- Two skills:
- `ftw-setup-guide`: install, migrate, commission and connect FTW, even before any home is
connected.
- `ftw-energy-assistant`: read live energy, plans, history and health; diagnose problems;
bounded charging and owner-approved goal requests; and the safety limits that apply.
- FTW's logo.

## How access works

Nothing reaches the assistant until the home's owner approves it in FTW, on the box's own page or in
the FTW app. Default access is four read scopes (live, plan, history, health). Control, setup and
diagnostics are separate grants with their own limits and expiry. Lasting changes, such as a new
charging goal, wait for the owner to confirm in FTW. The owner can end access in FTW at any time.
The public connection has no arbitrary API reader, backup export or SSH access, and cannot return
tokens or signing keys. Core on the box keeps final control and its safety checks.

## Install

The MCP address is the same everywhere: `https://cloud.ftw.energy/mcp?profile=public`. Each
assistant opens FTW Cloud's sign-in page; you then approve the assistant in FTW.

| Assistant | How |
|---|---|
| Grok Bot | Ask Grok Bot to connect FTW at the address above, then approve the connect card. Once FTW is in the marketplace, install it from there. |
| Cursor | From the Cursor Marketplace once listed. Until then, copy this repository to `~/.cursor/plugins/local/ftw` and reload the window, or add the address as an MCP server. |
| Claude Code | `/plugin marketplace add srcfl/ftw-plugin`, then `/plugin install ftw@ftw`. Or `claude mcp add --transport http -s user ftw "https://cloud.ftw.energy/mcp?profile=public"` for the server alone. |
| Claude (web, desktop, mobile) | Settings → Connectors → Add custom connector, with the address above and no client ID. |
| ChatGPT | Install FTW from the plugin directory once OpenAI has listed it. Until then, add the address as a custom MCP server from the Plugins page (some workspaces need developer mode turned on first). |
| Codex | `codex plugin marketplace add srcfl/ftw-plugin`, then `codex plugin add ftw@ftw` (or `/plugins` inside Codex). Or `codex mcp add ftw --url "https://cloud.ftw.energy/mcp?profile=public"`, then `codex mcp login ftw`. |

## Network and data

The plugin talks only to `https://cloud.ftw.energy`. What FTW Cloud handles and keeps is in the
[privacy notice](https://ftw.sourceful.energy/privacy#assistants), and the
[plugin terms](https://ftw.sourceful.energy/plugin-terms) apply. What you let the assistant read
goes to the company that runs the assistant, under its own privacy policy.

Support: support@sourceful.energy or [ftw.sourceful.energy/support](https://ftw.sourceful.energy/support).

## Files

| File | Read by |
|---|---|
| `plugin.json`, `mcp.json` | Agent Plugins format: Cursor, Grok Bot, Codex, VS Code and others |
| `.cursor-plugin/plugin.json` | Cursor Plugins format: Cursor Marketplace, Grok Bot |
| `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, `.mcp.json` | Claude Code, Grok Build |
| `.agents/plugins/marketplace.json` | Codex marketplace |
| `skills/` | all of the above |
| `assets/` | logo (512 px) and icon (96 px) |
| `openai/` | the ChatGPT package exactly as submitted to OpenAI, see [openai/README.md](openai/README.md) |
| `scripts/check.py` | checks every manifest; CI runs it on each pull request |

## License

MIT, see [LICENSE](LICENSE). FTW itself and FTW Cloud keep their own licenses; this repository holds
only the plugin files, no FTW code.
Binary file added assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions docs/SUBMISSION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Marketplace submission notes (not submitted)

Form: https://x.ai/bot/marketplace/submit-a-plugin ("Grok (coming soon), Grok Bot, and Cursor").
Fredrik submits; nothing here has been sent.

| Field | Proposed answer | Status |
|---|---|---|
| Name | FTW | ready |
| Organisation | Sourceful Labs AB | ready |
| Work e-mail | ? | Fredrik picks |
| Website | https://ftw.sourceful.energy | live |
| Logo URL | https://raw.githubusercontent.com/srcfl/ftw-plugin/main/assets/logo.png (512 × 512 PNG) | live after merge |
| MCP server URL | https://cloud.ftw.energy/mcp?profile=public | live (401 + OAuth metadata) |
| GitHub repo | https://github.com/srcfl/ftw-plugin | public |
| Description | from `.cursor-plugin/plugin.json` | ready |
| Testing instructions / reviewer login | needs a reviewer account and a simulated home (the ChatGPT review used two simulated homes) | open |
| Terms URL | https://ftw.sourceful.energy/plugin-terms | live after the ftw-web merge |
| Privacy URL | https://ftw.sourceful.energy/privacy#assistants | live |
| Support | support@sourceful.energy, https://ftw.sourceful.energy/support | ready |
| Tested locally and in the app | not yet | open |

Cursor publisher terms checklist: free to users (yes), no GPL-family license (MIT, yes), terms and
privacy shown to users (the pages above), support from the publisher (support@sourceful.energy), no
training on user data (the privacy notice states that FTW Cloud keeps no assistant traffic and that
Sourceful does not use it to train AI models).

## Sign-in for each assistant

FTW Cloud accepts redirect URIs that use https, or http to localhost, 127.0.0.1 or ::1 on any
port. It refuses custom schemes such as `cursor://`.

- Claude (web, desktop, mobile): `https://claude.ai/api/mcp/auth_callback`. Accepted.
- Claude Code and Codex CLI: a loopback address. Accepted.
- ChatGPT: https callbacks on chatgpt.com. Accepted; the 1.3.0 review used them.
- Grok Bot and Cursor's cloud agents: `https://www.cursor.com/agents/mcp/oauth/callback`. Accepted
if that is the URI they register.
- Cursor desktop: if it registers `cursor://anysphere.cursor-mcp/oauth/callback`, FTW Cloud refuses
the registration. Test in a real Grok Bot and in Cursor desktop before submitting.
9 changes: 9 additions & 0 deletions mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
"mcpServers": {
"ftw": {
"type": "streamable-http",
"url": "https://cloud.ftw.energy/mcp?profile=public"
}
}
}
18 changes: 18 additions & 0 deletions openai/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# ChatGPT and Codex package

`package/` is FTW 1.3.0 as submitted to OpenAI's plugin directory on 18 October 2026. Its 14 files
match the archive in OpenAI's portal byte for byte; `SHA256SUMS` records them, and
`scripts/check.py` fails if any file changes.

It differs from the shared plugin at the repository root in four ways: the skills address ChatGPT,
each skill has `agents/openai.yaml`, `plugin.json` carries OpenAI's review cases and release notes,
and `mcp.json` names the server `ftw-cloud` with OpenAI's OAuth settings (dynamic client
registration, four read scopes).

Build the upload ZIP with:

python3 scripts/build-chatgpt-package.py

Change `package/` only for a new OpenAI submission. Then raise the version, update `SHA256SUMS` and
consider pointing `termsOfServiceURL` at https://ftw.sourceful.energy/plugin-terms. The reviewed
1.3.0 package points at /chatgpt-terms, which stays online.
14 changes: 14 additions & 0 deletions openai/SHA256SUMS
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
120f748c9c91625aad59d8eb69cc8b8c073dffd1f7f87be65b24b692acde90ad ./assets/ftw-icon-512.png
9d92705f68113ed32b31efaa2c8eb0b5104175dde2b54d266d12292967657a5e ./assets/ftw-icon-96.png
94b2e6f2650d735e7031e52df649bf04b1a5f0e84cc420f287bc0473a686c073 ./mcp.json
3d344fef5f9ed5f7c22535e02ec5ca0fe91c2bac5a502b259b13a1c4ac7f88de ./plugin.json
ffa5d5c513ec6f4d2d9721c0bce2ac223ae7b386e8bd2311525c1fda778e809a ./skills/ftw-energy-assistant/SKILL.md
453e841484cb0f2f3f65f34356950090eee042be7217699659221e4aa56a8b4d ./skills/ftw-energy-assistant/agents/openai.yaml
da0e44baf17fd6122194c1cd069d81fa4adc521eadb0e5589400aa6199bedb41 ./skills/ftw-energy-assistant/references/control-and-grants.md
5f0cbe919c3812a158a838a81f4cceb331c046c85dc2e5cdbd6c914861f431ca ./skills/ftw-energy-assistant/references/diagnostics-runbook.md
169032840ab8884a7c06243feb68dc9d6a70fd9b737fa54a29e7eeeaf4974a51 ./skills/ftw-energy-assistant/references/power-and-economics.md
1e8bcdd732efce0e93f055942cf6d2bcaf614e0942ccdc84f0635991f302c7b9 ./skills/ftw-setup-guide/SKILL.md
dd7075a2a0f18d58383bcae1c967bf7ede830d0e66bc0d0e5653833e17696625 ./skills/ftw-setup-guide/agents/openai.yaml
7c2b06f4a6b1219d7ec6969b16a76060700590388be107c1037ce3435c4ac22f ./skills/ftw-setup-guide/references/chatgpt-connection.md
049364df23abee70e1748edfc5702c863acd091d41ac49d017630ca114cbe39f ./skills/ftw-setup-guide/references/commissioning-checklist.md
f2c715bd0a50769b2315f98d95d0f6a40ff7e1531eb81dece71e1dad264bc5f1 ./skills/ftw-setup-guide/references/installation-runbook.md
Binary file added openai/package/assets/ftw-icon-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added openai/package/assets/ftw-icon-96.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 31 additions & 0 deletions openai/package/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
"mcpServers": {
"ftw-cloud": {
"type": "streamable-http",
"url": "https://cloud.ftw.energy/mcp?profile=public",
"extensions": {
"com.openai": {
"auth": {
"type": "oauth",
"client": {
"mode": "dcr"
},
"baseScopes": [
"ftw.live.read",
"ftw.plan.read",
"ftw.history.read",
"ftw.health.read"
],
"defaultScopes": [
"ftw.live.read",
"ftw.plan.read",
"ftw.history.read",
"ftw.health.read"
]
}
}
}
}
}
}
Loading
Loading