Skip to main content
Glama
README.md
# bloomgrowth-mcp

**Bloom Growth** MCP server — exposes the Bloom Growth REST API (EOS/Traction-style meetings, rocks, scorecards, to-dos, and org-chart management) as MCP tools.

> **Naming note:** app.mspbots.ai calls this integration **"Bloom Growth"** (`sys_integration.subject_code = BLOOMGROWTH`). MSPbots' own integration only calls one endpoint (`GET /api/v1/scorecard/user/mine`). Per a 2026-08-04 scope decision, this build was trimmed from an original full-API 123-tool build down to **10 tools** covering that endpoint's category (`scorecard`) plus `measurables` (the resource scorecards are a computed view over) — see **Tool List** below for the exact rationale.

## Overview

This server implements the [Model Context Protocol](https://modelcontextprotocol.io/) (Streamable HTTP/SSE transport) and wraps the [Bloom Growth REST API v1](https://dev-api.bloomgrowth.com/swagger/index.html) — **10 tools** across 2 files / 2 API tag categories (`scorecard`, `measurables`), including write operations (create/update). It follows the MSPbots **Vendor MCP Service SOP**: stateless, no stored credentials, per-request header authentication.

The underlying API authenticates via **OAuth2 Resource-Owner-Password-Credentials grant**: `POST https://app.bloomgrowth.com/Token` with form-urlencoded body `grant_type=password&userName=<email>&password=<password>`, returning a bearer access token valid for ~2 weeks. This server does not perform that token exchange itself — it receives an already-obtained bearer access token per request; the caller (Agent Platform / upstream gateway) obtains and refreshes the token from the account's email/password, and only the resulting token reaches this server (same pattern as bizratings-mcp, connectwise-asio-mcp, and acronis-mcp in this MCP fleet).

## Quick Start

### Docker (recommended)

```bash
docker compose up --build
```

The server starts on `http://localhost:8080`.

### Local (uv)

```bash
uv sync
python -m bloomgrowth_mcp
```

## Health Check

```bash
curl http://localhost:8080/health
# {"status": "ok"}
```

No token is required for the health endpoint.

## 授权参数说明 (Authentication)

Every request to `/mcp` must include the following HTTP header:

| Header | 类型 | 是否必填 | 默认值 | 枚举值 | 字段描述 | Example |
|---|---|---|---|---|---|---|
| `X-BloomGrowth-Token` | string | 必填 | 无 | 无(自由文本) | OAuth2 bearer access token,由调用方(Agent Platform / 上游网关)通过 `POST https://app.bloomgrowth.com/Token`(form-urlencoded,`grant_type=password&userName=<email>&password=<password>`)预先换取,有效期约 2 周,过期后需重新换取。本服务从不接触 email/password,只转发已获取的 token。 | `X-BloomGrowth-Token: <access_token>` |

Missing the header returns `401 Unauthorized`.

## Environment Variables

| Variable | Default | Description |
|---|---|---|
| `MCP_HTTP_PORT` | `8080` | Listening port |
| `MCP_HTTP_HOST` | `0.0.0.0` | Listening host |
| `BLOOMGROWTH_BASE_URL` | `https://app.bloomgrowth.com` | Bloom Growth API base URL |

## MCP Endpoint

```
POST http://localhost:8080/mcp
```

Connect your MCP client with:
- Transport: `http` (Streamable HTTP / SSE)
- Headers: `X-BloomGrowth-Token: <access_token>` (required)

## Tool List

**10 tools**, trimmed down from an original 123-tool full-API build (2026-08-04). MSPbots' own integration only calls one endpoint (`GET /api/v1/scorecard/user/mine` -> `bloomgrowth_get_my_scorecard`); per the "actual usage + same-category core CRUD" scope decision, this build keeps the `scorecard` category plus `measurables` (the underlying resource a scorecard is a computed view over — Bloom Growth scorecards are tables of measurables and their weekly values, so there is no separate "scorecard" CRUD to speak of). Everything else from the original 123-tool build (L10 Meetings, Headlines, Issues, Milestones, Process, Rocks, Role, Seats, Teams, Todos, Users, Misc — 12 categories, ~113 tools) was removed as unused by MSPbots and out of scope for this server's purpose. If a removed category is needed later, the vendor's own OpenAPI/Swagger spec (linked below) still documents its exact operations and they can be re-added the same way the kept tools were generated.

### Measurables (7)

| Tool | 功能 | 参数 |
|---|---|---|
| `bloomgrowth_create_measurable` | 创建计分卡指标 | `name?`, `direction?`, `target?`, `unit_type?`, `accountable_user_id?` |
| `bloomgrowth_get_my_measurables` | 查我的 measurables | `include_origin?` |
| `bloomgrowth_get_user_measurables` | 查指定用户的 measurables | `user_id`, `include_origin?` |
| `bloomgrowth_update_measurable` | 更新指标定义 | `measurable_id`, `name?`, `direction?`, `target?`, `unit_type?`, `alt_target?` |
| `bloomgrowth_get_measurable` | 查指标详情 | `measurable_id`, `include_origin?` |
| `bloomgrowth_get_measurable_scores` | 查指标的每周得分 | `measurable_id`, `include_origin?` |
| `bloomgrowth_set_measurable_week_value` | 设置指标某周的分值 | `measurable_id`, `week_id`, `value?` |

### Scorecard (3)

| Tool | 功能 | 参数 |
|---|---|---|
| `bloomgrowth_get_meeting_scorecard` | 查会议计分卡 | `meeting_id` |
| `bloomgrowth_get_my_scorecard` | 查我的计分卡 | 无(MSPbots 现有集成实际使用的唯一接口) |
| `bloomgrowth_get_user_scorecard` | 查指定用户的计分卡 | `user_id` |

## 测试示例 (Test Example)

Get the calling user's scorecard (matches MSPbots' existing integration usage):

```json
{
  "method": "tools/call",
  "params": { "name": "bloomgrowth_get_my_scorecard", "arguments": {} }
}
```

Equivalent `curl` against the running server (streamable HTTP MCP endpoint):

```bash
curl -X POST http://localhost:8080/mcp \
  -H "Content-Type: application/json" \
  -H "X-BloomGrowth-Token: <access_token>" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": { "name": "bloomgrowth_get_my_scorecard", "arguments": {} }
  }'
```

A parameterized call:

```json
{
  "method": "tools/call",
  "params": {
    "name": "bloomgrowth_get_rock",
    "arguments": { "rock_id": 12345 }
  }
}
```

## API Reference

- Swagger UI: https://dev-api.bloomgrowth.com/swagger/index.html
- OpenAPI spec (v1): https://dev-api.bloomgrowth.com/swagger/v1/swagger.json
- Token endpoint guide: shown on the Swagger UI page ("Generating a Token")

## Known Gaps / Implementation Notes

- **Trimmed from 123 to 10 tools on 2026-08-04.** The original build covered
  the full public API across 18 tag categories per an earlier scope
  decision. A later scope decision cut this back to MSPbots' actually-used
  category (`scorecard`) plus `measurables` — see the Naming note and Tool
  List above for the exact rationale. If a removed category (L10 Meetings,
  Headlines, Issues, Milestones, Process, Rocks, Role, Seats, Teams, Todos,
  Users, Misc — ~113 tools total) is needed later, the vendor's OpenAPI/
  Swagger spec (linked below) still documents its exact operations and they
  can be re-added the same way the kept tools were generated.
- Not yet tested against a live Bloom Growth account — only protocol-level
  verification (health check, 401 on missing token, `tools/list` returning
  all 10 tools, and JSON-schema validation) has been done so far.
- `bloomgrowth_create_measurable` and `bloomgrowth_update_measurable` expose
  their request bodies as named optional parameters rather than a generic
  `body: dict`, since the Bloom Growth schemas are shallow (no deep
  nesting) — this differs from the `body`/`extra_params` dict pattern used
  in larger/deeper-nested vendor APIs elsewhere in this MCP fleet.
- Endpoints whose exact request/response shape wasn't fully described by the OpenAPI spec (a few return simple 200 with no documented body) are implemented to match the spec's declared parameters; verify against a real account before relying on edge-case behavior.