For those people that went between pasting their code into their favorite AI engines because they liked the responses and wished their Antigravity or CLI tools would be able to simulate that, we built this.
brAInstorm creates cocooned webservers for each of your AI tools, that then provides MCP services that your Antigravity, Codex, or other CLI tools can interface with.
We also provide a customizable skills section where you can build out skills to brief the AI's on.
Now you can pull in the power of:
- ChatGPT, Claude, Gemini, Google AI, Perplexity, DeepSeek, Grok, Z.AI, Copilot, Meta AI, and Qwen
to work on your projects - SAVE tokens as these don't need API keys and are freely available to you.
Getting Started · API Usage · Skills · SDKs · MCP · Troubleshooting
We modify this and have more work to do. We welcome your help. Fork our GIT, add some improvements for the features you need, and then send us a pull request. We grow stronger together and this tool helps our AI tokens go further!
One API. One URL. One function field. Any enabled model.
POST /v1/chat/completions
{"model":"claude","message":"Give me the risky edge cases in this auth flow."}
{"model":"perplexity","message":"What changed in AI this week?","function":"search"}
{"model":"claude","function":"security_audit","code":"async function login(req,res){...}"}
{"model":"claude","function":"code_review","desc":"Please review this Express middleware for bugs:\\n\\nconst allow = req.user?.role === 'admin';"}No API keys required. brAInstorm uses your existing browser sessions to talk to AI providers directly.
| Feature | Description |
|---|---|
| One Endpoint | Everything through /v1/chat/completions |
| 11 AI Providers | ChatGPT, Claude, Gemini, Google AI, Perplexity, DeepSeek, Grok, Z.AI, Copilot, Meta AI, Qwen |
| 62+ MCP Tools | Search, code, translation, file analysis, provider control, dynamic skills |
| Dynamic Skills | Any skills/<name>.md file becomes a callable prompt automatically |
| REST API | OpenAI-compatible API on localhost:3210 |
| SDKs | Python and JavaScript clients, plus legacy compatibility aliases |
| Local and Private | Runs on localhost, data stays on your machine |
| Smart Router | Auto-picks the best available AI for a request |
- Added Google AI as a provider with
ask_googleaiand REST model support. - Added dynamic skills backed by
skills/*.md. - Added
GET /v1/skills,list_skills,run_skill, andbrainstorm://skills. - Added Cloudflare / human verification surfacing so blocked providers tell you to complete the check in the app.
- Rebranded the app and docs to brAInstorm while keeping legacy compatibility where it matters.
- Windows 10/11 or macOS
- Node.js 18+
Download Installer
Download the latest release and run the installer. Windows installers are published. macOS can run from source or be built locally from this repo.
Run from Source
git clone https://github.com/mindflowgo/brAInstorm
cd brAInstorm
npm install
npm start| Command | Output |
|---|---|
npm start |
Run brAInstorm locally |
npm run mcp |
Launch the stdio MCP server directly |
npm run build:win |
Build the Windows app |
npm run build:installer |
Build the Windows NSIS installer |
npm run build:mac |
Build macOS universal dmg and zip artifacts |
npm run build:mac:dir |
Build an unpacked macOS .app directory |
Build commands automatically generate a minimal packaged MCP runtime in build/packaged-runtime/ so the packaged app can expose src/mcp-server-v3.js, skills/, and only the Node dependencies that runtime actually needs.
- Open brAInstorm, enable the providers you want, and log in to each one.
- Copy the MCP config from the Settings panel.
- Connect your MCP client or call the REST API at
http://localhost:3210. - Add or edit files in
skills/if you want custom reusable prompts.
| Provider | Model ID | Enabled by Default | Default Action |
|---|---|---|---|
| ChatGPT | chatgpt |
Yes | chat |
| Claude | claude |
No | chat |
| Gemini | gemini |
Yes | chat |
| Google AI | googleai |
No | chat |
| Perplexity | perplexity |
Yes | search |
| DeepSeek | deepseek |
No | chat |
| Grok | grok |
No | chat |
| Z.AI | zai |
No | chat |
| Copilot | copilot |
No | chat |
| Meta AI | metaai |
No | chat |
| Qwen | qwen |
No | chat |
POST http://localhost:3210/v1/chat/completions
Content-Type: application/json
No function field means normal chat. If function matches a built-in mode or a discovered skill file, brAInstorm changes behavior automatically.
| Function | Body Fields | What It Does |
|---|---|---|
| (none) | model, message |
Normal chat |
search |
model, message, function |
Web search plus AI analysis |
translate |
model, message, function, to |
Translate text |
brainstorm |
model, message, function |
Run the skills/brainstorm.md prompt |
code |
model, message, function, action |
Generate, review, debug, or explain code |
analyze |
model, function, url or message |
Analyze a URL or content |
<skill_name> |
model, function, skill variables |
Run any discovered skills/<skill_name>.md prompt |
| Method | Endpoint | Description |
|---|---|---|
GET |
/v1/models |
List models and their enabled status |
GET |
/v1/functions |
Function catalog plus current skill registry |
GET |
/v1/skills |
List discovered skills, variables, and templates |
GET |
/v1/stats |
Response time stats |
POST |
/v1/conversations/new |
Start fresh conversations |
Every request returns the same OpenAI-style envelope:
{
"id": "brainstorm-abc123",
"model": "claude",
"choices": [
{
"message": {
"role": "assistant",
"content": "AI response here..."
}
}
],
"brainstorm": {
"provider": "claude",
"responseTimeMs": 2400
},
"proxima": {
"provider": "claude",
"responseTimeMs": 2400
}
}brainstorm is the new metadata key. proxima is still included for compatibility with older SDKs and clients.
Chat
curl http://localhost:3210/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"claude","message":"Give me the obvious failure modes in a password reset flow."}'Search
curl http://localhost:3210/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"perplexity","message":"What happened in AI this week?","function":"search"}'Dynamic skill: code_review
curl http://localhost:3210/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"claude","function":"code_review","desc":"Please review this Express auth middleware for bugs and obvious improvements:\n\napp.use(async (req,res,next)=>{ if(req.headers.authorization===process.env.ADMIN_TOKEN){ req.user={role:\"admin\"}; } next(); })"}'Dynamic skill: security_audit
curl http://localhost:3210/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"claude","function":"security_audit","language":"TypeScript","code":"async function login(req,res){ const user = await db.find(req.body.email); if(user.password === req.body.password){ res.json({token: sign(user.id)}) } }"}'List current skills
curl http://localhost:3210/v1/skillsFor REST requests, brAInstorm builds skill variables from:
- Top-level JSON body fields other than
model,function,messages, andvariables - The optional
variablesobject - Standard message aliases like
message,query,prompt,content, ortext
That means all of these work:
{"model":"claude","function":"brainstorm","subject":"Ways to onboard new consultants faster"}{"model":"claude","function":"brainstorm","variables":{"subject":"Ways to onboard new consultants faster"}}Skills are never hardcoded. brAInstorm scans the skills/ directory and builds the registry from the files it finds.
skills/<name>.mdbecomes a skill named<name>- File contents are the full prompt template
${variable}placeholders are filled from request data- The registry is loaded at startup and refreshed on skill reads
- Startup logs print the discovered skills and their variable names
GET /v1/skills,list_skills, andbrainstorm://skillsexpose the live registry
Optional override:
BRAINSTORM_SKILLS_DIR=/absolute/path/to/skills- Legacy alias still supported:
PROXIMA_SKILLS_DIR
| Skill | Variables | Purpose |
|---|---|---|
brainstorm |
subject |
Idea generation |
code_review |
desc |
Code review prompt |
convo_history_summarize |
conversationHistory |
Full project-context summary |
get_ui_reference |
description, fullCode, styleHint |
UI/UX reference and implementation prompt |
github_search |
langFilter, query |
GitHub repo and code discovery |
security_audit |
fullCode, lang |
Security review prompt |
- Create a new file in
skills/, for exampleskills/new_skill.md. - Put the full prompt in that file.
- Use
${variable}placeholders anywhere you want runtime substitution. - Call it with
function: "new_skill"over REST orrun_skillover MCP.
Example:
<!-- skills/new_skill.md -->
Write a calm, practical migration plan for this system:
SYSTEM
${system_name}
CONSTRAINTS
${constraints}Then call it over REST:
curl http://localhost:3210/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"claude","function":"new_skill","system_name":"legacy billing sync","constraints":"no downtime, no schema freeze longer than 10 minutes"}'List skills
{
"tool": "list_skills",
"arguments": {
"includeTemplate": true
}
}Run a skill
{
"tool": "run_skill",
"arguments": {
"skill": "security_audit",
"provider": "claude",
"variables": {
"lang": " (TypeScript)",
"fullCode": "async function login(req,res){ const user = await db.find(req.body.email); if(user.password === req.body.password){ res.json({token: sign(user.id)}) } }"
}
}
}run_skill also supports files. If you pass files, brAInstorm exposes their contents as filesContent, fileContent, fullCode, and desc when those variables are not already set.
brainstorm://skillsbrainstorm://status
Legacy compatibility is still available:
proxima://skillsproxima://status
Primary entrypoint:
from brainstorm import Brainstorm
client = Brainstorm()
reply = client.chat(
"I need five realistic B2B SaaS ideas for accountants who hate manual month-end work.",
model="claude",
function="brainstorm",
)
print(reply.text)
review = client.chat(
model="claude",
function="code_review",
desc="Please review this login handler for bugs and weak spots:\n\nasync function login(req,res){ const user = await db.find(req.body.email); if(user.password === req.body.password){ res.json({token: sign(user.id)}) } }",
)
print(review.text)
skills = client.get_skills()
print(skills["skills"][0]["name"])Installation:
pip install requests- Copy
sdk/brainstorm.pyinto your project
Primary entrypoint:
const { Brainstorm } = require('./brainstorm');
const client = new Brainstorm();
const ideas = await client.chat(
"Give me seven practical launch ideas for a solo founder selling into local service businesses.",
{ model: "claude", function: "brainstorm" }
);
console.log(ideas.text);
const review = await client.chat("", {
model: "claude",
function: "code_review",
desc: "Please review this Express middleware for auth bugs:\\n\\napp.use(async (req,res,next)=>{ if(req.headers.authorization===process.env.ADMIN_TOKEN){ req.user={role:'admin'}; } next(); })"
});
console.log(review.text);
const skills = await client.getSkills();
console.log(skills.skills.map((skill) => skill.name));Works with Node.js 18+.
Installation:
- Copy
sdk/brainstorm.jsinto your project
Old SDK files still work:
sdk/proxima.pysdk/proxima.js
They now understand both the new brainstorm response metadata and the legacy proxima metadata.
Copy the exact JSON from the brAInstorm Settings panel when possible. A typical source checkout config looks like this:
{
"mcpServers": {
"brainstorm": {
"command": "node",
"args": ["/absolute/path/to/brAInstorm/src/mcp-server-v3.js"],
"cwd": "/absolute/path/to/brAInstorm"
}
}
}| Install Type | Example MCP Server Path | Example cwd |
|---|---|---|
| Source checkout on macOS | /Users/you/Dev/brAInstorm/src/mcp-server-v3.js |
/Users/you/Dev/brAInstorm |
| Source checkout on Windows | C:/path/to/brAInstorm/src/mcp-server-v3.js |
C:/path/to/brAInstorm |
| Packaged macOS app | /Applications/brAInstorm.app/Contents/Resources/runtime/src/mcp-server-v3.js |
/Applications/brAInstorm.app/Contents/Resources/runtime |
| Packaged Windows app | C:/Program Files/brAInstorm/resources/runtime/src/mcp-server-v3.js |
C:/Program Files/brAInstorm/resources/runtime |
- Cursor
- VS Code with an MCP extension
- Claude Desktop
- Windsurf
- Gemini CLI
Search and Research
deep_searchpro_searchnews_searchacademic_searchreddit_searchyoutube_searchimage_searchmath_search
Provider Tools
ask_chatgptask_claudeask_geminiask_googleaiask_deepseekask_grokask_zaiask_copilotask_metaaiask_qwenask_all_aiscompare_aissmart_queryinit_providerprovider_statusnavigate_providerdebug_provider_domexecute_provider_script
Skills
list_skillsrun_skill
Code and Analysis
generate_codereview_codedebug_codeoptimize_codeverify_codeanalyze_filereview_code_fileanalyze_documentanalyze_image_url
Window and Session
show_windowhide_windowtoggle_windowset_headless_modenew_conversationclear_cacherouter_statsget_typing_status
brAInstorm/
├── assets/
│ ├── brainstorm-icon.webp
│ └── brainstorm-icon.png
├── electron/
│ ├── main-v2.cjs
│ ├── rest-api.cjs
│ ├── browser-manager.cjs
│ ├── provider-runtime.cjs
│ ├── provider-senders/
│ │ └── googleai.cjs
│ └── index-v2.html
├── sdk/
│ ├── brainstorm.py
│ ├── brainstorm.js
│ ├── proxima.py
│ └── proxima.js
├── skills/
│ ├── brainstorm.md
│ ├── code_review.md
│ ├── convo_history_summarize.md
│ ├── get_ui_reference.md
│ ├── github_search.md
│ └── security_audit.md
├── src/
│ ├── mcp-server-v3.js
│ ├── provider-catalog.cjs
│ ├── provider-automation.cjs
│ └── skill-prompts.cjs
└── package.json
- brAInstorm is the new external brand.
- Legacy
proximaresponse metadata is still returned. - Legacy
proxima://...MCP resource URIs still work. - Legacy SDK filenames still work.
- Legacy
PROXIMA_SKILLS_DIRandPROXIMA_REST_PORTare still accepted.
Click "Allow". brAInstorm only accepts local connections on localhost:3210 and localhost:19222.
Click the provider tab and log in inside the embedded browser.
Enable that provider in brAInstorm Settings first. Direct provider tools only work when the provider is enabled.
- Make sure the brAInstorm app is running.
- Visit
http://localhost:3210in a browser. - Check that at least one provider is enabled and logged in.
- Ensure brAInstorm is running.
- Recopy the MCP JSON from Settings if you are using a packaged install.
- Verify the MCP server path and
cwd. - Restart the MCP client app.
- Make sure the file ends with
.md. - Put it inside
skills/or yourBRAINSTORM_SKILLS_DIR. - Call
GET /v1/skillsor the MCPlist_skillstool. - Check the startup logs for the discovered skill list.
Enable File Attachments in brAInstorm Settings and use absolute paths for files or filePath.
This software is for personal, non-commercial use only. See LICENSE for details.
This project is made for the community. Any contributions are welcome.
I put time into evolving it as I needed the tools and I'm sure you will need more features - well add them and let's evolve this together.
Original idea came from Zen4-bit. He didn't want to built out the modular provider architecture so we forked and reworked it. But let's not keep reforking - lets work on this together!
Current models and features by MindFlowGo
Contributors will be tracked in CONTRIBUTORS.md.

