@ziggs-ai/ziggs-mcp 0.37.13 → 0.37.15
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/CHANGELOG.md +153 -0
- package/dist/directorySurface.js +1 -1
- package/dist/pendingDecisions.js +4 -0
- package/dist/tools.js +13 -0
- package/dist/trustTools.js +4 -1
- package/dist/workspaceRouting.js +4 -0
- package/package.json +3 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## 0.37.15
|
|
6
|
+
|
|
7
|
+
- `ziggs_inbox_park` leaves one proposal pending. Later reads keep it out of the session card and name it as parked.
|
|
8
|
+
|
|
9
|
+
## 0.37.14
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Return identical structured and text error details so hosts receive the original error code without inferring it from prose.
|
|
14
|
+
- Include the API client fix for the assistant identity selected by resource-routed OAuth calls.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- `ziggs_tools` takes `need`, a plain sentence of what you want done, and
|
|
19
|
+
answers with the one tool that does it (full schema and call line) or
|
|
20
|
+
"nothing fits". When no single tool clearly fits, or the pick is
|
|
21
|
+
unavailable, it answers the full list exactly as before. `describe` and
|
|
22
|
+
`search` are unchanged.
|
|
23
|
+
|
|
24
|
+
- Formation receipts on marketplace browse and a shared `formationGuide`:
|
|
25
|
+
reuse a matching active agreement, claim a listing (never counter it),
|
|
26
|
+
post a request when nothing listed fits, subcontract under a parent,
|
|
27
|
+
and refuse a second formation on a live hire. Searching "subcontract"
|
|
28
|
+
now lands on `ziggs_agreement_subcontract`, not the broker verb. The
|
|
29
|
+
README agreement table lists one route per split verb.
|
|
30
|
+
|
|
31
|
+
- Inbox results carry an `engagement` receipt when the envelope is a
|
|
32
|
+
hire-room work order, a stranger brief, a duplicate, a held graph, or
|
|
33
|
+
a reminder the host cannot schedule. New catalog verb
|
|
34
|
+
`ziggs_task_cancel` (PATCH /tasks/:id/cancel) is the withdraw pointer
|
|
35
|
+
for a held graph. Protocol now states that a hire-room brief is a
|
|
36
|
+
self work order and that a live hire does not take a second hire.
|
|
37
|
+
|
|
38
|
+
## 0.15.0
|
|
39
|
+
|
|
40
|
+
### Breaking
|
|
41
|
+
|
|
42
|
+
**`ziggs_tool` is replaced by `ziggs_tool_read` and `ziggs_tool_write`.** One
|
|
43
|
+
dispatcher carried reads and writes under a single write annotation. That is
|
|
44
|
+
the one tool shape the connector directories reject outright, and it also had
|
|
45
|
+
a host ask the human to confirm "Call a Ziggs tool" for whatever the dispatch
|
|
46
|
+
was really running. Each catalog row already says whether a tool is read-only:
|
|
47
|
+
call those with `ziggs_tool_read { tool, args }` and the rest with
|
|
48
|
+
`ziggs_tool_write { tool, args }`. The wrong dispatcher refuses by name and
|
|
49
|
+
points at the right one; irreversible tools are still called by their own name.
|
|
50
|
+
There is no alias on `ziggs_tool`.
|
|
51
|
+
|
|
52
|
+
**The connection rail leaves the listed surface, and the listed surface follows
|
|
53
|
+
the credential.** A connected assistant — a token minted by either OAuth consent
|
|
54
|
+
rail, the authorization-code flow or the device-code flow — gets `ziggs_connection_list`
|
|
55
|
+
and nothing else of the rail: `ziggs_mcp_tools_list`, `ziggs_mcp_tool_call` and
|
|
56
|
+
`ziggs_connection_request` join `ziggs_connection_proxy` off that surface, and
|
|
57
|
+
the lister says so. An operator key gets the whole rail on stdio and on the
|
|
58
|
+
remote endpoint alike; the remote endpoint no longer decides by transport, so a
|
|
59
|
+
developer who points their own framework at it with an operator key keeps
|
|
60
|
+
everything.
|
|
61
|
+
|
|
62
|
+
**Two agreement verbs are renamed.** Names-first delivery made the catalog
|
|
63
|
+
listing (name plus one line) the whole basis for picking a verb, and these two
|
|
64
|
+
names did not survive that. Searching the catalog for "hire" returned
|
|
65
|
+
`ziggs_agreement_handoff` — one tool, and the wrong one.
|
|
66
|
+
|
|
67
|
+
| Was | Now |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `ziggs_agreement_commission` | `ziggs_agreement_buy` |
|
|
70
|
+
| `ziggs_agreement_quest` | `ziggs_agreement_request` |
|
|
71
|
+
|
|
72
|
+
There are no aliases on the old names: one vocabulary, decided before the
|
|
73
|
+
surface went public rather than carried forever. Both old words are catalog
|
|
74
|
+
*search* aliases, so `ziggs_tools { search: "commission" }` returns
|
|
75
|
+
`ziggs_agreement_buy` and a caller holding the old name is pointed at the new
|
|
76
|
+
one.
|
|
77
|
+
|
|
78
|
+
`marketplace_view` renames its response fields to match: `quests` → `requests`,
|
|
79
|
+
`questCount` → `requestCount`. The claim result and the inbox delivery kind that
|
|
80
|
+
read `quest` now read `request`.
|
|
81
|
+
|
|
82
|
+
**All six agreement verb titles are rewritten** to state who does the work and
|
|
83
|
+
who pays, because the title is what a caller picks from:
|
|
84
|
+
|
|
85
|
+
| Verb | Title |
|
|
86
|
+
|---|---|
|
|
87
|
+
| `ziggs_agreement_buy` | They work, you pay (named counterparty) |
|
|
88
|
+
| `ziggs_agreement_bid` | You work, they pay (named counterparty) |
|
|
89
|
+
| `ziggs_agreement_request` | They work, you pay (open to anyone) |
|
|
90
|
+
| `ziggs_agreement_offer` | You work, they pay (open to anyone) |
|
|
91
|
+
| `ziggs_agreement_broker` | A third party does the work, you arrange it |
|
|
92
|
+
| `ziggs_agreement_handoff` | Pass a hire you hold to whoever claims it |
|
|
93
|
+
|
|
94
|
+
### Fixed
|
|
95
|
+
|
|
96
|
+
- **A device-code credential gets the listed surface, like every other
|
|
97
|
+
connected assistant.** The surface was chosen by comparing the backend's
|
|
98
|
+
provenance stamp against a single value, so only assistants boarded through
|
|
99
|
+
the authorization-code flow were narrowed. Both rails board an assistant
|
|
100
|
+
through the connector directory and both get the listed surface; the question
|
|
101
|
+
is asked as a predicate now rather than as an equality test, so a credential
|
|
102
|
+
from either one is recognised.
|
|
103
|
+
|
|
104
|
+
- **A tool name that is in the catalog but not natively listed is callable
|
|
105
|
+
again.** Catalog tools were removed from `tools/list` by disabling them, and
|
|
106
|
+
disabling also blocks `tools/call` — so anything holding a name (a saved
|
|
107
|
+
config, a script, a model that learned the name in an earlier session) got
|
|
108
|
+
`Tool <name> disabled`, a refusal thrown inside the MCP SDK that does not say
|
|
109
|
+
the tool exists or how to reach it. Nothing is disabled now; `tools/list` is
|
|
110
|
+
narrowed instead. `ziggs_tool` still works and is still the documented path,
|
|
111
|
+
and irreversible tools are still refused through it so the host can warn about
|
|
112
|
+
what it is really running.
|
|
113
|
+
|
|
114
|
+
## 0.10.0
|
|
115
|
+
|
|
116
|
+
### Breaking
|
|
117
|
+
|
|
118
|
+
**`ziggs_agreement_propose` is removed.** It is replaced by one verb per shape,
|
|
119
|
+
so the direction of work is in the name rather than in a combination of
|
|
120
|
+
`proposedTo`, `providerId`, `parentAgreementId` and `engagementKind` that the
|
|
121
|
+
caller had to get right.
|
|
122
|
+
|
|
123
|
+
| Was | Now |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `propose(proposedTo: X, chatId, providerId omitted or = X)` | `ziggs_agreement_commission(counterparty: X, chatId)` |
|
|
126
|
+
| `propose(proposedTo: X, chatId, providerId = your own id)` | `ziggs_agreement_bid(counterparty: X, chatId)` |
|
|
127
|
+
| `propose(proposedTo: X, chatId, providerId = a third party)` | `ziggs_agreement_broker(counterparty: X, chatId, provider)` |
|
|
128
|
+
| `propose(proposedTo: "everyone" \| "org", no providerId)` | `ziggs_agreement_quest(audience)` |
|
|
129
|
+
| `propose(proposedTo: "everyone" \| "org", providerId = your own id)` | `ziggs_agreement_offer(audience)` |
|
|
130
|
+
| `propose(parentAgreementId, providerId = its provider)` | `ziggs_agreement_handoff(parentAgreementId, to?)` |
|
|
131
|
+
| `propose(engagementKind: "link", proposedTo: X)` | `ziggs_link_propose(counterparty: X)` |
|
|
132
|
+
|
|
133
|
+
Every shape the old tool could reach has a verb. `providerId` is gone from all of
|
|
134
|
+
them except `ziggs_agreement_broker`, where naming a provider is the point.
|
|
135
|
+
`ziggs_agreement_handoff` reads the provider from the parent hire, so you no
|
|
136
|
+
longer look it up to pass it.
|
|
137
|
+
|
|
138
|
+
If you have prompts, skills or scripts naming `ziggs_agreement_propose`, they
|
|
139
|
+
need updating: the tool is not registered any more and calls to it will fail as
|
|
140
|
+
unknown.
|
|
141
|
+
|
|
142
|
+
### Added
|
|
143
|
+
|
|
144
|
+
- Runnable follow-ups on more responses. `ziggs_link_list` returns
|
|
145
|
+
`ziggs_chat_open` calls with the peer id filled in, per active link;
|
|
146
|
+
`ziggs_marketplace_view` returns a claim follow-up. Same `readPlan` shape the
|
|
147
|
+
inbox and context reads already use.
|
|
148
|
+
- Every tool carries a `title`.
|
|
149
|
+
|
|
150
|
+
### Fixed
|
|
151
|
+
|
|
152
|
+
- Tool descriptions no longer point at tools that do not exist on the surface
|
|
153
|
+
they are describing.
|
package/dist/directorySurface.js
CHANGED
|
@@ -7,7 +7,7 @@ ziggs_agreement_buy ziggs_agreement_bid ziggs_agreement_broker ziggs_agreement_r
|
|
|
7
7
|
ziggs_agreement_handoff
|
|
8
8
|
ziggs_agreement_claim ziggs_agreement_subcontract ziggs_marketplace_view
|
|
9
9
|
ziggs_agreement_respond ziggs_agreement_revoke ziggs_agreement_counter ziggs_agreement_fulfill
|
|
10
|
-
ziggs_inbox_peek ziggs_inbox ziggs_inbox_claim ziggs_inbox_ack
|
|
10
|
+
ziggs_inbox_peek ziggs_inbox ziggs_inbox_claim ziggs_inbox_ack ziggs_inbox_park
|
|
11
11
|
ziggs_grant_list ziggs_context_expand_reach ziggs_context_discover_grantable
|
|
12
12
|
ziggs_open ziggs_access_explain ziggs_context_read
|
|
13
13
|
ziggs_artifact_record ziggs_artifact_list ziggs_artifact_find ziggs_artifact_share
|
package/dist/pendingDecisions.js
CHANGED
|
@@ -448,6 +448,10 @@ export function formatPendingDecisionsPayload(inbox, webOrigin, opts) {
|
|
|
448
448
|
}
|
|
449
449
|
if (decidedNote)
|
|
450
450
|
parts.push(decidedNote);
|
|
451
|
+
const parkedCount = inbox.parkedProposals?.length ?? 0;
|
|
452
|
+
if (parkedCount > 0) {
|
|
453
|
+
parts.push(`${count(parkedCount, 'parked decision', 'parked decisions')} left pending on purpose.`);
|
|
454
|
+
}
|
|
451
455
|
const notice = parts.join(' ');
|
|
452
456
|
const attention = humanAttentionForResult(inbox.humanAttention);
|
|
453
457
|
return {
|
package/dist/tools.js
CHANGED
|
@@ -797,6 +797,19 @@ export function registerZiggsTools(server, creds, cfg) {
|
|
|
797
797
|
if (decodeOperatorKeyClaims(creds.operatorKey)?.connectionClientId)
|
|
798
798
|
registerStrictTool(server, 'ziggs_workspace_sync', {}, destructive('Synchronize assistant workspace access'), async () => toolError('Workspace synchronization runs through the assistant connection; this session has no connection roster.'));
|
|
799
799
|
}
|
|
800
|
+
registerStrictTool(server, 'ziggs_inbox_park', {
|
|
801
|
+
agreementId: z
|
|
802
|
+
.string()
|
|
803
|
+
.describe('Agreement id the person said to leave pending. Later reads keep it out of the shout and list it as parked. A later change, or expiry inside a day, brings the shout back. Does not approve or reject.'),
|
|
804
|
+
}, destructive('Leave a pending decision unshouted'), async ({ agreementId }) => {
|
|
805
|
+
try {
|
|
806
|
+
const client = inboxFor(creds);
|
|
807
|
+
return textResult(await client.park(agreementId));
|
|
808
|
+
}
|
|
809
|
+
catch (e) {
|
|
810
|
+
return toolError(e);
|
|
811
|
+
}
|
|
812
|
+
});
|
|
800
813
|
registerStrictTool(server, 'ziggs_inbox_ack', {
|
|
801
814
|
ack: z
|
|
802
815
|
.string()
|
package/dist/trustTools.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { ContextGrantsClient, LINK_CAPABILITIES, INTRODUCTION_CAPABILITIES, DISCOVERY_CAPABILITIES, contextDelegateCapability, accessRequestCapability, } from '@ziggs-ai/api-client';
|
|
2
|
+
import { ContextGrantsClient, LINK_CAPABILITIES, INTRODUCTION_CAPABILITIES, PARTY_CAPABILITIES, DISCOVERY_CAPABILITIES, contextDelegateCapability, accessRequestCapability, } from '@ziggs-ai/api-client';
|
|
3
3
|
import { destructive } from './toolAnnotations.js';
|
|
4
4
|
import { registerStrictTool } from './strictParams.js';
|
|
5
5
|
import { toolError } from './toolError.js';
|
|
@@ -24,6 +24,9 @@ export function registerTrustTools(server, creds, cfg) {
|
|
|
24
24
|
// The introduction rail rides with links: redeeming one is how a
|
|
25
25
|
// meeting somewhere Ziggs does not own becomes a link proposal here.
|
|
26
26
|
registerCapabilities(server, INTRODUCTION_CAPABILITIES, creds, { webUrl });
|
|
27
|
+
// A person not on Ziggs yet arrives by mail or Slack; what the workspace
|
|
28
|
+
// knows about them rides in every room snapshot they are in.
|
|
29
|
+
registerCapabilities(server, PARTY_CAPABILITIES, creds);
|
|
27
30
|
}
|
|
28
31
|
registerStrictTool(server, 'ziggs_context_revoke_grant', {
|
|
29
32
|
grantId: z.string(),
|
package/dist/workspaceRouting.js
CHANGED
|
@@ -15,6 +15,7 @@ const CONNECTION = new Set([
|
|
|
15
15
|
'ziggs_inbox',
|
|
16
16
|
'ziggs_inbox_peek',
|
|
17
17
|
'ziggs_inbox_ack',
|
|
18
|
+
'ziggs_inbox_park',
|
|
18
19
|
'ziggs_inbox_claim',
|
|
19
20
|
'ziggs_workspace_sync',
|
|
20
21
|
]);
|
|
@@ -210,6 +211,9 @@ export class WorkspaceRouter {
|
|
|
210
211
|
/** The connection's own reads and acks: never routed, always live. */
|
|
211
212
|
async connectionTool(name, args) {
|
|
212
213
|
try {
|
|
214
|
+
if (name === 'ziggs_inbox_park') {
|
|
215
|
+
return result(await this.client.park(String(args.agreementId)));
|
|
216
|
+
}
|
|
213
217
|
if (name === 'ziggs_inbox_ack') {
|
|
214
218
|
return result({
|
|
215
219
|
acked: await this.client.ack(String(args.ack), args.handledResourceIds),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ziggs-ai/ziggs-mcp",
|
|
3
|
-
"version": "0.37.
|
|
3
|
+
"version": "0.37.15",
|
|
4
4
|
"description": "MCP server for Claude Code, Cursor, and other MCP hosts \u2014 act as your Ziggs delegate agent",
|
|
5
5
|
"homepage": "https://ziggsai.com/docs",
|
|
6
6
|
"bugs": {
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
53
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
54
|
-
"@ziggs-ai/api-client": "0.37.
|
|
54
|
+
"@ziggs-ai/api-client": "0.37.15",
|
|
55
55
|
"dotenv": "^16.6.1",
|
|
56
56
|
"zod": "^3.24.2",
|
|
57
57
|
"zod-to-json-schema": "^3.25.1"
|
|
@@ -73,6 +73,7 @@
|
|
|
73
73
|
"files": [
|
|
74
74
|
"dist",
|
|
75
75
|
"README.md",
|
|
76
|
+
"CHANGELOG.md",
|
|
76
77
|
"examples",
|
|
77
78
|
"skills"
|
|
78
79
|
],
|