@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 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.
@@ -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
@@ -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()
@@ -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(),
@@ -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.13",
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.13",
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
  ],