@zvndev/circular-mcp 0.1.3 → 0.1.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 +28 -3
- package/lib/server.mjs +7 -5
- package/lib/tools.mjs +13 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,9 +72,10 @@ Steps come in three kinds:
|
|
|
72
72
|
- **ACTION**: you do it, then tick it with `circular_complete_step` and real
|
|
73
73
|
evidence in `proof` (test output, a diff summary, a link).
|
|
74
74
|
- **REVIEW**: a human gate. `circular_complete_step` answers **403** for these,
|
|
75
|
-
always: an agent may never sign off its own review.
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
always: an agent may never sign off its own review. Enrolled runner connections
|
|
76
|
+
cannot mark done with open stored REVIEW or AUTOMATION steps, even when paused.
|
|
77
|
+
Legacy callers retain the configured legacy process-gate policy (currently
|
|
78
|
+
off); an unticked review is never an agent approval. Post proof/commentary.
|
|
78
79
|
- **AUTOMATION**: ticked by its own CI/GitHub signal, not by hand.
|
|
79
80
|
|
|
80
81
|
`circular_get_next_work` deliberately **does not reserve** the issue it returns.
|
|
@@ -82,6 +83,30 @@ Reservations live in `circular_claim_issue_work`, keyed by a stable request id
|
|
|
82
83
|
for safe retry after a lost response. Several candidates come back so two agents
|
|
83
84
|
pulling at the same moment can pick another candidate if a reservation loses.
|
|
84
85
|
|
|
86
|
+
## MCP tools versus an always-on computer
|
|
87
|
+
|
|
88
|
+
Adding this stdio connector makes tools available to an agent. It does not
|
|
89
|
+
start a provider, register a worker, or install a background service. Circular's
|
|
90
|
+
cloud durably queues assignments, mentions and workflow events. An explicitly
|
|
91
|
+
enrolled **foreground local runner** polls its addressed deliveries and launches
|
|
92
|
+
the installed Codex or Claude CLI on that computer, one job at a time. Its
|
|
93
|
+
connection and provider subscription stay private to that computer.
|
|
94
|
+
|
|
95
|
+
Use the [public connection docs](https://gocircular.dev/docs) after
|
|
96
|
+
browser login (or importing an admin-created workspace-agent connection), linking
|
|
97
|
+
the project repository, and connecting the local checkout. Keep `circular runner
|
|
98
|
+
start --connection CONNECTION_ID` running; an OS service is a separate explicit
|
|
99
|
+
operator setup, never an automatic side effect of installing MCP or Desktop.
|
|
100
|
+
|
|
101
|
+
`runner register --allow-circular-tools` explicitly permits unattended use of
|
|
102
|
+
the runner's generated Circular MCP tools. `--allow-write` separately permits
|
|
103
|
+
local code edits within the grant/profile ceiling. Neither flag grants access
|
|
104
|
+
to unrelated MCP servers or lets an agent approve human-only steps. A runner
|
|
105
|
+
works its already leased delivery rather than pulling unrelated `next-work`
|
|
106
|
+
candidates. Registration requires the explicit Circular tool opt-in to avoid
|
|
107
|
+
provider approval prompts stranding headless work. Use an interactive agent if
|
|
108
|
+
you do not want unattended tool calls.
|
|
109
|
+
|
|
85
110
|
## Authentication
|
|
86
111
|
|
|
87
112
|
Identical to the CLI. The normal path is managed browser sign-in:
|
package/lib/server.mjs
CHANGED
|
@@ -21,18 +21,20 @@ const SUPPORTED_PROTOCOL_VERSIONS = new Set([
|
|
|
21
21
|
"2024-11-05",
|
|
22
22
|
]);
|
|
23
23
|
|
|
24
|
-
export const SERVER_INFO = { name: "circular-mcp", version: "0.1.
|
|
24
|
+
export const SERVER_INFO = { name: "circular-mcp", version: "0.1.4" };
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* The briefing every client sees on connect. This is the only onboarding an
|
|
28
28
|
* agent gets before it starts calling tools, so it states the model (pull-based,
|
|
29
|
-
*
|
|
29
|
+
* cloud coordination versus explicitly enrolled local execution), the loop,
|
|
30
|
+
* and the two absolute rules.
|
|
30
31
|
*/
|
|
31
32
|
export const INSTRUCTIONS = [
|
|
32
|
-
"Circular is the source of truth for planning and task management.
|
|
33
|
-
"
|
|
33
|
+
"Circular is the source of truth for planning and task management. Its cloud queues work and stores context and proof; it does not host agent execution or sell inference. Interactive agents pull work themselves. A separately enrolled foreground runner polls addressed deliveries and starts the installed Codex or Claude CLI on its own computer, using that computer's private, scoped connection and provider subscription.",
|
|
34
|
+
"MCP supplies tools; adding this connector does not start a worker or install an OS service. For interactive work, call circular_get_next_work and read each candidate's `situation.disposition`; only `ready_for_you` and `no_process` are yours to pick up. An enrolled runner already owns a specific delivery: stay on that task instead of pulling or claiming unrelated candidates.",
|
|
34
35
|
AGENT_LOOP_SUMMARY,
|
|
35
|
-
"Two rules are absolute. First, an API key can NEVER complete a REVIEW step; review is the human sign-off, refused for every api_key caller including the agent that did the work.
|
|
36
|
+
"Two rules are absolute. First, an API key can NEVER complete a REVIEW step; review is the human sign-off, refused for every api_key caller including the agent that did the work. Enrolled runner agents cannot mark done while stored REVIEW or AUTOMATION steps remain open or unreadable, even when their computer is paused and the legacy process gate is disabled. Legacy callers still follow the server's configured completion policy; do not assume an open review always blocks them or that they may approve it. Post proof and leave human-only steps unticked. Second, never invent, reorder, or edit the step ladder; it comes from the team's Process. Record proof on the step it belongs to with circular_complete_step, using the stepId exactly as returned.",
|
|
37
|
+
"Runner opt-ins are separate: --allow-write permits local repository edits within the grant/profile ceiling; registration requires --allow-circular-tools to explicitly permit unattended use of the generated Circular MCP tools. Neither flag authorizes another account, repository, unrelated MCP server or human approval. A runner handles one job at a time and no background service is installed automatically.",
|
|
36
38
|
"Do not create local Markdown TODO, PLAN, status, or handoff files as a parallel tracker. Use circular_plan_tasks for plans and circular_comment_issue for updates, handoffs, and narrative proof. Markdown is only for durable product documentation or an artifact the user explicitly requested.",
|
|
37
39
|
].join(" ");
|
|
38
40
|
|
package/lib/tools.mjs
CHANGED
|
@@ -30,7 +30,9 @@ export const AGENT_LOOP_SUMMARY =
|
|
|
30
30
|
"(6) circular_complete_step with real proof for each ACTION step you finish, " +
|
|
31
31
|
"(7) circular_comment_issue for the narrative handoff, " +
|
|
32
32
|
"(8) circular_release_issue_work_claim when you stop holding the lane, " +
|
|
33
|
-
"(9) circular_update_issue to done
|
|
33
|
+
"(9) circular_update_issue to done only when the server's completion policy permits it; " +
|
|
34
|
+
"enrolled runner agents must wait for stored human REVIEW and AUTOMATION gates. " +
|
|
35
|
+
"This candidate-pull loop is for interactive agents; a runner stays on its already leased delivery.";
|
|
34
36
|
|
|
35
37
|
/** Drop undefined keys so we never send `"priority": undefined`. */
|
|
36
38
|
function prune(obj) {
|
|
@@ -109,8 +111,8 @@ export const TOOLS = [
|
|
|
109
111
|
{
|
|
110
112
|
name: "circular_get_next_work",
|
|
111
113
|
description:
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
+
"The interactive pull primitive: ask Circular what to work on. An enrolled local runner " +
|
|
115
|
+
"instead polls addressed deliveries and starts its installed provider; it must stay on its leased task. " +
|
|
114
116
|
"WHEN: at the start of every work cycle, and again after you finish an issue. " +
|
|
115
117
|
"RETURNS: `actor` (who Circular thinks you are, including `canCompleteReviewSteps`), `limit`, " +
|
|
116
118
|
"and `candidates`, highest priority first, with done, cancelled and blocked issues already " +
|
|
@@ -119,13 +121,14 @@ export const TOOLS = [
|
|
|
119
121
|
"READ `situation.disposition` BEFORE ACTING. It is one of: " +
|
|
120
122
|
"`ready_for_you` (the current step is an open ACTION step you may complete: proceed), " +
|
|
121
123
|
"`waiting_on_human_review` (the current step is a REVIEW step no API key can tick: leave it " +
|
|
122
|
-
"unticked
|
|
124
|
+
"unticked and post a handoff; enrolled runner agents cannot close it before human review), " +
|
|
123
125
|
"`waiting_on_automation` (an AUTOMATION step, ticked by its own signal, not by you: skip it), " +
|
|
124
126
|
"`assigned_to_someone_else` (the current step names another person, team, or agent: skip it), " +
|
|
125
127
|
"`process_complete` (every step ticked; it only needs closing), " +
|
|
126
128
|
"`no_process` (no ladder: do the work, comment, set it to done), " +
|
|
127
129
|
"`ladder_unreadable` (the stored steps cannot be parsed, so Circular refuses step edits on " +
|
|
128
|
-
"this issue: do not try to repair the ladder
|
|
130
|
+
"this issue: do not try to repair the ladder; enrolled runner agents cannot close it, " +
|
|
131
|
+
"while legacy callers follow the configured completion policy). " +
|
|
129
132
|
"`situation.currentStep` gives the open step's id, kind, `assignment`, `assignedTo`, " +
|
|
130
133
|
"`canComplete`, and a `refusal` reason when you may not complete it. " +
|
|
131
134
|
"IT DOES NOT RESERVE the issue: several agents can be handed the same candidate. Reserve by " +
|
|
@@ -287,15 +290,15 @@ export const TOOLS = [
|
|
|
287
290
|
name: "circular_update_issue",
|
|
288
291
|
description:
|
|
289
292
|
"Update an issue's status, priority, title, description, or assignee. This is also how you " +
|
|
290
|
-
"
|
|
291
|
-
"status to in_progress
|
|
292
|
-
"not claim and another agent may be holding the same one. " +
|
|
293
|
+
"record progress, not reserve work: use circular_claim_issue_work for an interactive claim, " +
|
|
294
|
+
"then set status to in_progress. circular_get_next_work does not claim; a runner already holds its addressed delivery. " +
|
|
293
295
|
"WHEN: in_progress on pickup; done once the whole ladder is finished. " +
|
|
294
296
|
"REFUSES with 409: moving to done while any blocking issue is still open. That is the " +
|
|
295
297
|
"dependency graph working, not an obstacle to route around: post your proof, leave a comment, " +
|
|
296
298
|
"and pick up something that is not blocked. " +
|
|
297
|
-
"
|
|
298
|
-
"
|
|
299
|
+
"Enrolled runner agents also receive 409 for open stored REVIEW or AUTOMATION steps or an unreadable ladder, " +
|
|
300
|
+
"even if their computer is paused. Legacy callers follow PROCESS_REVIEW_GATE_ENABLED, currently off; " +
|
|
301
|
+
"an open REVIEW step alone does not block those callers while that legacy gate is off. No API key may complete a REVIEW step. " +
|
|
299
302
|
"Setting status to cancelled is never gated, because abandoning work must always be possible. " +
|
|
300
303
|
"Returns the updated issue.",
|
|
301
304
|
inputSchema: {
|
package/package.json
CHANGED