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
9 changes: 0 additions & 9 deletions .changeset/agent-replace-grant-gate.md

This file was deleted.

27 changes: 0 additions & 27 deletions .changeset/broker-mcp-client-manager.md

This file was deleted.

24 changes: 0 additions & 24 deletions .changeset/m5-schema-train.md

This file was deleted.

49 changes: 0 additions & 49 deletions .changeset/m5-trust-layer.md

This file was deleted.

9 changes: 9 additions & 0 deletions conformance/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# @boardstate/conformance

## 0.1.11

### Patch Changes

- Updated dependencies [[`c895241`](https://github.com/100yenadmin/boardstate/commit/c8952418b9fd2b64a2a014927476502899d07938), [`b05c7cd`](https://github.com/100yenadmin/boardstate/commit/b05c7cd5c50d10b83374bad0dde92c128cd00470), [`a0feba7`](https://github.com/100yenadmin/boardstate/commit/a0feba7dc3939c577387c0509aa3fb1ba710e477)]:
- @boardstate/server@1.2.0
- @boardstate/schema@1.2.0
- @boardstate/core@1.2.0

## 0.1.10

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion conformance/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@boardstate/conformance",
"version": "0.1.10",
"version": "0.1.11",
"description": "The Boardstate transport conformance suite: run it against your own host implementation",
"type": "module",
"license": "MIT",
Expand Down
12 changes: 12 additions & 0 deletions examples/app/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
# boardstate-example-app

## 0.0.12

### Patch Changes

- Updated dependencies [[`c895241`](https://github.com/100yenadmin/boardstate/commit/c8952418b9fd2b64a2a014927476502899d07938), [`b05c7cd`](https://github.com/100yenadmin/boardstate/commit/b05c7cd5c50d10b83374bad0dde92c128cd00470), [`a0feba7`](https://github.com/100yenadmin/boardstate/commit/a0feba7dc3939c577387c0509aa3fb1ba710e477)]:
- @boardstate/server@1.2.0
- @boardstate/schema@1.2.0
- @boardstate/core@1.2.0
- @boardstate/lit@0.4.0
- @boardstate/host@1.2.0
- @boardstate/agent@0.2.8

## 0.0.11

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion examples/app/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "boardstate-example-app",
"private": true,
"version": "0.0.11",
"version": "0.0.12",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
11 changes: 11 additions & 0 deletions examples/standalone/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# boardstate-example-standalone

## 0.0.12

### Patch Changes

- Updated dependencies [[`c895241`](https://github.com/100yenadmin/boardstate/commit/c8952418b9fd2b64a2a014927476502899d07938), [`b05c7cd`](https://github.com/100yenadmin/boardstate/commit/b05c7cd5c50d10b83374bad0dde92c128cd00470), [`a0feba7`](https://github.com/100yenadmin/boardstate/commit/a0feba7dc3939c577387c0509aa3fb1ba710e477)]:
- @boardstate/server@1.2.0
- @boardstate/schema@1.2.0
- @boardstate/core@1.2.0
- @boardstate/lit@0.4.0
- @boardstate/host@1.2.0

## 0.0.11

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion examples/standalone/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "boardstate-example-standalone",
"private": true,
"version": "0.0.11",
"version": "0.0.12",
"type": "module",
"scripts": {
"dev": "vite",
Expand Down
8 changes: 8 additions & 0 deletions packages/agent/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# @boardstate/agent

## 0.2.8

### Patch Changes

- Updated dependencies [[`c895241`](https://github.com/100yenadmin/boardstate/commit/c8952418b9fd2b64a2a014927476502899d07938), [`b05c7cd`](https://github.com/100yenadmin/boardstate/commit/b05c7cd5c50d10b83374bad0dde92c128cd00470), [`a0feba7`](https://github.com/100yenadmin/boardstate/commit/a0feba7dc3939c577387c0509aa3fb1ba710e477)]:
- @boardstate/server@1.2.0
- @boardstate/schema@1.2.0

## 0.2.7

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/agent/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@boardstate/agent",
"version": "0.2.7",
"version": "0.2.8",
"description": "The provider loop that turns any LLM into a Boardstate dashboard-building agent",
"type": "module",
"license": "MIT",
Expand Down
75 changes: 75 additions & 0 deletions packages/broker/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# @boardstate/broker

## 0.2.0

### Minor Changes

- [#50](https://github.com/100yenadmin/boardstate/pull/50) [`e96a33f`](https://github.com/100yenadmin/boardstate/commit/e96a33fd2b3f06f6c610650a27074d4561154428) Thanks [@100yenadmin](https://github.com/100yenadmin)! - New package `@boardstate/broker` — the MCP CLIENT manager (M5a-1, epic [#37](https://github.com/100yenadmin/boardstate/issues/37)). It connects
outward to the external MCP servers an operator declares in a `boardstate.connectors.json`
config, discovers their tools into a namespaced `ToolManifest`, and calls them behind a
narrow API the host/server layers consume.

- **Config is operator-authored only**: `loadConnectorsConfig(path)` + a programmatic
`new McpBroker(config)`. A connector name not in the config is inert. `env` values are
process-env var NAMES (references), never literal secrets — validated up front and never
echoed into errors or logs.
- **Transports**: `StdioClientTransport` for local servers, `StreamableHTTPClientTransport`
with SSE fallback for remotes. Lazy connect on first use, warm/pooled clients, capped
exponential-backoff reconnect, clean close.
- **`listTools()` → `ToolManifest`**: `connector:tool` ids AND provider-safe
`connector__tool` names (both inside a 64-char budget, collisions fail loud), input
schemas, `readOnlyHint` honored (absent ⇒ treated as a mutation — fail-safe), and a
stable manifest hash over sorted (id + canonical input-schema) pairs — the anti-rug-pull
snapshot the grant lifecycle (M5b-2) pins to.
- **`callTool(id, args, { timeout })`**: resolves the client, strips the namespace,
enforces a hard timeout, and normalizes `isError: true` results into a typed
`BrokerToolError`.

Depends only on `@modelcontextprotocol/sdk` and `@boardstate/server` (types only). Ships
an in-repo fake MCP server fixture (stdio child + in-process HTTP) so CI needs no network.

- [#53](https://github.com/100yenadmin/boardstate/pull/53) [`a0feba7`](https://github.com/100yenadmin/boardstate/commit/a0feba7dc3939c577387c0509aa3fb1ba710e477) Thanks [@100yenadmin](https://github.com/100yenadmin)! - M5 trust layer (M5b-2 + M5b-3, epic [#37](https://github.com/100yenadmin/boardstate/issues/37)): the grant lifecycle for external MCP tools
and the server-enforced pending-action engine — closes [#40](https://github.com/100yenadmin/boardstate/issues/40) and [#41](https://github.com/100yenadmin/boardstate/issues/41).

**Grant lifecycle + both-direction anti-rug-pull (SPEC §17.1, [#40](https://github.com/100yenadmin/boardstate/issues/40))**

- `installBrokerActions` (`@boardstate/server/node`) registers each configured connector's
discovered tools as a `requested` tools-only grant (explicit `methods: []`/`streams: []`,
a `tools` id snapshot, and a subset-scoped `toolsHash`), mirroring `installConnector`'s
request-on-install. An already-`granted` grant survives a restart; real manifest drift is
caught at invoke time.
- Server-side anti-rug-pull: on every granted-tool call the live manifest hash is compared
to the stored `toolsHash`; a mismatch re-pends the grant to `requested` BEFORE any call
succeeds.
- Agent-side anti-rug-pull: `reconcileReplaceApproval` now forces a `granted` grant back to
`requested` on ANY `tools`/`toolsHash` mutation (not just status flips) — closing the
red-team hole where an agent could append a tool id to a granted grant through
`workspace.replace` or import.
- Partial grants: `dashboard.capability.approve` gains an optional `tools` subset; the
decision applies to the intersection with the requested set and the granted subset gets
its OWN hash (`McpBroker.hashToolSubset`, injected as `capabilityToolsHash`).
- Approvals console: capability rows surface their requested tool ids for per-tool selection
(approve-all = one click); the core transform + lit renderer + strings render it.

**Pending-action engine (SPEC §18, [#41](https://github.com/100yenadmin/boardstate/issues/41))**

- In-memory pending-action registry. `dashboard.action.invoke` AND-gates a call (granted at
invoke time + connector configured + hash unchanged): a `readOnly` granted tool executes
directly; a mutation parks as a `PendingActionRecord` and returns `{ pending: true, id,
expiresAt }`. `dashboard.action.confirm`/`dashboard.action.deny` are operator-only
(`OPERATOR_ONLY_METHODS`) — a networked client can directly execute only `readOnly` tools.
- TTL expiry (~5 min), single-shot terminal states (a replay of a terminal id errors),
server-side invoke rate limiting (prompt-gate discipline), an audit entry per invoke +
decision, and lifecycle broadcasts on `dashboard.action.changed`.
- `confirmAndExecute(id)` is exposed as the awaitable an agent-mediated call (M5c-1) blocks
on: it resolves with the tool result on confirm and rejects on deny/expiry.

The engine consumes the broker through the narrow structural `ActionBroker` interface —
`@boardstate/broker` never enters `@boardstate/server` (no dependency cycle); the real
`McpBroker` fits it structurally. SPEC §17.1/§18 normative text filled where the schema
train ([#39](https://github.com/100yenadmin/boardstate/issues/39)) left implementation-pending markers.

### Patch Changes

- Updated dependencies [[`c895241`](https://github.com/100yenadmin/boardstate/commit/c8952418b9fd2b64a2a014927476502899d07938), [`a0feba7`](https://github.com/100yenadmin/boardstate/commit/a0feba7dc3939c577387c0509aa3fb1ba710e477)]:
- @boardstate/server@1.2.0
2 changes: 1 addition & 1 deletion packages/broker/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@boardstate/broker",
"version": "0.1.0",
"version": "0.2.0",
"description": "The MCP client manager: connect outward to external MCP servers, discover their tools, and call them behind a narrow, provider-safe API",
"type": "module",
"license": "MIT",
Expand Down
Loading