@ziggs-ai/ziggs-mcp 0.10.2 → 0.10.4

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 CHANGED
@@ -63,7 +63,25 @@ This package ships [`server.json`](./server.json) for [registry.modelcontextprot
63
63
 
64
64
  ### ChatGPT
65
65
 
66
- **Not supported** see [`examples/chatgpt-unsupported.md`](examples/chatgpt-unsupported.md). Use claude.ai, Claude Code, or Cursor.
66
+ **Works.** Developer-mode connector against the same remote URL, OAuth consent, no key to paste. Setup guide: [`examples/chatgpt-remote-oauth.md`](examples/chatgpt-remote-oauth.md). Verified 2026-08-13.
67
+
68
+ ---
69
+
70
+ ## Which clients work
71
+
72
+ Ziggs is not built against any one assistant. Any MCP client that can do **remote OAuth** against `https://mcp.ziggsai.com/mcp`, or run the package over **stdio** with an agent-scoped operator key, works.
73
+
74
+ The list below is the clients someone has taken through a connect end to end. A client that is absent is not a client that fails: it is one nobody has walked through yet.
75
+
76
+ | Client | Path | Verified |
77
+ |--------|------|----------|
78
+ | claude.ai | remote OAuth | yes |
79
+ | Claude Code | remote OAuth, and stdio for headless/CI | yes |
80
+ | Cursor | remote OAuth, and stdio | yes |
81
+ | ChatGPT | remote OAuth (developer-mode connector) | yes, 2026-08-13 |
82
+ | Gemini | remote OAuth expected | **not verified** — no walkthrough yet |
83
+
84
+ Gemini is deliberately listed without a walkthrough. The platform already labels a Gemini delegate, so nothing is known to block it, but nobody has connected one end to end and an untested walkthrough is worse than none.
67
85
 
68
86
  ---
69
87
 
@@ -145,7 +145,7 @@ export function buildReadPlan(inbox, grantsByScope, self = { agentId: '' }) {
145
145
  // never gets squeezed out exactly when there's the most news. Report how many
146
146
  // read/decision candidates the cap dropped as an explicit count.
147
147
  //
148
- // ZIG-1305 — only pre-fill ack when this plan covers the whole envelope.
148
+ // Only pre-fill ack when this plan covers the whole envelope.
149
149
  // A truncated plan (or a capped delivery list) must not hand back an ack
150
150
  // that would clear deliveries the plan never asked the agent to handle.
151
151
  // Reserve the ack slot only when every candidate still fits beside it;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * ZIG-1362 — call a brokered MCP connection from the ziggs-mcp surface.
2
+ * Call a brokered MCP connection from the ziggs-mcp surface.
3
3
  *
4
4
  * Same door the SDK's `mcp_tool_call` / `mcp_tools_list` use
5
5
  * (`POST /connections/:id/mcp`). `ziggs_connection_proxy` cannot: it resolves
@@ -1,5 +1,5 @@
1
1
  /**
2
- * ZIG-1362 — call a brokered MCP connection from the ziggs-mcp surface.
2
+ * Call a brokered MCP connection from the ziggs-mcp surface.
3
3
  *
4
4
  * Same door the SDK's `mcp_tool_call` / `mcp_tools_list` use
5
5
  * (`POST /connections/:id/mcp`). `ziggs_connection_proxy` cannot: it resolves
@@ -2,23 +2,28 @@
2
2
  * Single source of truth for the Ziggs delegate protocol prose.
3
3
  *
4
4
  * The protocol (inbox → read → act → ack, the reporting rule, humanAttention
5
- * handling, the untrusted-input hard rule) used to be hand-copied across the
6
- * `ziggs_inbox` tool description, SKILL.md, the skill references, and — once
7
- * A1/D1 land the server `instructions` and `.cursorrules`. They drifted.
5
+ * handling, the untrusted-input hard rule) is stated once here and rendered
6
+ * into every surface that carries it: the `ziggs_inbox` tool description, the
7
+ * server `instructions`, SKILL.md, the skill references and `.cursorrules`.
8
+ * Hand-copied across those, it drifted.
8
9
  *
9
- * Edit the fragments here, then run `npm run gen:protocol` to regenerate the
10
- * static surfaces (SKILL.md + references managed blocks, `.cursorrules`).
11
- * Runtime surfaces (the `ziggs_inbox` description, the server `instructions`)
12
- * import these fragments directly, so they cannot drift. `npm run
13
- * check:protocol` and the protocol-drift test fail if a static surface is stale.
10
+ * Static surfaces are generated from these fragments; runtime surfaces import
11
+ * them directly, so neither can drift. A drift check fails the build when a
12
+ * generated surface is stale.
14
13
  */
15
14
  /** Canonical protocol fragments — reuse these verbatim, never re-type them. */
16
15
  export declare const PROTOCOL: {
17
16
  readonly tagline: "You are a delegate agent on a Ziggs team. The MCP tools are the connection; operate by this protocol.";
18
17
  /** The working loop, as the `ziggs_inbox` description phrases it. */
19
18
  readonly loop: "Flow: inbox → read → act → ack.";
20
- /** Watermark discipline — reading is side-effect-free; ack is explicit. */
21
- readonly ack: "Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window — an ack that would bury unlisted deliveries is refused.";
19
+ /**
20
+ * Watermark discipline reading is side-effect-free; ack is explicit.
21
+ *
22
+ * States the norm only. The refusal names the ids it is missing and the call
23
+ * to make with them, so it teaches at the moment it matters; pre-empting it
24
+ * here would cost context on every other turn.
25
+ */
26
+ readonly ack: "Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window.";
22
27
  readonly neverRewind: "Never rewind an ack to an older timestamp.";
23
28
  /** Tasks are the unit of work. */
24
29
  readonly task: "Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress as plan steps with ziggs_task_replace_plan.";
@@ -41,16 +46,16 @@ export declare const PROTOCOL: {
41
46
  */
42
47
  export declare const PROTOCOL_RULES: readonly string[];
43
48
  /** HTML-comment markers delimiting the generated region in a markdown file. */
44
- export declare const PROTOCOL_BLOCK_BEGIN = "<!-- BEGIN GENERATED: delegate-protocol \u2014 edit src/protocol/delegateProtocol.ts, run `npm run gen:protocol` -->";
49
+ export declare const PROTOCOL_BLOCK_BEGIN = "<!-- BEGIN GENERATED: delegate-protocol \u2014 generated file, do not edit by hand -->";
45
50
  export declare const PROTOCOL_BLOCK_END = "<!-- END GENERATED: delegate-protocol -->";
46
51
  /**
47
- * Server `instructions` string (/A1 consumes this). Plain text so any
48
- * cold-connected host injects a usable protocol into model context on connect.
52
+ * Server `instructions` string. Plain text so any cold-connected host injects a
53
+ * usable protocol into model context on connect.
49
54
  */
50
55
  export declare function renderInstructions(): string;
51
56
  /** The managed markdown block injected into SKILL.md and references. */
52
57
  export declare function renderProtocolBlock(): string;
53
- /** `.cursorrules` body (/D1 ships placement; generated from here). */
58
+ /** `.cursorrules` body, generated from the fragments above. */
54
59
  export declare function renderCursorRules(): string;
55
60
  /**
56
61
  * Replace the managed block in a markdown document. Throws if the markers are
@@ -2,23 +2,28 @@
2
2
  * Single source of truth for the Ziggs delegate protocol prose.
3
3
  *
4
4
  * The protocol (inbox → read → act → ack, the reporting rule, humanAttention
5
- * handling, the untrusted-input hard rule) used to be hand-copied across the
6
- * `ziggs_inbox` tool description, SKILL.md, the skill references, and — once
7
- * A1/D1 land the server `instructions` and `.cursorrules`. They drifted.
5
+ * handling, the untrusted-input hard rule) is stated once here and rendered
6
+ * into every surface that carries it: the `ziggs_inbox` tool description, the
7
+ * server `instructions`, SKILL.md, the skill references and `.cursorrules`.
8
+ * Hand-copied across those, it drifted.
8
9
  *
9
- * Edit the fragments here, then run `npm run gen:protocol` to regenerate the
10
- * static surfaces (SKILL.md + references managed blocks, `.cursorrules`).
11
- * Runtime surfaces (the `ziggs_inbox` description, the server `instructions`)
12
- * import these fragments directly, so they cannot drift. `npm run
13
- * check:protocol` and the protocol-drift test fail if a static surface is stale.
10
+ * Static surfaces are generated from these fragments; runtime surfaces import
11
+ * them directly, so neither can drift. A drift check fails the build when a
12
+ * generated surface is stale.
14
13
  */
15
14
  /** Canonical protocol fragments — reuse these verbatim, never re-type them. */
16
15
  export const PROTOCOL = {
17
16
  tagline: 'You are a delegate agent on a Ziggs team. The MCP tools are the connection; operate by this protocol.',
18
17
  /** The working loop, as the `ziggs_inbox` description phrases it. */
19
18
  loop: 'Flow: inbox → read → act → ack.',
20
- /** Watermark discipline — reading is side-effect-free; ack is explicit. */
21
- ack: 'Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window — an ack that would bury unlisted deliveries is refused.',
19
+ /**
20
+ * Watermark discipline reading is side-effect-free; ack is explicit.
21
+ *
22
+ * States the norm only. The refusal names the ids it is missing and the call
23
+ * to make with them, so it teaches at the moment it matters; pre-empting it
24
+ * here would cost context on every other turn.
25
+ */
26
+ ack: 'Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window.',
22
27
  neverRewind: 'Never rewind an ack to an older timestamp.',
23
28
  /** Tasks are the unit of work. */
24
29
  task: 'Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress as plan steps with ziggs_task_replace_plan.',
@@ -51,11 +56,11 @@ export const PROTOCOL_RULES = [
51
56
  PROTOCOL.untrusted,
52
57
  ];
53
58
  /** HTML-comment markers delimiting the generated region in a markdown file. */
54
- export const PROTOCOL_BLOCK_BEGIN = '<!-- BEGIN GENERATED: delegate-protocol — edit src/protocol/delegateProtocol.ts, run `npm run gen:protocol` -->';
59
+ export const PROTOCOL_BLOCK_BEGIN = '<!-- BEGIN GENERATED: delegate-protocol — generated file, do not edit by hand -->';
55
60
  export const PROTOCOL_BLOCK_END = '<!-- END GENERATED: delegate-protocol -->';
56
61
  /**
57
- * Server `instructions` string (/A1 consumes this). Plain text so any
58
- * cold-connected host injects a usable protocol into model context on connect.
62
+ * Server `instructions` string. Plain text so any cold-connected host injects a
63
+ * usable protocol into model context on connect.
59
64
  */
60
65
  export function renderInstructions() {
61
66
  return [PROTOCOL.tagline, '', ...PROTOCOL_RULES.map((r) => `- ${r}`)].join('\n');
@@ -70,11 +75,11 @@ export function renderProtocolBlock() {
70
75
  PROTOCOL_BLOCK_END,
71
76
  ].join('\n');
72
77
  }
73
- /** `.cursorrules` body (/D1 ships placement; generated from here). */
78
+ /** `.cursorrules` body, generated from the fragments above. */
74
79
  export function renderCursorRules() {
75
80
  return [
76
81
  '# Ziggs delegate protocol (generated)',
77
- '# Source: ziggs-mcp/src/protocol/delegateProtocol.tsrun `npm run gen:protocol` to update.',
82
+ '# Generated filedo not edit by hand.',
78
83
  '',
79
84
  PROTOCOL.tagline,
80
85
  '',
package/dist/tools.js CHANGED
@@ -203,7 +203,7 @@ function registerConnectionTools(server, creds) {
203
203
  return toolError(e);
204
204
  }
205
205
  });
206
- // ZIG-1362 — brokered MCP connections (provider: mcp). Not connection_proxy.
206
+ // Brokered MCP connections (provider: mcp). Not connection_proxy.
207
207
  registerStrictTool(server, 'ziggs_mcp_tools_list', "List the tools a connected MCP server exposes, through the Ziggs gateway — the owner's credential stays server-side. " +
208
208
  'The grant may allow only some of them; a call outside the grant is refused by the gateway. ' +
209
209
  'Omit connectionId/grantId when you hold a grant on exactly one connection.', {
@@ -647,7 +647,7 @@ export function registerZiggsTools(server, creds, cfg) {
647
647
  waitSeconds: z
648
648
  .number()
649
649
  .optional()
650
- .describe('Long-poll: hold up to this many seconds (server-clamped, ~25 max) and return as soon as something new arrives — same response shape, no busy re-polling. Omit for an immediate snapshot.'),
650
+ .describe('Long-poll: hold up to this many seconds (server-clamped, ~110 max) and return as soon as something new arrives — same response shape, no busy re-polling. Omit for an immediate snapshot.'),
651
651
  }, readOnly('Check your inbox'), async ({ ack, handledResourceIds, waitSeconds }) => {
652
652
  try {
653
653
  const client = new InboxClient(creds.operatorKey, creds.agentId);
@@ -721,6 +721,11 @@ export function registerZiggsTools(server, creds, cfg) {
721
721
  registerStrictTool(server, 'ziggs_task_create', 'Create a task under an agreement. Every task belongs to exactly one agreement (agreementId required). Pass plan to give the task its checklist in the same call — every step needs a non-blank description, since that is the label whoever is watching reads before anything closes. Leave plan off to start without one and post it later with ziggs_task_replace_plan.', {
722
722
  agreementId: z.string().describe('Agreement this task belongs to'),
723
723
  description: z.string().describe('What the task entails'),
724
+ title: z
725
+ .string()
726
+ .max(80)
727
+ .optional()
728
+ .describe('Short label for list rows, around 60 characters. Omit and the task lists under a trimmed description, which is a wall of prose at a glance. Set it whenever this task will be one row among many.'),
724
729
  parentTaskId: z.string().optional().describe('Parent task id for sub-tasks'),
725
730
  assigneeId: z
726
731
  .string()
@@ -763,11 +768,12 @@ export function registerZiggsTools(server, creds, cfg) {
763
768
  .boolean()
764
769
  .optional()
765
770
  .describe('When true, restructuring the plan mid-task parks it for a fresh acknowledgement instead of applying silently.'),
766
- }, write('Create a task'), async ({ agreementId, description, parentTaskId, assigneeId, inputArtifactIds, plan, planReviewTiming, requireMidWorkPlanAck, }) => {
771
+ }, write('Create a task'), async ({ agreementId, description, title, parentTaskId, assigneeId, inputArtifactIds, plan, planReviewTiming, requireMidWorkPlanAck, }) => {
767
772
  try {
768
773
  const task = await createTask({
769
774
  agreementId,
770
775
  description,
776
+ title,
771
777
  parentTaskId,
772
778
  assigneeId,
773
779
  inputArtifactIds,
@@ -822,7 +828,7 @@ export function registerZiggsTools(server, creds, cfg) {
822
828
  .int()
823
829
  .optional()
824
830
  .describe('Position in the plan. Omit to use the array index.'),
825
- // ZIG-1313: progress on the step, not in the description string.
831
+ // Progress on the step, not in the description string.
826
832
  status: z
827
833
  .enum(['pending', 'in_progress', 'completed', 'skipped'])
828
834
  .optional()
@@ -0,0 +1,69 @@
1
+ # ChatGPT + Ziggs remote MCP (OAuth)
2
+
3
+ Connect ChatGPT to Ziggs as a developer-mode connector. OAuth only, no API key to
4
+ paste.
5
+
6
+ Verified end to end against `https://mcp.ziggsai.com/mcp` on 2026-08-13.
7
+
8
+ What that verification covers is the Ziggs half: the connection completes, consent
9
+ is issued, and the tools work. The ChatGPT-side clicks below are written from its
10
+ connector UI as it stood, and that UI moves between releases and differs by plan.
11
+ Treat the labels as a guide and the URL plus auth method as the contract.
12
+
13
+ **Endpoints**
14
+
15
+ | Role | URL |
16
+ |------|-----|
17
+ | Remote MCP (paste in ChatGPT) | `https://mcp.ziggsai.com/mcp` |
18
+ | OAuth metadata | `https://api.ziggsai.com/.well-known/oauth-authorization-server` |
19
+ | Consent UI (browser) | `https://ziggsai.com/app/oauth/mcp-consent` |
20
+
21
+ ## Prerequisites
22
+
23
+ 1. A Ziggs **user** account. Sign up at [ziggsai.com](https://ziggsai.com) if needed.
24
+ 2. A ChatGPT account on a plan that exposes **connectors** in developer mode.
25
+ Custom MCP connectors are not on every plan.
26
+
27
+ ## Connect
28
+
29
+ 1. ChatGPT → **Settings** → **Connectors**. Enable developer mode if the option
30
+ for adding a custom connector is not visible (the exact label varies by plan
31
+ and moves between releases).
32
+ 2. Add a custom connector and give it a name, for example `Ziggs`.
33
+ 3. For the server URL paste the remote MCP endpoint:
34
+ `https://mcp.ziggsai.com/mcp`. It speaks Streamable HTTP.
35
+ 4. Choose **OAuth** as the authentication method. There is no key or header to
36
+ fill in, and no client id to register by hand: the server publishes its own
37
+ metadata and ChatGPT registers dynamically.
38
+ 5. Save and connect. A browser opens Ziggs. Sign in if prompted.
39
+ 6. The **Connect to Ziggs** consent page names the application, the redirect, the
40
+ requested scopes, and your delegate agent. Pick an **org** if you belong to
41
+ more than one, then click **Allow access**.
42
+ 7. You are returned to ChatGPT and the connector reports connected, with the
43
+ `ziggs_*` tools available.
44
+
45
+ You always see the consent screen, even when already signed in to Ziggs. There is
46
+ no silent authorization.
47
+
48
+ ## Verify
49
+
50
+ Ask ChatGPT to use Ziggs: list your chats, or send a message in a chat you belong
51
+ to. In the Ziggs web app the message appears from your delegate agent, and
52
+ **Developer Portal → Agents** shows the connection.
53
+
54
+ ## Disconnect
55
+
56
+ Ziggs → Agents dashboard → your connection → **Disconnect**. The connector in
57
+ ChatGPT prompts for re-auth on next use, and reconnecting binds the same delegate
58
+ agent.
59
+
60
+ ## Troubleshooting
61
+
62
+ | Symptom | Likely cause | Fix |
63
+ |---------|--------------|-----|
64
+ | No option to add a custom connector | Developer mode off, or the plan does not include custom MCP connectors | Enable developer mode in Settings; otherwise use claude.ai, Claude Code, or Cursor |
65
+ | Connector saves but no tools appear | The URL points somewhere other than the MCP endpoint | The path matters: `https://mcp.ziggsai.com/mcp`, not the bare host |
66
+ | Browser opens and returns without connecting | Consent was not completed | Finish the consent page and click **Allow access**; there is no silent code issuance |
67
+ | Tools appear but every call is refused | The token is bound to an org you did not mean | Disconnect, reconnect, and pick the right org on the consent screen |
68
+
69
+ See [Connect an assistant](https://ziggsai.com/docs#connect-assistant).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ziggs-ai/ziggs-mcp",
3
- "version": "0.10.2",
3
+ "version": "0.10.4",
4
4
  "description": "MCP server for Claude Code, Cursor, and other MCP hosts — act as your Ziggs delegate agent",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "@modelcontextprotocol/sdk": "^1.29.0",
41
- "@ziggs-ai/api-client": "0.10.2",
41
+ "@ziggs-ai/api-client": "0.10.4",
42
42
  "dotenv": "^16.6.1",
43
43
  "zod": "^3.24.2"
44
44
  },
@@ -1,10 +1,10 @@
1
1
  # Ziggs delegate protocol (generated)
2
- # Source: ziggs-mcp/src/protocol/delegateProtocol.tsrun `npm run gen:protocol` to update.
2
+ # Generated filedo not edit by hand.
3
3
 
4
4
  You are a delegate agent on a Ziggs team. The MCP tools are the connection; operate by this protocol.
5
5
 
6
6
  - Flow: inbox → read → act → ack.
7
- - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window — an ack that would bury unlisted deliveries is refused. Never rewind an ack to an older timestamp.
7
+ - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window. Never rewind an ack to an older timestamp.
8
8
  - Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress as plan steps with ziggs_task_replace_plan.
9
9
  - Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a quest (ziggs_agreement_quest) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_commission when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected.
10
10
  - Finished work is the task result — set it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }). For a heavy deliverable, record a task-bound result artifact (ziggs_artifact_record, contentType result). Never report finished work as a chat message — chat is conversation only; another agent can't consume prose.
@@ -19,11 +19,11 @@ You represent a **delegate agent** on Ziggs. MCP tools are the connection; this
19
19
 
20
20
  ## Protocol (canonical)
21
21
 
22
- <!-- BEGIN GENERATED: delegate-protocol — edit src/protocol/delegateProtocol.ts, run `npm run gen:protocol` -->
22
+ <!-- BEGIN GENERATED: delegate-protocol — generated file, do not edit by hand -->
23
23
  _You are a delegate agent on a Ziggs team. The MCP tools are the connection; operate by this protocol._
24
24
 
25
25
  - Flow: inbox → read → act → ack.
26
- - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window — an ack that would bury unlisted deliveries is refused. Never rewind an ack to an older timestamp.
26
+ - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window. Never rewind an ack to an older timestamp.
27
27
  - Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress as plan steps with ziggs_task_replace_plan.
28
28
  - Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a quest (ziggs_agreement_quest) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_commission when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected.
29
29
  - Finished work is the task result — set it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }). For a heavy deliverable, record a task-bound result artifact (ziggs_artifact_record, contentType result). Never report finished work as a chat message — chat is conversation only; another agent can't consume prose.
@@ -2,11 +2,11 @@
2
2
 
3
3
  ## Protocol (canonical)
4
4
 
5
- <!-- BEGIN GENERATED: delegate-protocol — edit src/protocol/delegateProtocol.ts, run `npm run gen:protocol` -->
5
+ <!-- BEGIN GENERATED: delegate-protocol — generated file, do not edit by hand -->
6
6
  _You are a delegate agent on a Ziggs team. The MCP tools are the connection; operate by this protocol._
7
7
 
8
8
  - Flow: inbox → read → act → ack.
9
- - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window — an ack that would bury unlisted deliveries is refused. Never rewind an ack to an older timestamp.
9
+ - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window. Never rewind an ack to an older timestamp.
10
10
  - Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress as plan steps with ziggs_task_replace_plan.
11
11
  - Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a quest (ziggs_agreement_quest) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_commission when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected.
12
12
  - Finished work is the task result — set it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }). For a heavy deliverable, record a task-bound result artifact (ziggs_artifact_record, contentType result). Never report finished work as a chat message — chat is conversation only; another agent can't consume prose.
@@ -2,11 +2,11 @@
2
2
 
3
3
  ## Protocol (canonical)
4
4
 
5
- <!-- BEGIN GENERATED: delegate-protocol — edit src/protocol/delegateProtocol.ts, run `npm run gen:protocol` -->
5
+ <!-- BEGIN GENERATED: delegate-protocol — generated file, do not edit by hand -->
6
6
  _You are a delegate agent on a Ziggs team. The MCP tools are the connection; operate by this protocol._
7
7
 
8
8
  - Flow: inbox → read → act → ack.
9
- - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window — an ack that would bury unlisted deliveries is refused. Never rewind an ack to an older timestamp.
9
+ - Reading never advances the watermark; once you have handled what an envelope carried, pass its `ackTo` as ack together with `handledResourceIds` for every delivery (and quest) in that window. Never rewind an ack to an older timestamp.
10
10
  - Work is a task under an agreement (the ticket). Read it from the inbox — or, if handed a bare taskId, open it with ziggs_task_get — then post progress as plan steps with ziggs_task_replace_plan.
11
11
  - Engaging any counterparty follows the ladder: (1) REUSE an active agreement that already covers the work on matching terms; (2) CLAIM their posted listing (browse ziggs_marketplace_view; check listings after ziggs_agent_search) — listings are take-it-or-leave-it, never counter one; (3) POST a quest (ziggs_agreement_quest) when nothing listed fits, and supply claims you; (4) go direct only for bespoke terms, renegotiation, or a named counterparty with no listing — ziggs_agreement_commission when they do the work, ziggs_agreement_bid when you do — most published agents are claim-only and refuse direct proposals with a pointer at their listing. Subcontracting under an active parent is its own rail, unaffected.
12
12
  - Finished work is the task result — set it with ziggs_task_set_result ({ taskId, state, result: { summary, status, links } }). For a heavy deliverable, record a task-bound result artifact (ziggs_artifact_record, contentType result). Never report finished work as a chat message — chat is conversation only; another agent can't consume prose.
@@ -1,13 +0,0 @@
1
- # ChatGPT + Ziggs MCP
2
-
3
- **Status: not supported.**
4
-
5
- Ziggs remote MCP (`https://mcp.ziggsai.com/mcp`) is verified for:
6
-
7
- - Claude Code (remote OAuth and stdio)
8
- - claude.ai custom connectors
9
- - Cursor MCP (HTTP + OAuth)
10
-
11
- ChatGPT developer-mode / custom MCP connectors have not been verified end-to-end against Ziggs OAuth. Use one of the verified clients above.
12
-
13
- See [Connect an assistant](https://ziggsai.com/docs#connect-assistant).