@agentistics/mcp 2.203.1 → 2.204.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.
@@ -23,6 +23,43 @@ function liveDeliveryQuery(a) {
23
23
  return q.toString() ? `?${q}` : "";
24
24
  }
25
25
 
26
+ // delivery-calendar-args.ts
27
+ var CALENDAR_STAGES = ["queue", "blocked", "running", "qa", "adjust", "leader", "merge", "ci", "published"];
28
+ var CALENDAR_PRIORITIES = ["urgent", "high", "medium", "low"];
29
+ function list(v, allowed) {
30
+ const items = (Array.isArray(v) ? v : typeof v === "string" ? v.split(",") : []).filter((x) => typeof x === "string").map((x) => x.trim()).filter(Boolean);
31
+ return (allowed ? items.filter((x) => allowed.includes(x)) : items).join(",");
32
+ }
33
+ function deliveryCalendarQuery(a) {
34
+ const q = new URLSearchParams;
35
+ const task = typeof a?.task === "string" ? a.task.trim() : "";
36
+ if (task)
37
+ q.set("task", task);
38
+ const subtask = typeof a?.subtask === "string" ? a.subtask.trim() : "";
39
+ if (subtask)
40
+ q.set("subtask", subtask);
41
+ for (const [key, value] of [
42
+ ["version", list(a?.version)],
43
+ ["stage", list(a?.stage, CALENDAR_STAGES)],
44
+ ["harness", list(a?.harness)],
45
+ ["priority", list(a?.priority, CALENDAR_PRIORITIES)]
46
+ ])
47
+ if (value)
48
+ q.set(key, value);
49
+ for (const key of ["from", "to"]) {
50
+ const v = a?.[key];
51
+ if (typeof v === "string" && v.trim())
52
+ q.set(key, v.trim());
53
+ }
54
+ if (a?.all === true)
55
+ q.set("all", "1");
56
+ if (a?.confirmedOnly === true)
57
+ q.set("confirmed", "1");
58
+ if (a?.format === "ics")
59
+ q.set("format", "ics");
60
+ return q.toString() ? `?${q}` : "";
61
+ }
62
+
26
63
  // ../core/src/local-models.ts
27
64
  var LOCAL_RUNTIME_PREFIXES = [
28
65
  "ollama",
@@ -200,6 +237,51 @@ function calcCost(usage, modelId) {
200
237
  const cacheWriteCost = hasTtlBreakdown ? (usage.cacheCreation1hInputTokens ?? 0) / 1e6 * price.cacheWrite1h + (usage.cacheCreation5mInputTokens ?? 0) / 1e6 * price.cacheWrite : usage.cacheCreationInputTokens / 1e6 * price.cacheWrite;
201
238
  return usage.inputTokens / 1e6 * price.input + usage.outputTokens / 1e6 * price.output + usage.cacheReadInputTokens / 1e6 * price.cacheRead + cacheWriteCost;
202
239
  }
240
+ // ../core/src/contextWindows.ts
241
+ var ANTHROPIC_DOCS = "platform.claude.com/docs/en/about-claude/models/overview";
242
+ var CONTEXT_WINDOWS = {
243
+ "gemini-3.8-flash": { tokens: 1048576, verifiedAt: "2026-10-20", source: "ai.google.dev/gemini-api/docs/models/gemini-3.8-flash" },
244
+ "claude-fable-5": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
245
+ "claude-mythos-5": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
246
+ "claude-opus-5": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
247
+ "claude-opus-4-8": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
248
+ "claude-opus-4-7": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
249
+ "claude-opus-4-6": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
250
+ "claude-sonnet-5": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
251
+ "claude-sonnet-4-6": { tokens: 1e6, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS },
252
+ "claude-haiku-4-5": { tokens: 200000, verifiedAt: "2026-08-14", source: ANTHROPIC_DOCS }
253
+ };
254
+ function resolveContextWindow(modelId) {
255
+ const id = (modelId ?? "").trim();
256
+ if (id === "")
257
+ return null;
258
+ const exact = CONTEXT_WINDOWS[id];
259
+ if (exact)
260
+ return exact;
261
+ let best = null;
262
+ for (const [key, win] of Object.entries(CONTEXT_WINDOWS)) {
263
+ if (!id.startsWith(key))
264
+ continue;
265
+ if (!best || key.length > best.key.length)
266
+ best = { key, win };
267
+ }
268
+ return best?.win ?? null;
269
+ }
270
+ function contextFraction(used, window) {
271
+ if (used === undefined || window === undefined)
272
+ return null;
273
+ if (!Number.isFinite(used) || !Number.isFinite(window))
274
+ return null;
275
+ if (window <= 0 || used < 0)
276
+ return null;
277
+ return used / window;
278
+ }
279
+ function contextReading(meta) {
280
+ const ok = (n) => typeof n === "number" && Number.isFinite(n) && n > 0;
281
+ const used = ok(meta.context_tokens) ? meta.context_tokens : null;
282
+ const window = ok(meta.context_window) ? meta.context_window : resolveContextWindow(meta.model)?.tokens ?? null;
283
+ return { used, window, fraction: used !== null && window !== null ? contextFraction(used, window) : null };
284
+ }
203
285
  // ../core/src/tokens.ts
204
286
  var EMPTY_TOKENS = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
205
287
  function usageTokens2(u) {
@@ -967,6 +1049,7 @@ var AGENT_TOOL_POLICY = {
967
1049
  agentistics_task_claim: { ...TASKS, risk: "W", routes: ["POST /api/tasks/:ref/claim"], reason: "a lease that expires on its own and can be released" },
968
1050
  agentistics_task_activity: { ...TASKS, risk: "R", routes: ["GET /api/tasks/activity"], reason: "reads the board activity log" },
969
1051
  agentistics_live_delivery: { ...TASKS, risk: "R", routes: ["GET /api/tasks/live"], reason: "reads the live delivery line and the leaders band; changes nothing" },
1052
+ agentistics_delivery_calendar: { ...TASKS, risk: "R", routes: ["GET /api/deliveries/calendar"], reason: "reads the delivery calendar (dates, versions, ETAs); changes nothing" },
970
1053
  agentistics_task_edit: { ...TASKS, risk: "W", routes: ["POST /api/tasks/:ref"], reason: "edits task fields; reversible by another edit" },
971
1054
  agentistics_task_session: {
972
1055
  ...TASKS,
@@ -1008,7 +1091,7 @@ var AGENT_TOOL_POLICY = {
1008
1091
  agentistics_task_phase: {
1009
1092
  ...TASKS,
1010
1093
  risk: "W",
1011
- routes: ["GET /api/deliveries", "GET /api/deliveries/:subtask", "POST /api/deliveries/:subtask", "POST /api/deliveries/release", "POST /api/deliveries/reconcile"],
1094
+ routes: ["GET /api/deliveries", "GET /api/deliveries/:subtask", "POST /api/deliveries/:subtask", "POST /api/deliveries/release", "POST /api/deliveries/reconcile", "POST /api/deliveries/antigas"],
1012
1095
  reason: "reads or moves a delivery through the fixed phase table; release declares which pieces a release shipped (leader/owner only; the host still reads the green run and the tag); reconcile backfills merged/released pieces (dry run unless apply, leader/owner only); a skipped phase is refused (422 fase_pulada) and every gate is checked by the host from evidence, never from the caller"
1013
1096
  },
1014
1097
  agentistics_task_stage: {
@@ -1224,6 +1307,10 @@ var GO_WINDOW_MS = {
1224
1307
  function isFlowRunId(id) {
1225
1308
  return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(id);
1226
1309
  }
1310
+ // ../core/src/deliveryCalendar.ts
1311
+ var BRT_OFFSET_MS = -3 * 3600000;
1312
+ var RECENT_ACTIVITY_MS = 24 * 3600000;
1313
+ var BLIP_MS = 15 * 60000;
1227
1314
  // ../core/src/vaultPassword.ts
1228
1315
  var VAULT_PASSWORD_RULES = ["length", "upper", "special", "digit"];
1229
1316
  var VAULT_PASSWORD_MIN_LENGTH = 9;
@@ -2104,6 +2191,19 @@ var PROJECTED_TOOLS = {
2104
2191
  // agentistics-mcp.ts
2105
2192
  var API = process.env.AGENTISTICS_API ?? "http://localhost:47291";
2106
2193
  var HARNESS_PARAM = harnessParam(false);
2194
+ function contextFields(s) {
2195
+ if (!HARNESS_CAPABILITIES[sessionHarness(s)]?.contextWindow)
2196
+ return {};
2197
+ const r = contextReading({ context_tokens: s.context_tokens, context_window: s.context_window, model: s.model });
2198
+ if (r.used === null)
2199
+ return {};
2200
+ return {
2201
+ contextTokens: r.used,
2202
+ contextWindow: r.window,
2203
+ contextFraction: r.fraction,
2204
+ ...r.window === null ? { contextLimit: "not reported" } : {}
2205
+ };
2206
+ }
2107
2207
  async function nativeVisibleNow() {
2108
2208
  try {
2109
2209
  const res = await fetch(`${API}/api/engine`, { signal: AbortSignal.timeout(2000) });
@@ -2153,6 +2253,12 @@ var CATALOG = [
2153
2253
  { id: "sessions.highlights", label: "Highlights", category: "sessions", defaultW: 12, defaultH: 6, minW: 6, minH: 3, description: "Record-breaking sessions" },
2154
2254
  { id: "sessions.recent", label: "Recent sessions", category: "sessions", defaultW: 12, defaultH: 7, minW: 6, minH: 4, description: "List of most recent sessions" }
2155
2255
  ];
2256
+ async function apiGetText(path) {
2257
+ const res = await fetch(`${API}${path}`);
2258
+ if (!res.ok)
2259
+ throw new Error(`agentistics API ${path} → HTTP ${res.status}`);
2260
+ return res.text();
2261
+ }
2156
2262
  async function apiGet(path) {
2157
2263
  const res = await fetch(`${API}${path}`);
2158
2264
  if (!res.ok)
@@ -2486,7 +2592,7 @@ var TOOLS = [
2486
2592
  type: "object",
2487
2593
  properties: {
2488
2594
  task: { type: "string", description: "A task id or part of its title." },
2489
- stage: { type: "string", enum: ["queue", "running", "qa", "adjust", "leader", "merge", "published"] },
2595
+ stage: { type: "string", enum: ["queue", "blocked", "running", "qa", "adjust", "leader", "merge", "ci", "completed", "published"] },
2490
2596
  stalledOnly: { type: "boolean", description: "Only deliveries that need a person, lost an agent or are blocked." },
2491
2597
  tab: { type: "string", enum: ["active", "queue", "published", "all"], description: "The screen's tab: active (Em andamento), queue (Na fila), published (Publicado) or all (Tudo). Default all." },
2492
2598
  period: { type: "string", enum: ["24h", "7d", "30d", "all"], description: "How far back Publicado reaches. Default 24h." },
@@ -2551,13 +2657,38 @@ var TOOLS = [
2551
2657
  description: "Delete a task and its comments, subtasks, files and links. The SESSIONS filed under it are kept — deleting a board entry never deletes work.",
2552
2658
  inputSchema: { type: "object", properties: { ref: { type: "string" } }, required: ["ref"] }
2553
2659
  },
2660
+ {
2661
+ name: "agentistics_delivery_calendar",
2662
+ description: "BETA. The DELIVERY CALENDAR — when each piece of work started, when it is expected to ship, which release version it rides and when a version really went out; the same source and rules as the \"Calendário de entregas\" screen (`agentop flow calendario` prints the same). Returns `pieces` (task, subtask, stage, `version`, harness/model, priority, `startedAtMs`, `stageEta` and `publishEta` — `kind: none` means there is NO estimate: say so, never invent a time — `publishedAtMs`, `dueDate`, `confirmed`, `late`), `versions` (each with `state` published|planned, `atMs` = the real publication or the LATEST piece estimate, `basis` published|estimate|partial|none, the pieces and the count per stage) and `marks` (an account's usage window renewing, a task's due day). Times are epoch ms; day arguments are BRT days (America/Sao_Paulo). By default only pieces of tasks being worked on now; pass `all` for the history too. Filters: `task` (id or part of the title), `subtask`, `version` (one or a list), `stage`, `harness`, `priority`, `from`/`to` (yyyy-MM-dd or an ISO instant — keeps what touches the period), `confirmedOnly` (published or a medium/high-confidence estimate). `format: \"ics\"` returns the filtered view as an .ics file instead of JSON.",
2663
+ inputSchema: {
2664
+ type: "object",
2665
+ properties: {
2666
+ task: { type: "string", description: "A task id or part of its title." },
2667
+ subtask: { type: "string", description: "A subtask id." },
2668
+ version: { anyOf: [{ type: "string" }, { type: "array", items: { type: "string" } }], description: "A release version (2.202.0) or a list." },
2669
+ stage: { anyOf: [{ type: "string" }, { type: "array", items: { type: "string" } }], description: "queue, blocked, running, qa, adjust, leader, merge, ci, published — one or a list." },
2670
+ harness: { anyOf: [{ type: "string" }, { type: "array", items: { type: "string" } }] },
2671
+ priority: { anyOf: [{ type: "string" }, { type: "array", items: { type: "string" } }], description: "urgent, high, medium, low." },
2672
+ from: { type: "string", description: "Start of the period: yyyy-MM-dd (BRT) or an ISO instant." },
2673
+ to: { type: "string", description: "End of the period (inclusive)." },
2674
+ all: { type: "boolean", description: "Include pieces of tasks not being worked on now (history)." },
2675
+ confirmedOnly: { type: "boolean", description: "Only published pieces or those with a medium/high-confidence estimate." },
2676
+ format: { type: "string", enum: ["json", "ics"] }
2677
+ },
2678
+ required: []
2679
+ }
2680
+ },
2554
2681
  {
2555
2682
  name: "agentistics_task_phase",
2556
2683
  description: "FLUXO.CICLO-COMPLETO — the minute `tick` also moves a piece in revisao_lider or pr_merge to ci BY ITSELF once its PR is merged (found from the piece's PR number, branch, the PR containing the sha QA approved, or its author worktree's branch; the merge gates `delecoes` + `mergeado` still run, and a refusal leaves the piece where it is with the reason), publishes ci pieces from the FIRST tag that contains the merge, and reminds the LIVE leader of the task (never the owner) of a piece waiting on them for 30 min, then every 2 h, at most 3 times. `get` with a `subtaskId` returns `tickReason`: why the tick has not moved it. `reconcile` (no `subtaskId`; `apply` true to write) is the one-shot BACKFILL: every piece in revisao_lider/pr_merge/ci matched to its merged PR and the first release tag containing it — a report of what moves and what cannot be proven, with the reason. " + "`tick` also enables the mandatory owner-request/placement flows through the official engine switches and reads canonical pedidos; after 10 minutes without complete staging it wakes the current live task leader, including after a handoff or restart, and never asks the owner. " + "Queue actions: `dequeue` withdraws a queued piece with a required free-text `reason` (task leader or owner only), keeps the draft/history, and refuses dispatch until explicitly restaged; `tick` reconciles stale queued pieces against board review/done/abandoned and records a comment. Vacancy counts live backend processes; lost/exited/closed sessions reserve no slots. " + "FLUXO.ENTREGA-DSL — read or move a DELIVERY (one subtask) through its fixed phases: fila → executando → qa → (ajuste ⇄ qa) → revisao_lider → pr_merge → ci → publicado, plus bloqueado (from any phase, back to the stored origin only). Any transition outside that table is REFUSED (422 `fase_pulada`) with a sentence naming what is missing — executando → revisao_lider, ajuste → revisao_lider and every other skip included. The gates each edge needs are run BY THE SERVER from evidence (predispatch, vaga, salvo = sha on origin per ls-remote, qa-modelo = QA model ≠ author model from the registry and never Sonnet over Sonnet, cabeca = the pushed branch is still at the sha QA tested, delecoes = no file deleted outright by the PR, mergeado = gh says the PR is MERGED, the merge commit is on origin/main and the PR head is the sha QA approved — the merge sha is READ FROM THE PR, never from you, release = the batch's version tag exists AND the release.yml run that produced it is green, read in the repository the release recorded); salvo needs every check run on the pushed head to have concluded green (pending or absent refuse); you never pass proof. `action`: `get` (default; omit `subtaskId` to list every delivery) | `phase` (`to` + what that edge reads: `verdict` APROVADO/REPROVADO + `findings` from qa, `reviewedSha` = the sha QA approved for revisao_lider → pr_merge, `detail` for a request for change or a failure reason) | `gate` (`name`: run ONE gate and record its evidence) | `block` (`reason` one of dependencia, pedido_de_bloqueio, limite, maquina, externo, fora_das_autorizacoes; `text`) | `unblock` (`detail`; the leader of the task or the owner — an owner-decision block only the owner) | `step` (`step` 1..9: the step of the current phase, for the Live %. The Live already DERIVES the step from real signals — a session open, a file edit, a test run, a commit, the gates, the PR — so report only when you know better; the card shows the larger of the two and says which it is. Works for a legacy piece with no delivery record too: only the board's `step` event is written, nothing is adopted into the flow) | `configure` (the LEADER of the task or the owner only; `patch`: versionTarget, humanGates [phases needing the owner's approval — skipped and recorded as 'pulado: modo autônomo' while autonomous mode is on], leaderSessionId, pr, tag, allowDeletions {paths, reason}; the QA and author sessions are never settable — the host records them from the sessions it opened and the registry) | `approve` (`phase`, `decision` approve|reject, `note`: answers a human gate the owner was ASKED about; a session identity is deliberately not sent, the owner answers through this same door as the Live card button and `agentop flow approve`) | `stage-run` (predispatch + vaga gates, then start the staged session and move to executando) | `merge` (delecoes gate, squash-merge the PR, move to ci; a failure goes back to revisao_lider) | `release` (the LEADER of the task or the owner DECLARES what a release contains: `version` x.y.z, `mergeSha` = the commit on main carrying it (information only; 40 characters, or a short sha the server resolves), optional `repo` = owner/name (default agentistics/agentistics), `subtaskIds` = every piece in it; no `subtaskId`. Each piece gets its record (a legacy one is adopted), versionTarget/mergeSha/tag/repo, goes to ci and then to publicado as soon as the tag `v<version>` exists and the release.yml run that produced it is green — read by the server from the TAG, not from the sha — with the release's own publish time; a declared piece is never sent back to revisao_lider by the tick (a red tag run keeps it in ci and wakes the leader once); done/abandoned/blocked/unknown/other-task pieces refuse the whole batch, which is written in ONE store write; a second run changes nothing). In autonomous mode nothing here ever asks or waits for the owner.",
2557
2684
  inputSchema: {
2558
2685
  type: "object",
2559
2686
  properties: {
2560
- action: { type: "string", enum: ["get", "phase", "gate", "block", "unblock", "dequeue", "tick", "step", "configure", "approve", "stage-run", "merge", "release", "reconcile"] },
2687
+ action: { type: "string", enum: ["get", "phase", "gate", "block", "unblock", "dequeue", "tick", "step", "configure", "approve", "stage-run", "merge", "release", "reconcile", "antigas"] },
2688
+ antigasAction: { type: "string", enum: ["publish", "archive", "conclude"], description: "antigas: 'conclude' (the screen's one click) completes the pieces with a session and archives the ones without; add `preview` to read the counts without changing anything. 'publish' marks the old record-less pieces published (optional `version`), 'archive' abandons them with an optional `reason`. Targets: `subtaskIds`, or `all` = every piece the reconcile classifies as antiga. Never deletes; a leader or the owner" },
2689
+ preview: { type: "boolean", description: "antigas conclude: only count what the click would do (concluded vs archived); changes nothing" },
2690
+ all: { type: "boolean", description: 'antigas: act on every old piece in the group "Antigas sem registro" (answers from the board at once; a piece the last reconcile proved is left out)' },
2691
+ expect: { type: "number", description: "antigas: the size of the group you saw; a different size refuses (409 count_changed) and nothing changes" },
2561
2692
  apply: { type: "boolean", description: "reconcile: write the moves (a leader of the task, or the owner). Absent/false = dry run: the report only" },
2562
2693
  subtaskId: { type: "string" },
2563
2694
  version: { type: "string", description: "release: the version the pieces shipped in, x.y.z" },
@@ -2573,7 +2704,7 @@ var TOOLS = [
2573
2704
  phase: { type: "string", description: "approve: the phase whose human gate is answered" },
2574
2705
  decision: { type: "string", enum: ["approve", "reject"] },
2575
2706
  note: { type: "string" },
2576
- reason: { type: "string", description: "dequeue: required free-text audit reason (leader only); block: dependencia | pedido_de_bloqueio | limite | maquina | externo | fora_das_autorizacoes" },
2707
+ reason: { type: "string", description: "dequeue: required free-text audit reason (leader only); block: dependencia | pedido_de_bloqueio | limite | maquina | externo | fora_das_autorizacoes; antigas archive: why (kept in the comment)" },
2577
2708
  text: { type: "string" },
2578
2709
  step: { type: "number" },
2579
2710
  patch: { type: "object" }
@@ -3202,6 +3333,13 @@ async function callTool(req) {
3202
3333
  const body = await apiSend("DELETE", `/api/tasks/${encodeURIComponent(ref)}`);
3203
3334
  return { content: [{ type: "text", text: JSON.stringify(body, null, 2) }] };
3204
3335
  }
3336
+ case "agentistics_delivery_calendar": {
3337
+ const q = deliveryCalendarQuery(args);
3338
+ if (args?.format === "ics")
3339
+ return { content: [{ type: "text", text: await apiGetText(`/api/deliveries/calendar${q}`) }] };
3340
+ const body = await apiGet(`/api/deliveries/calendar${q}`);
3341
+ return { content: [{ type: "text", text: JSON.stringify(body, null, 2) }] };
3342
+ }
3205
3343
  case "agentistics_task_phase": {
3206
3344
  const a = args ?? {};
3207
3345
  const action = typeof a.action === "string" ? a.action : "get";
@@ -3223,6 +3361,19 @@ async function callTool(req) {
3223
3361
  const body = await apiSend("POST", "/api/deliveries/reconcile", { apply: a.apply === true, session: sessionProof(process.env) });
3224
3362
  return { content: [{ type: "text", text: JSON.stringify(body, null, 2) }] };
3225
3363
  }
3364
+ if (action === "antigas") {
3365
+ const body = await apiSend("POST", "/api/deliveries/antigas", {
3366
+ action: a.antigasAction,
3367
+ ids: a.subtaskIds,
3368
+ all: a.all === true,
3369
+ preview: a.preview === true,
3370
+ expect: a.expect,
3371
+ version: a.version,
3372
+ reason: a.reason,
3373
+ session: sessionProof(process.env)
3374
+ });
3375
+ return { content: [{ type: "text", text: JSON.stringify(body, null, 2) }] };
3376
+ }
3226
3377
  if (action !== "tick" && (typeof a.subtaskId !== "string" || !a.subtaskId))
3227
3378
  throw new Error("subtaskId is required");
3228
3379
  const { subtaskId: _s, action: _a, ...rest } = a;
@@ -3446,6 +3597,7 @@ async function callTool(req) {
3446
3597
  ...s.tokens_unavailable ? {} : { estimatedCostUSD: unpriced > 0 && unpriced === input + output + cacheRead + cacheWrite ? null : Math.round(cost * 1e4) / 1e4 },
3447
3598
  ...unpriced > 0 ? { unpricedTokens: unpriced } : {},
3448
3599
  model: s.model ?? null,
3600
+ ...contextFields(s),
3449
3601
  ...startedBy.get(s.session_id) ? { startedBy: startedBy.get(s.session_id) } : {},
3450
3602
  ...delivered.get(s.session_id) ? { deliveredStillOpen: delivered.get(s.session_id) } : {}
3451
3603
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentistics/mcp",
3
- "version": "2.203.1",
3
+ "version": "2.204.1",
4
4
  "description": "Agentistics MCP server — Claude Code analytics for Claude Desktop and Claude Code",
5
5
  "type": "module",
6
6
  "main": "./dist/agentistics-mcp.js",