@seldonframe/mcp 1.58.0 → 1.59.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -112
- package/package.json +59 -59
- package/src/tools.js +81 -9
- package/src/welcome.js +51 -13
package/README.md
CHANGED
|
@@ -1,112 +1,113 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
-
|
|
51
|
-
-
|
|
52
|
-
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
- `
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
**
|
|
90
|
-
**
|
|
91
|
-
**
|
|
92
|
-
**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
1
|
+
<!-- mcp-name: io.github.seldonframe/mcp -->
|
|
2
|
+
# @seldonframe/mcp
|
|
3
|
+
|
|
4
|
+
Official SeldonFrame MCP server for Claude Code and Claude Desktop.
|
|
5
|
+
|
|
6
|
+
**One command, one real workspace.** The first time you run it, no API key is needed. Say `create_workspace({ name: "Dental Clinic Laval" })` and the server mints a real hosted workspace on `dental-clinic-laval.app.seldonframe.com` — with CRM, Cal.diy booking, Formbricks intake, and Brain v2 pre-installed — and returns live URLs. No signup wall, no "guest mode", no claim step.
|
|
7
|
+
|
|
8
|
+
## 60-second quickstart
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
# 1. From the repo root
|
|
12
|
+
cd skills/mcp-server && npm install
|
|
13
|
+
|
|
14
|
+
# 2. Register with Claude Code — no env vars needed
|
|
15
|
+
claude mcp add seldonframe -s user -- node "$(pwd)/src/index.js"
|
|
16
|
+
|
|
17
|
+
# 3. In Claude Code, just ask:
|
|
18
|
+
# create_workspace({ name: "My Business OS" })
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
That call returns something like:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"workspace": { "id": "wsp_…", "slug": "my-business-os", "tier": "free" },
|
|
26
|
+
"urls": {
|
|
27
|
+
"dashboard": "https://my-business-os.app.seldonframe.com",
|
|
28
|
+
"book": "https://my-business-os.app.seldonframe.com/book",
|
|
29
|
+
"intake": "https://my-business-os.app.seldonframe.com/intake"
|
|
30
|
+
},
|
|
31
|
+
"installed": ["crm", "caldiy-booking", "formbricks-intake", "brain-v2"],
|
|
32
|
+
"next": [ "…" ]
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Every subsequent tool response includes a `next:` array — follow the rails.
|
|
37
|
+
|
|
38
|
+
## How auth works
|
|
39
|
+
|
|
40
|
+
| Situation | What happens |
|
|
41
|
+
|---|---|
|
|
42
|
+
| First ever call | `create_workspace` POSTs with no auth. Server mints a workspace + bearer token. MCP stores the token in `~/.seldonframe/device.json`. |
|
|
43
|
+
| Subsequent calls | MCP sends `Authorization: Bearer <workspace token>` automatically. |
|
|
44
|
+
| `SELDONFRAME_API_KEY` set | Takes precedence over device tokens. Unlocks Pro capabilities. |
|
|
45
|
+
|
|
46
|
+
You never have to juggle modes. The first workspace is free forever.
|
|
47
|
+
|
|
48
|
+
## When you need `SELDONFRAME_API_KEY`
|
|
49
|
+
|
|
50
|
+
- Adding a **second workspace**
|
|
51
|
+
- Connecting a **custom domain**
|
|
52
|
+
- **Full Brain v2** intelligence (heuristic Brain is always free)
|
|
53
|
+
- Publishing, exporting, org-scoped secret rotation
|
|
54
|
+
|
|
55
|
+
Get one at <https://app.seldonframe.com/settings/api>, then:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
export SELDONFRAME_API_KEY=sk-…
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Restart the MCP server. Your existing workspaces continue to work untouched.
|
|
62
|
+
|
|
63
|
+
## Install via plugin manifest (one-shot)
|
|
64
|
+
|
|
65
|
+
The repo ships a `.claude-plugin/plugin.json` at the root. From inside Claude Code:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
/plugin install <path-to-repo>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Install via npm
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
claude mcp add seldonframe -- npx -y @seldonframe/mcp
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
This is the canonical install command surfaced on the marketing site,
|
|
78
|
+
the `/docs/quickstart` page, and the repo README. It uses `npx -y`
|
|
79
|
+
so users never have to globally install anything; the latest version
|
|
80
|
+
is fetched and run on demand.
|
|
81
|
+
|
|
82
|
+
## Environment
|
|
83
|
+
|
|
84
|
+
- `SELDONFRAME_API_KEY` *(optional)* — Enables Pro capabilities (second workspace, custom domains, full Brain v2).
|
|
85
|
+
- `SELDONFRAME_API_BASE` *(optional)* — Override the API base URL. Defaults to `https://app.seldonframe.com/api/v1`.
|
|
86
|
+
|
|
87
|
+
## Tools
|
|
88
|
+
|
|
89
|
+
**Workspace:** `create_workspace`, `list_workspaces`, `switch_workspace`, `clone_workspace`, `link_workspace_owner`, `get_workspace_snapshot`.
|
|
90
|
+
**Blocks:** `install_caldiy_booking`, `install_formbricks_intake`, `install_vertical_pack`.
|
|
91
|
+
**Customize (typed, no backend LLM):** `update_landing_content`, `customize_intake_form`, `configure_booking`, `update_theme`.
|
|
92
|
+
**Soul:** `fetch_source_for_soul`, `submit_soul`.
|
|
93
|
+
**Ops:** `list_automations`, `connect_custom_domain`, `export_agent`, `store_secret`, `list_secrets`, `rotate_secret`.
|
|
94
|
+
|
|
95
|
+
### Architecture: zero backend LLM cost
|
|
96
|
+
|
|
97
|
+
Natural-language reasoning happens in the MCP session (Claude Code on the user's side). The backend only accepts **structured** commands and applies them deterministically. There is no `seldon_it` endpoint that parses prompts server-side; the old `query_brain` is replaced by `get_workspace_snapshot`, which returns raw state for Claude to reason over. Seldon spends $0 on LLM for the free tier — the user's Claude Code subscription is the reasoning engine.
|
|
98
|
+
|
|
99
|
+
### Soul compilation (zero cost to Seldon)
|
|
100
|
+
|
|
101
|
+
Soul compilation runs in **your** Claude Code session, not on Seldon's servers:
|
|
102
|
+
|
|
103
|
+
1. `fetch_source_for_soul({ url })` — returns up to 256KB of normalized text.
|
|
104
|
+
2. You (the agent) extract a structured Soul object.
|
|
105
|
+
3. `submit_soul({ soul })` — persists it to the workspace.
|
|
106
|
+
|
|
107
|
+
## Troubleshooting
|
|
108
|
+
|
|
109
|
+
**`Seldon API 401`** — Your `SELDONFRAME_API_KEY` is invalid or expired. Regenerate at <https://app.seldonframe.com/settings/api>, or unset the env var to fall back to your device token.
|
|
110
|
+
|
|
111
|
+
**`Seldon API 402`** — You tried a Pro capability without a key. Set `SELDONFRAME_API_KEY` and restart.
|
|
112
|
+
|
|
113
|
+
**Want to reset device state?** Delete `~/.seldonframe/device.json`. Your hosted workspaces stay live at `app.seldonframe.com`; only the local tokens are cleared.
|
package/package.json
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@seldonframe/mcp",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"mcpName": "io.github.seldonframe/
|
|
5
|
-
"description": "Open-source GoHighLevel alternative for agencies. 146+ MCP tools that let Claude Code spin up white-labeled client workspaces — CRM, booking, intake forms, landing pages, AI chatbot, and pre-wired agent archetypes (speed-to-lead, missed-call-text-back, review-requester) — in minutes. AGPL-3.0.",
|
|
6
|
-
"license": "AGPL-3.0-or-later",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"bin": {
|
|
9
|
-
"seldonframe-mcp": "src/index.js"
|
|
10
|
-
},
|
|
11
|
-
"files": [
|
|
12
|
-
"src",
|
|
13
|
-
"README.md"
|
|
14
|
-
],
|
|
15
|
-
"engines": {
|
|
16
|
-
"node": ">=18"
|
|
17
|
-
},
|
|
18
|
-
"scripts": {
|
|
19
|
-
"start": "node src/index.js",
|
|
20
|
-
"check:syntax": "node --check --input-type=module < src/index.js && node --check --input-type=module < src/client.js && node --check --input-type=module < src/tools.js && node --check --input-type=module < src/welcome.js",
|
|
21
|
-
"prepublishOnly": "npm run check:syntax"
|
|
22
|
-
},
|
|
23
|
-
"dependencies": {
|
|
24
|
-
"@modelcontextprotocol/sdk": "^1.0.4"
|
|
25
|
-
},
|
|
26
|
-
"keywords": [
|
|
27
|
-
"mcp",
|
|
28
|
-
"model-context-protocol",
|
|
29
|
-
"seldonframe",
|
|
30
|
-
"ai",
|
|
31
|
-
"agents",
|
|
32
|
-
"business-os",
|
|
33
|
-
"claude-code",
|
|
34
|
-
"crm",
|
|
35
|
-
"gohighlevel-alternative",
|
|
36
|
-
"gohighlevel",
|
|
37
|
-
"agency",
|
|
38
|
-
"whitelabel",
|
|
39
|
-
"partner-agency",
|
|
40
|
-
"booking",
|
|
41
|
-
"intake-form",
|
|
42
|
-
"landing-page",
|
|
43
|
-
"local-service-business",
|
|
44
|
-
"sms",
|
|
45
|
-
"twilio",
|
|
46
|
-
"ai-receptionist",
|
|
47
|
-
"ai-chatbot",
|
|
48
|
-
"missed-call"
|
|
49
|
-
],
|
|
50
|
-
"homepage": "https://seldonframe.com",
|
|
51
|
-
"repository": {
|
|
52
|
-
"type": "git",
|
|
53
|
-
"url": "git+https://github.com/seldonframe/seldonframe.git",
|
|
54
|
-
"directory": "skills/mcp-server"
|
|
55
|
-
},
|
|
56
|
-
"publishConfig": {
|
|
57
|
-
"access": "public"
|
|
58
|
-
}
|
|
59
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@seldonframe/mcp",
|
|
3
|
+
"version": "1.59.1",
|
|
4
|
+
"mcpName": "io.github.seldonframe/mcp",
|
|
5
|
+
"description": "Open-source GoHighLevel alternative for agencies. 146+ MCP tools that let Claude Code spin up white-labeled client workspaces — CRM, booking, intake forms, landing pages, AI chatbot, and pre-wired agent archetypes (speed-to-lead, missed-call-text-back, review-requester) — in minutes. AGPL-3.0.",
|
|
6
|
+
"license": "AGPL-3.0-or-later",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"seldonframe-mcp": "src/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"src",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"start": "node src/index.js",
|
|
20
|
+
"check:syntax": "node --check --input-type=module < src/index.js && node --check --input-type=module < src/client.js && node --check --input-type=module < src/tools.js && node --check --input-type=module < src/welcome.js",
|
|
21
|
+
"prepublishOnly": "npm run check:syntax"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@modelcontextprotocol/sdk": "^1.0.4"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
29
|
+
"seldonframe",
|
|
30
|
+
"ai",
|
|
31
|
+
"agents",
|
|
32
|
+
"business-os",
|
|
33
|
+
"claude-code",
|
|
34
|
+
"crm",
|
|
35
|
+
"gohighlevel-alternative",
|
|
36
|
+
"gohighlevel",
|
|
37
|
+
"agency",
|
|
38
|
+
"whitelabel",
|
|
39
|
+
"partner-agency",
|
|
40
|
+
"booking",
|
|
41
|
+
"intake-form",
|
|
42
|
+
"landing-page",
|
|
43
|
+
"local-service-business",
|
|
44
|
+
"sms",
|
|
45
|
+
"twilio",
|
|
46
|
+
"ai-receptionist",
|
|
47
|
+
"ai-chatbot",
|
|
48
|
+
"missed-call"
|
|
49
|
+
],
|
|
50
|
+
"homepage": "https://seldonframe.com",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/seldonframe/seldonframe.git",
|
|
54
|
+
"directory": "skills/mcp-server"
|
|
55
|
+
},
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
}
|
|
59
|
+
}
|
package/src/tools.js
CHANGED
|
@@ -471,19 +471,19 @@ export const TOOLS = [
|
|
|
471
471
|
return firstEver ? withFirstCallBanner(payload) : payload;
|
|
472
472
|
},
|
|
473
473
|
},
|
|
474
|
-
// create_workspace_from_url —
|
|
475
|
-
//
|
|
476
|
-
//
|
|
477
|
-
//
|
|
478
|
-
//
|
|
479
|
-
//
|
|
474
|
+
// create_workspace_from_url — URL → extraction playbook → atomic build.
|
|
475
|
+
// Returns the server's extraction instructions; Claude WebFetches +
|
|
476
|
+
// extracts, then calls create_full_workspace (v1.58.1: the atomic path —
|
|
477
|
+
// it now builds the production multi-page R1 site server-side, the same
|
|
478
|
+
// engine as the SeldonFrame dashboard's /clients/new, so the old
|
|
479
|
+
// block-iterated v2 follow-up is no longer the best pipeline here).
|
|
480
480
|
{
|
|
481
481
|
name: "create_workspace_from_url",
|
|
482
482
|
description:
|
|
483
|
-
"Entry point for URL-based workspace creation. Returns instructions Claude follows: WebFetch the URL, optionally WebFetch up to 2 priority sub-pages (e.g. /about, /services, /contact, /pricing), extract structured business facts, ask the operator for any required field that can't be determined, then call `
|
|
484
|
-
"THIS TOOL DOES NOT CREATE A WORKSPACE — it returns the playbook. The workspace is created by the follow-up `
|
|
483
|
+
"Entry point for URL-based workspace creation. Returns instructions Claude follows: WebFetch the URL, optionally WebFetch up to 2 priority sub-pages (e.g. /about, /services, /contact, /pricing), extract structured business facts, ask the operator for any required field that can't be determined, then call `create_full_workspace` with the result — ONE atomic call that builds the workspace + the production multi-page website (vertical-aware landing + per-service detail pages, the same engine as the SeldonFrame dashboard) + booking page + intake form + CRM + draft chatbot. " +
|
|
484
|
+
"THIS TOOL DOES NOT CREATE A WORKSPACE — it returns the playbook. The workspace is created by the follow-up `create_full_workspace` call. Do NOT use the block-iterated create_workspace_v2 flow for URL builds. " +
|
|
485
485
|
"When operator provides ANY of: 'http://', 'https://', a domain (.com/.io/.net/.co/.app/.dev/.us etc), or 'create workspace for <URL>' — call this tool. Do NOT manually WebFetch first; the instructions returned by this tool tell you exactly what to fetch and in what order. " +
|
|
486
|
-
"MANDATORY FOLLOW-UP: After
|
|
486
|
+
"MANDATORY FOLLOW-UP: After create_full_workspace returns, ask the operator 'What email should I use for your account?' and call finalize_workspace({ workspace_id, email }).",
|
|
487
487
|
inputSchema: obj(
|
|
488
488
|
{
|
|
489
489
|
url: str("Business website URL the operator provided, e.g. https://quigleyac.com"),
|
|
@@ -4852,6 +4852,78 @@ export const TOOLS = [
|
|
|
4852
4852
|
},
|
|
4853
4853
|
},
|
|
4854
4854
|
|
|
4855
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
4856
|
+
// v1.59.0 — IMPROVE. The 5th verb of the builder ladder: build → test →
|
|
4857
|
+
// deploy → sell → improve. `improve_agent` replays an agent's own recent
|
|
4858
|
+
// REAL conversations as graded evals against the current blueprint AND a
|
|
4859
|
+
// proposed patch (a shadow candidate), clusters the failure modes, and
|
|
4860
|
+
// hands back a paired before/after score diff — a marketplace-legible
|
|
4861
|
+
// trust signal, not just a debugging tool. `apply_improvement` is the
|
|
4862
|
+
// ONLY way a proposal's patch ever reaches the live blueprint: the pair
|
|
4863
|
+
// together IS the propose-only contract — improve_agent can never apply
|
|
4864
|
+
// anything on its own, by construction (see packages/crm/src/lib/agents/
|
|
4865
|
+
// improve/improve-run.ts — nothing in that module imports
|
|
4866
|
+
// updateAgentBlueprint).
|
|
4867
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
4868
|
+
|
|
4869
|
+
{
|
|
4870
|
+
name: "improve_agent",
|
|
4871
|
+
description:
|
|
4872
|
+
"USE WHEN USER SAYS: 'improve the agent', 'make the chatbot better', 'why does the agent keep messing up', 'learn from real conversations', 'find what's going wrong and fix it', 'run the improve loop'. " +
|
|
4873
|
+
"Replays the agent's recent REAL conversations as graded evals, clusters the failure modes, and PROPOSES a blueprint patch with before/after scores (paired per-scenario flips + an honest verdict — 'inconclusive' means the sample is too small to call). NEVER applies anything — review the proposal, then call apply_improvement. Takes 1-3 minutes (two replay passes). " +
|
|
4874
|
+
"Needs the workspace's OWN Anthropic key (BYOK) — unbounded build/test-tier LLM cost, same gate as run_agent_evals; returns ok:false reason='no_llm_key' (402) if unset, point the operator at configure_llm_provider. " +
|
|
4875
|
+
"Also returns ok:false (422) with a reason string when there's nothing to replay yet: 'no_conversations' (agent hasn't talked to anyone real), 'no_scenarios' (none of the sampled conversations converted cleanly), or 'agent_not_found'. " +
|
|
4876
|
+
"On success (ok:true): `proposalId` is null when the baseline was already perfect ('nothing to improve') or no patch was proposed/it failed guardrails (note explains why) — in those cases there's nothing to apply. Otherwise pass `proposalId` straight to apply_improvement if the operator approves. " +
|
|
4877
|
+
"`verdict` is 'better' ONLY when paired.improved - paired.regressed >= 3 AND no critical scenario regressed; 'worse' on a clear net regression; otherwise 'inconclusive' — AT THAT SAMPLE SIZE ONLY LARGE EFFECTS ARE REAL, so relay verdict='inconclusive' to the operator as: 'Small sample — apply on judgment, not on the score.' Never round an inconclusive verdict up to sounding like a pass.",
|
|
4878
|
+
inputSchema: obj(
|
|
4879
|
+
{
|
|
4880
|
+
workspace_id: str("Workspace id (bearer workspace)."),
|
|
4881
|
+
agent_id: str("Agent id from list_agents / create_agent / deploy_agent."),
|
|
4882
|
+
},
|
|
4883
|
+
["workspace_id", "agent_id"],
|
|
4884
|
+
),
|
|
4885
|
+
handler: async (args) => {
|
|
4886
|
+
const ws = args.workspace_id;
|
|
4887
|
+
const result = await api("POST", "/build/improve", {
|
|
4888
|
+
body: { agent_id: args.agent_id },
|
|
4889
|
+
workspace_id: ws,
|
|
4890
|
+
});
|
|
4891
|
+
if (result?.ok && result.verdict === "inconclusive") {
|
|
4892
|
+
return {
|
|
4893
|
+
...result,
|
|
4894
|
+
guidance:
|
|
4895
|
+
"Small sample — apply on judgment, not on the score. The paired flip counts and cluster evidence are real; the verdict just isn't confident enough to call 'better' at this sample size. Read the clusters yourself before deciding whether to apply_improvement.",
|
|
4896
|
+
};
|
|
4897
|
+
}
|
|
4898
|
+
return result;
|
|
4899
|
+
},
|
|
4900
|
+
},
|
|
4901
|
+
|
|
4902
|
+
{
|
|
4903
|
+
name: "apply_improvement",
|
|
4904
|
+
description:
|
|
4905
|
+
"USE WHEN USER SAYS: 'apply that improvement', 'go with the proposed fix', 'apply the patch', 'yes, use the better version', 'accept the improve_agent proposal'. " +
|
|
4906
|
+
"Applies a previously PROPOSED patch (from improve_agent's `proposalId`) after human review — this is the ONLY tool that can move an improve proposal's patch onto the live blueprint. Re-validates the patch against the agent's CURRENT blueprint before writing (it may have moved since the proposal was created) and creates a new agent_versions snapshot, exactly like update_agent_blueprint. " +
|
|
4907
|
+
"Version drift doesn't block the apply — if the blueprint changed since the proposal was made, the result just carries a `note: 'applied over vN'` so you know it landed on a newer base than it was proposed against. " +
|
|
4908
|
+
"Rejects (ok:false, 422) with a reason when the proposal can't be applied: 'not_found' (wrong id/org, or already resolved), 'not_proposed' (already applied or dismissed — improve proposals are one-shot), 'revalidation_failed' (the patch no longer passes the guardrail against the current blueprint). None of these ever touch the blueprint. " +
|
|
4909
|
+
"After applying, the agent is on a new version — suggest re-running run_agent_evals or publish_agent({status:'live'}) (which auto-evals) to confirm the new version still passes the safety gate before the operator relies on it.",
|
|
4910
|
+
inputSchema: obj(
|
|
4911
|
+
{
|
|
4912
|
+
workspace_id: str("Workspace id (bearer workspace)."),
|
|
4913
|
+
proposal_id: str("Proposal id from improve_agent's `proposalId` field."),
|
|
4914
|
+
},
|
|
4915
|
+
["workspace_id", "proposal_id"],
|
|
4916
|
+
),
|
|
4917
|
+
handler: async (args) => {
|
|
4918
|
+
const ws = args.workspace_id;
|
|
4919
|
+
const result = await api("POST", "/build/improve/apply", {
|
|
4920
|
+
body: { proposal_id: args.proposal_id },
|
|
4921
|
+
workspace_id: ws,
|
|
4922
|
+
});
|
|
4923
|
+
return result;
|
|
4924
|
+
},
|
|
4925
|
+
},
|
|
4926
|
+
|
|
4855
4927
|
{
|
|
4856
4928
|
name: "update_agent_blueprint",
|
|
4857
4929
|
description:
|
package/src/welcome.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// stripped. `create_full_workspace` is the only workspace-creation
|
|
9
9
|
// path mentioned anywhere in this briefing.
|
|
10
10
|
|
|
11
|
-
export const VERSION = "1.
|
|
11
|
+
export const VERSION = "1.59.1";
|
|
12
12
|
|
|
13
13
|
export const WELCOME_MARKDOWN = `# SeldonFrame — create a real Business OS in one conversation
|
|
14
14
|
|
|
@@ -191,6 +191,18 @@ Code at any time:
|
|
|
191
191
|
- \`run_agent_evals\` — manual eval suite trigger
|
|
192
192
|
- \`replay_conversation\` — re-run a past chat against current blueprint
|
|
193
193
|
|
|
194
|
+
### v1.59.0 — the builder ladder gains a 5th verb: improve
|
|
195
|
+
|
|
196
|
+
The full ladder is now **build → test → deploy → sell → improve**. Once
|
|
197
|
+
an agent has real conversation history, \`improve_agent({ agent_id })\`
|
|
198
|
+
replays it as graded evals, clusters the failure modes, and proposes a
|
|
199
|
+
blueprint patch with paired before/after scores — never applying
|
|
200
|
+
anything on its own. Review the proposal with the operator, then call
|
|
201
|
+
\`apply_improvement({ proposal_id })\` if it looks good. Treat an
|
|
202
|
+
\"inconclusive\" verdict as a real answer, not a soft failure — small
|
|
203
|
+
samples can't support a confident "better," so apply on judgment, not
|
|
204
|
+
on the score.
|
|
205
|
+
|
|
194
206
|
The dashboard surfaces (\`/agents\`, \`/agents/[id]/test\`, \`/agents/[id]/settings\`,
|
|
195
207
|
\`/agents/[id]/evals\`, \`/agents/[id]/conversations\`) provide the same view
|
|
196
208
|
without leaving the browser — operators iterate FAQ/pricing/greeting inline
|
|
@@ -226,9 +238,13 @@ server-side personality system still runs underneath for everything
|
|
|
226
238
|
else (CRM, booking, intake, theme, pipeline) — v2 only owns the copy
|
|
227
239
|
surfaces where v1's layer-mismatch bugs hurt most.
|
|
228
240
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
241
|
+
Flow choice: when the structured business FACTS are already in hand —
|
|
242
|
+
a URL extraction (create_workspace_from_url's playbook), a Google Maps
|
|
243
|
+
paste, or a filled fact sheet — call \`create_full_workspace\` instead.
|
|
244
|
+
Its atomic build now runs the same multi-page R1 site engine as the
|
|
245
|
+
SeldonFrame dashboard (vertical-aware landing + per-service detail
|
|
246
|
+
pages), which beats block-by-block copy generation. Use the v2 flow
|
|
247
|
+
below when the operator wants to craft the copy interactively with you.
|
|
232
248
|
|
|
233
249
|
1. **Ask for the business details** (same as before — gather conversationally):
|
|
234
250
|
- Business name
|
|
@@ -322,17 +338,21 @@ but the output quality is worse on niches outside SF's curated set.
|
|
|
322
338
|
output. PARAPHRASE that summary verbatim to the operator — that's
|
|
323
339
|
how they see what was configured.
|
|
324
340
|
|
|
325
|
-
##
|
|
341
|
+
## Atomic vs block-iterated — when to use which
|
|
326
342
|
|
|
327
|
-
\`create_full_workspace\`
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
-
|
|
331
|
-
|
|
332
|
-
|
|
343
|
+
\`create_full_workspace\` is the atomic creation path and (since v1.58)
|
|
344
|
+
builds the production multi-page website server-side — the same R1
|
|
345
|
+
engine the SeldonFrame dashboard's /clients/new uses: vertical-aware
|
|
346
|
+
landing, per-service detail pages, booking, intake, CRM, and a draft
|
|
347
|
+
chatbot, all from one call. Prefer it whenever the business facts are
|
|
348
|
+
already in hand:
|
|
349
|
+
- create_workspace_from_url extractions (its playbook routes here)
|
|
350
|
+
- Google Maps paste flows
|
|
351
|
+
- scripted/automated creation
|
|
333
352
|
|
|
334
|
-
|
|
335
|
-
|
|
353
|
+
Prefer \`create_workspace_v2\` when the operator wants to shape the copy
|
|
354
|
+
interactively — you generate hero/services/faq blocks yourself from
|
|
355
|
+
block skills and iterate with them before completing.
|
|
336
356
|
|
|
337
357
|
After step 4 the operator can customize their workspace through
|
|
338
358
|
further natural-language requests ("change the headline to …",
|
|
@@ -456,6 +476,24 @@ further natural-language requests ("change the headline to …",
|
|
|
456
476
|
title, description.
|
|
457
477
|
- **\`install_vertical_pack\`** — set up an industry template
|
|
458
478
|
(real-estate, dental, legal, plumbing, …).
|
|
479
|
+
- **\`improve_agent\`** (v1.59.0) — replays an agent's recent REAL
|
|
480
|
+
conversations as graded evals, clusters the failure modes, and
|
|
481
|
+
proposes a blueprint patch with paired before/after scores; it never
|
|
482
|
+
applies anything by itself. Takes 1-3 minutes (two eval replay
|
|
483
|
+
passes) and needs the workspace's own Anthropic key (BYOK), same gate
|
|
484
|
+
as \`run_agent_evals\`. Treat verdict='inconclusive' as an honest
|
|
485
|
+
answer, not a failure — the sample is too small to call "better," so
|
|
486
|
+
relay it to the operator as "small sample — apply on judgment, not
|
|
487
|
+
on the score."
|
|
488
|
+
- **\`apply_improvement\`** (v1.59.0) — applies a proposal from
|
|
489
|
+
\`improve_agent\`'s \`proposalId\` after the operator reviews it,
|
|
490
|
+
re-validating the patch against the current blueprint and creating a
|
|
491
|
+
new version, exactly like \`update_agent_blueprint\`. This is the
|
|
492
|
+
ONLY tool that can move an improve proposal onto the live blueprint —
|
|
493
|
+
\`improve_agent\` is propose-only by construction. Re-run
|
|
494
|
+
\`run_agent_evals\` (or \`publish_agent({status:'live'})\`, which
|
|
495
|
+
auto-evals) after applying to confirm the new version still clears
|
|
496
|
+
the safety gate.
|
|
459
497
|
- **\`list_contacts\`** / **\`create_contact\`** / **\`update_contact\`** —
|
|
460
498
|
manage the CRM.
|
|
461
499
|
- **\`list_deals\`** / **\`create_deal\`** / **\`move_deal_stage\`** —
|