MCP server for the Lightbulb Partners Agents platform — Claude Code, Codex, and Cursor integration
Project description
Lightbulb MCP
MCP server and helper CLI for the Lightbulb Partners Agents platform. Connect your Claude Code, Codex, or Cursor account to your Lightbulb workspace — domain agents, code workspaces, connectors, document/page builders, voice, AutoCompany (AOC), and more.
For the MCP host integration details (authentication, tool surface, troubleshooting), see MCP.md.
The Python SDK (
LightbulbClient,AsyncLightbulbClient, etc.) ships in this package as preview / unstable internals. The supported product right now is the MCP server and helper CLI — direct Python API consumers should expect changes between minor versions.
Install
pip install lightbulb-mcp
Console scripts:
lightbulb-mcp— runs the MCP server over stdio for Claude Code / Codex / Cursor (see MCP.md).lightbulb— helper CLI for status, login, and one-shot platform commands.
Quick start — wire up Claude Code
pip install lightbulb-mcp
lightbulb setup
lightbulb setup is an interactive wizard: device-flow login (browser handles MFA), probe /api/users/me, then merge a lightbulb MCP server entry into Claude Code (.mcp.json / .claude.json), Codex (~/.codex/config.toml), or Cursor (~/.cursor/mcp.json). Existing servers are preserved; backups use .bak.
Flags: --target codex, --yes / --no-write, --skip-login, --url.
Manual .mcp.json
If you'd rather wire Claude Code by hand:
{
"mcpServers": {
"lightbulb": {
"command": "lightbulb-mcp",
"env": {
"LIGHTBULB_URL": "https://agents.lightbulbpartners.com"
}
}
}
}
The MCP server resolves credentials from a cached device-flow token (~/.lightbulb/tokens/) by default, or from env (LIGHTBULB_JWT + LIGHTBULB_TENANT_ID, etc.). Full auth precedence in MCP.md.
CLI
Running lightbulb with no arguments prints status: platform URL, cached token hint, detected Claude/Codex/Cursor configs, and next steps.
lightbulb # status (default)
lightbulb setup # guided auth + MCP config merge
lightbulb whoami
lightbulb dispatch finance --action chat --message "Quick AR aging summary"
lightbulb search-documents "quarterly revenue" --top-k 5
lightbulb approvals list
Environment variables (CLI & MCP)
| Variable | Purpose |
|---|---|
LIGHTBULB_URL |
Platform base URL (default https://agents.lightbulbpartners.com) |
LIGHTBULB_JWT |
Bearer JWT |
LIGHTBULB_TENANT_ID |
Required with JWT |
LIGHTBULB_COMPANY_ID |
Optional company scope |
LIGHTBULB_EMAIL / LIGHTBULB_PASSWORD |
Legacy password login |
LIGHTBULB_API_KEY / LIGHTBULB_USER_ID |
Localhost integration bootstrap |
Python API (preview)
The package also ships a Python client used internally by the MCP server. Not yet a stable product surface — expect breaking changes between minor versions. Pin exactly if you depend on it.
from lightbulb import LightbulbClient, device_login
BASE = "https://agents.lightbulbpartners.com"
# Recommended for humans: OAuth2-style device flow (browser handles MFA)
auth, _expires = device_login(BASE, client_id="my-app")
client = LightbulbClient(BASE, auth=auth)
print(client.whoami())
result = client.dispatch("finance", action="chat", message="Summarize cash this week")
print(result.reply)
Email / password and 2FA
from lightbulb import login, complete_2fa_login, TwoFactorRequired
try:
auth = login(BASE, "you@company.com", "secret")
except TwoFactorRequired as exc:
code = input("Authenticator code: ").strip()
auth = complete_2fa_login(exc.base_url, exc.email, code)
client = LightbulbClient(BASE, auth=auth)
For MFA accounts, device login is usually simpler.
Async
from lightbulb import AsyncLightbulbClient, JwtAuth
async def main():
auth = JwtAuth(token="...", tenant_id="...", company_id=None)
async with AsyncLightbulbClient(BASE, auth=auth) as client:
me = await client.whoami()
Coverage in AsyncLightbulbClient is curated for hot paths; use LightbulbClient for full surface area.
Refreshing expired JWTs
Pass auth_refresh and call refresh_auth() after an AuthenticationError, then retry:
from lightbulb import LightbulbClient, AuthenticationError
from lightbulb.auth import device_login
def refresh():
auth, _ = device_login(BASE, client_id="my-worker")
return auth
client = LightbulbClient(BASE, auth=initial_auth, auth_refresh=refresh)
try:
client.dispatch("crm", action="chat", message="hello")
except AuthenticationError:
if client.refresh_auth():
client.dispatch("crm", action="chat", message="hello")
Same pattern on AsyncLightbulbClient with await client.refresh_auth().
Exceptions (lightbulb.errors)
HTTP failures from LightbulbClient and AsyncLightbulbClient raise LightbulbError subclasses (not raw httpx.HTTPStatusError):
| Type | Typical status |
|---|---|
AuthenticationError |
401 |
PermissionDenied |
403 |
NotFoundError |
404 |
ValidationError |
400 / 422 (also subclasses ValueError) |
RateLimitedError |
429 (retry_after when present) |
ServerError |
5xx |
Helpers: from_response, wrap_http_error, raise_if_error (used internally; safe to call on any httpx.Response).
Messages avoid leaking raw response bodies; structured JSON fields like message / error are capped.
Deep wrappers (XeroAgentClient, connector clients) use the same HTTP stack and raise the same types.
Typed integrations
- Stripe:
StripeOrchestratorClient,StripeWorkflow - Xero:
XeroAgentClient,XeroPlaybook - Connectors:
SlackClient,JiraClient,BambooHRClient,GreenhouseClient,MondayClient(thininvoke_tool/ HR-live helpers)
Security posture
- HTTPS enforced for non-local hosts by default (
enforce_https=Falseonly for dev). - Path segments and risky inputs validated (
validatorsmodule); SSO / device-flow URLs validated before opening a browser. - Token cache: atomic write, restrictive permissions, symlink and ownership checks.
lightbulb setup: atomic config writes, safe TOML escaping for Codex, backups chmod-restricted.
Regression tests live in tests/test_security.py (audit IDs in docstrings).
Types (PEP 561)
The wheel ships py.typed for Pyright/mypy consumers.
Version history
0.5.1
- Critical: fix
invoke_toolwire shape. Earlier versions sent{tool, arguments}to/api/tools/invoke; Spring'sInvokeToolRequestDTO expects{toolName, inputs, tenantId, companyId}. The 565 generated connector-op tools in 0.5.0 all failed silently against this mismatch. Sync + async clients fixed; regression tests added intests/test_client.py::TestInvokeToolandtests/test_async_client.py::TestAsyncInvokeTool. - Security: collapse inline
is_localchecks inclient.py/async_client.pyonto canonicalvalidators.is_local_url(now covers IPv6::1); add UUID validation inselect_companyMCP tool; assertJwtAuthinsave_cached_token; clarifybackbone_executeruns server-side. - Added a draft Flyway migration at
springboot-server/src/main/resources/db/migration/V1441__seed_connector_tool_keys.sql(537 rows). Platform team applies; once live, the 565 generated connector tools become reachable end-to-end.
0.5.0
- Massive tool surface expansion (~1000 tools, up from 156). Every domain agent action and every registered platform connector op now has a direct MCP tool — Claude Code / Codex / Cursor see them in the picker without indirection.
- 284 domain action tools auto-generated from
agent-workers/agents/domain_registry.py: finance, intuit, crm, legal, engineering, content, it_ops, commerce, product, hr, coding, document_intelligence, solver, customer_success, procurement, gtm, grc, smarthome. - 565 connector op tools auto-generated from the platform's tool registry: deep coverage of Xero (127), Clio (63), GitHub (58), Slack (57), Commerce (51), QuickBooks (44), Smokeball (39), Monday (31), Jira (27), Notion (21), Shopify (18), Stripe, Square, Salesforce, Microsoft, Gmail, and more.
- Codegen lives at
scripts/generate_mcp_tools.py. Re-run after platform changes. - Hand-written 156 tools kept as-is; no API changes there.
0.4.0
- Renamed package to
lightbulb-mcp; MCP deps (mcp,pydantic,pydantic-settings) are now hard dependencies. Python API ships as preview/unstable internals. - Defaults updated to production:
LIGHTBULB_URLdefaults tohttps://agents.lightbulbpartners.com. CLI / MCP server / setup wizard all use the plural production hostname. - Security hardening: redirect URL validation, token/config atomic writes, TOML injection fixes, SSE size limits, localhost detection via hostname parsing, preview proxy header merging.
errorsmodule andraise_if_error: platform HTTP errors map toLightbulbErrorsubclasses from the sync/async clients and Xero wrapper.refresh_auth/ optionalauth_refreshcallback; setup wizard retries once on stale cached token.py.typed+ README/MCP docs consolidation.
0.3.0
- 2FA (
TwoFactorRequired,complete_2fa_login), SSO URL helper, SSE streaming for code/page/document builders, code workspace tools & preview, marketing connector setup methods, typed connector clients,AsyncLightbulbClient,lightbulbCLI, guidedlightbulb setup/lightbulb status,lightbulb-mcpentry point.
0.2.0
- Large MCP tool expansion, domain registry alignment,
XeroAgentClient, expanded platform surface in MCP.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lightbulb_mcp-0.5.1.tar.gz.
File metadata
- Download URL: lightbulb_mcp-0.5.1.tar.gz
- Upload date:
- Size: 151.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5690c4fdddb979346c361cd1c431140ea4bf93fe5f594ced399457f7567e4a67
|
|
| MD5 |
6aa3ca377cdaf59f9f6ffb8db00f875c
|
|
| BLAKE2b-256 |
ced211e733302cfbc57e7585e4fe186b7f1e04d982a9ff028f424cec2fa4caee
|
File details
Details for the file lightbulb_mcp-0.5.1-py3-none-any.whl.
File metadata
- Download URL: lightbulb_mcp-0.5.1-py3-none-any.whl
- Upload date:
- Size: 111.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5eaed4d14397ee5bf0b651c7ef133b633a84eaa6394a0cce18652fcb04313620
|
|
| MD5 |
45a6d820f7f675d6a58863f44928fb7d
|
|
| BLAKE2b-256 |
39f40497af0aedbd1b323f11f042c784f75fd13f801b95e260261871a87497d4
|