@belvador/mcp 0.7.2 → 0.8.0

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.
Files changed (2) hide show
  1. package/dist/cli.js +102 -97
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -214,7 +214,7 @@ function docsFetcher(siteUrl, fetcher = fetch, now = () => Date.now()) {
214
214
  import { CLIENT_CAPABILITIES_META_KEY, inputRequired, McpServer } from "@modelcontextprotocol/server";
215
215
 
216
216
  // ../src/shared/contracts/mcp-tools.ts
217
- import { z as z33 } from "zod";
217
+ import { z as z34 } from "zod";
218
218
 
219
219
  // ../src/shared/contracts/api-ops/access.ts
220
220
  import { z as z3 } from "zod";
@@ -2056,6 +2056,7 @@ var INCIDENT_OPERATIONS = [
2056
2056
  input: I.workspace,
2057
2057
  workspace: true,
2058
2058
  idempotency: "none",
2059
+ paged: true,
2059
2060
  mcp: "investigate",
2060
2061
  summary: "Rules that turn alerts into incidents: match, grouping, window and recovery wait.",
2061
2062
  ui: []
@@ -2101,6 +2102,7 @@ var INCIDENT_OPERATIONS = [
2101
2102
  input: I.workspace,
2102
2103
  workspace: true,
2103
2104
  idempotency: "none",
2105
+ paged: true,
2104
2106
  mcp: "investigate",
2105
2107
  summary: "Notification policies: quiet hours, digest, fallback chain and escalation.",
2106
2108
  ui: []
@@ -4014,7 +4016,7 @@ var NODE_OPERATIONS = [
4014
4016
  path: "/v1/spans",
4015
4017
  scope: "traces:read",
4016
4018
  input: N.spansList,
4017
- node: { path: "q/spans", list: "spans", window: true },
4019
+ node: { path: "q/spans", list: "spans", modeLists: ["traces"], window: true },
4018
4020
  paged: true,
4019
4021
  summary: "Spans (or whole traces with `mode=traces`) in a window of at most 7 days."
4020
4022
  }),
@@ -5185,6 +5187,9 @@ function approvalRequestSchema(operationId, input) {
5185
5187
  return input.omit(Object.fromEntries(human.map((k) => [k, true])));
5186
5188
  }
5187
5189
 
5190
+ // ../src/shared/contracts/api-ops/openapi.ts
5191
+ import { z as z33 } from "zod";
5192
+
5188
5193
  // ../src/shared/contracts/api-ops/wire.ts
5189
5194
  import { z as z32 } from "zod";
5190
5195
  var toSnake = (s) => s.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
@@ -5407,7 +5412,7 @@ function wireInput(operationId, opts = {}) {
5407
5412
  for (const [k, v] of Object.entries(op.input.shape))
5408
5413
  if (!omit.has(k))
5409
5414
  shape[toSnake(k)] = v;
5410
- return z33.object(shape);
5415
+ return z34.object(shape);
5411
5416
  }
5412
5417
  var BUDGETS = [
5413
5418
  { stringBytes: MCP_LIMITS.untrustedStringMaxBytes, listMax: MCP_LIMITS.listMax },
@@ -5500,52 +5505,52 @@ function errorResult(o) {
5500
5505
  }
5501
5506
  };
5502
5507
  }
5503
- var TOOL_OUTPUT_SCHEMA = z33.object({
5504
- untrusted: z33.object({
5505
- data: z33.unknown(),
5506
- provenance: z33.object({
5507
- source: z33.enum(["node", "control_plane", "docs"]),
5508
- operations: z33.array(z33.string())
5508
+ var TOOL_OUTPUT_SCHEMA = z34.object({
5509
+ untrusted: z34.object({
5510
+ data: z34.unknown(),
5511
+ provenance: z34.object({
5512
+ source: z34.enum(["node", "control_plane", "docs"]),
5513
+ operations: z34.array(z34.string())
5509
5514
  })
5510
5515
  }).optional(),
5511
- doc: z33.object({
5512
- slug: z33.string(),
5513
- locale: z33.enum(["en", "vi"]),
5514
- url: z33.string(),
5515
- markdown: z33.string(),
5516
- truncated: z33.boolean()
5516
+ doc: z34.object({
5517
+ slug: z34.string(),
5518
+ locale: z34.enum(["en", "vi"]),
5519
+ url: z34.string(),
5520
+ markdown: z34.string(),
5521
+ truncated: z34.boolean()
5517
5522
  }).optional(),
5518
- results: z33.array(z33.object({
5519
- slug: z33.string(),
5520
- title: z33.string(),
5521
- description: z33.string(),
5522
- section: z33.string(),
5523
- url: z33.string()
5523
+ results: z34.array(z34.object({
5524
+ slug: z34.string(),
5525
+ title: z34.string(),
5526
+ description: z34.string(),
5527
+ section: z34.string(),
5528
+ url: z34.string()
5524
5529
  })).optional(),
5525
- next_cursor: z33.string().nullable().optional(),
5526
- complete: z33.boolean().optional(),
5527
- omitted: z33.array(z33.object({ part: z33.string(), reason: z33.string(), scope: z33.string().optional() })).optional(),
5528
- truncated: z33.literal(true).optional(),
5529
- suspicious_unicode: z33.literal(true).optional(),
5530
- error: z33.object({
5531
- code: z33.string(),
5532
- status: z33.number(),
5533
- detail: z33.string().optional(),
5534
- scope: z33.string().optional(),
5535
- retry_after: z33.number().optional()
5530
+ next_cursor: z34.string().nullable().optional(),
5531
+ complete: z34.boolean().optional(),
5532
+ omitted: z34.array(z34.object({ part: z34.string(), reason: z34.string(), scope: z34.string().optional() })).optional(),
5533
+ truncated: z34.literal(true).optional(),
5534
+ suspicious_unicode: z34.literal(true).optional(),
5535
+ error: z34.object({
5536
+ code: z34.string(),
5537
+ status: z34.number(),
5538
+ detail: z34.string().optional(),
5539
+ scope: z34.string().optional(),
5540
+ retry_after: z34.number().optional()
5536
5541
  }).optional(),
5537
- operations: z33.array(z33.record(z33.string(), z33.unknown())).optional(),
5538
- operation: z33.record(z33.string(), z33.unknown()).optional(),
5539
- plan: z33.record(z33.string(), z33.unknown()).optional(),
5540
- status: z33.enum(["done", "approval_required", "approval_pending", ...APPROVAL_STATES]).optional(),
5541
- approval: z33.object({
5542
- approval_id: z33.string(),
5543
- approval_url: z33.string(),
5544
- expires_at: z33.string(),
5545
- state: z33.enum(APPROVAL_STATES),
5546
- result_code: z33.string().nullable().optional(),
5547
- result: z33.record(z33.string(), z33.unknown()).optional(),
5548
- next: z33.string().optional()
5542
+ operations: z34.array(z34.record(z34.string(), z34.unknown())).optional(),
5543
+ operation: z34.record(z34.string(), z34.unknown()).optional(),
5544
+ plan: z34.record(z34.string(), z34.unknown()).optional(),
5545
+ status: z34.enum(["done", "approval_required", "approval_pending", ...APPROVAL_STATES]).optional(),
5546
+ approval: z34.object({
5547
+ approval_id: z34.string(),
5548
+ approval_url: z34.string(),
5549
+ expires_at: z34.string(),
5550
+ state: z34.enum(APPROVAL_STATES),
5551
+ result_code: z34.string().nullable().optional(),
5552
+ result: z34.record(z34.string(), z34.unknown()).optional(),
5553
+ next: z34.string().optional()
5549
5554
  }).optional()
5550
5555
  });
5551
5556
  var spec = (name) => {
@@ -5591,10 +5596,10 @@ var has = (rt, operationId) => {
5591
5596
  return !!op && rt.scopes.includes(op.scope);
5592
5597
  };
5593
5598
  var isoWindow = {
5594
- start: z33.string().max(40).describe("RFC 3339 start of the window, e.g. 2026-10-26T00:00:00Z. Required with end."),
5595
- end: z33.string().max(40).describe("RFC 3339 end of the window. The plan limits its length.")
5599
+ start: z34.string().max(40).describe("RFC 3339 start of the window, e.g. 2026-10-26T00:00:00Z. Required with end."),
5600
+ end: z34.string().max(40).describe("RFC 3339 end of the window. The plan limits its length.")
5596
5601
  };
5597
- var traceIdSchema = z33.string().regex(/^[0-9a-fA-F]{32}$/);
5602
+ var traceIdSchema = z34.string().regex(/^[0-9a-fA-F]{32}$/);
5598
5603
  var MONITOR_KINDS2 = {
5599
5604
  cron: { list: "monitors.list", get: "monitors.get", idField: "monitor_id" },
5600
5605
  uptime: { list: "uptime.list", get: "uptime.get", idField: "check_id" },
@@ -5658,8 +5663,8 @@ function describe(op, scopes) {
5658
5663
  destructive: isDestructiveOperation(op)
5659
5664
  };
5660
5665
  }
5661
- var params = z33.record(z33.string(), z33.unknown()).default({}).describe("Operation fields in wire names (snake_case), as describe_operation's args_schema shows.");
5662
- var operationIdArg = z33.string().min(3).max(80).describe("An operation id from search_operations, e.g. `monitors.update`.");
5666
+ var params = z34.record(z34.string(), z34.unknown()).default({}).describe("Operation fields in wire names (snake_case), as describe_operation's args_schema shows.");
5667
+ var operationIdArg = z34.string().min(3).max(80).describe("An operation id from search_operations, e.g. `monitors.update`.");
5663
5668
  function approvalBlock(t, next) {
5664
5669
  return {
5665
5670
  approval_id: t.approval_id,
@@ -5679,7 +5684,7 @@ var MCP_TOOL_DEFS = [
5679
5684
  title: "Workspace and node",
5680
5685
  description: "The workspace this token belongs to (name, plan, limits) and the state of its node, the server that stores errors, traces and logs. Start here to learn what the token can reach.",
5681
5686
  operations: ["workspace.get", "node.get"],
5682
- input: z33.object({}),
5687
+ input: z34.object({}),
5683
5688
  async run(_args, rt) {
5684
5689
  const [ws, node] = await Promise.all([rt.call("workspace.get", {}), rt.call("node.get", {})]);
5685
5690
  if (!ws.ok)
@@ -5701,9 +5706,9 @@ var MCP_TOOL_DEFS = [
5701
5706
  title: "Get an issue",
5702
5707
  description: "One issue with its 24 h and 30 d counts and, when the token can read events, its latest event (stack trace, request, breadcrumbs — scrubbed on the node). A resolved issue also carries `fix_status` when the token can read releases: fixed, unverified, not_fixed (with the event that broke it) or unknown, per environment.",
5703
5708
  operations: ["issues.get", "events.get", "issues.fix_status"],
5704
- input: z33.object({
5705
- issue_id: z33.number().int().positive().describe("Issue id from search_issues."),
5706
- include_latest_event: z33.boolean().default(true)
5709
+ input: z34.object({
5710
+ issue_id: z34.number().int().positive().describe("Issue id from search_issues."),
5711
+ include_latest_event: z34.boolean().default(true)
5707
5712
  }),
5708
5713
  async run(args, rt) {
5709
5714
  const omitted = [];
@@ -5744,9 +5749,9 @@ var MCP_TOOL_DEFS = [
5744
5749
  title: "Get a trace",
5745
5750
  description: "Summary of one distributed trace (services, duration, errors) by its 32-hex trace id, and optionally its spans (errors only, or the first page).",
5746
5751
  operations: ["traces.get", "traces.spans"],
5747
- input: z33.object({
5752
+ input: z34.object({
5748
5753
  trace_id: traceIdSchema.describe("W3C trace id, 32 hex characters."),
5749
- spans: z33.enum(["none", "errors", "all"]).default("none")
5754
+ spans: z34.enum(["none", "errors", "all"]).default("none")
5750
5755
  }),
5751
5756
  async run(args, rt) {
5752
5757
  const sum = await rt.call("traces.get", { trace_id: args["trace_id"] });
@@ -5778,17 +5783,17 @@ var MCP_TOOL_DEFS = [
5778
5783
  title: "Query metrics",
5779
5784
  description: "OpenTelemetry metrics of one project. Without `name`: the metric catalog (name, type, unit, series count, last seen; `q` narrows by name) and the node's series caps. With `name` plus start and end: the metric aggregated per step — `aggregation` defaults to rate for counters, p95 for histograms and avg for gauges — optionally filtered by attributes (`attrs`, JSON list of {k, op, v}) and grouped by up to two attribute keys (`group_by`, comma-separated). Exemplar trace ids open with get_trace.",
5780
5785
  operations: ["metrics.names", "metrics.query"],
5781
- input: z33.object({
5782
- project: z33.number().int().positive().describe("Numeric project id from list_projects."),
5783
- name: z33.string().regex(METRIC_NAME_RE).optional().describe("Metric name from the catalog, e.g. http.server.request.duration."),
5784
- q: z33.string().max(255).optional().describe("Catalog only: part of a metric name."),
5785
- aggregation: z33.enum(METRIC_AGGREGATIONS).optional(),
5786
+ input: z34.object({
5787
+ project: z34.number().int().positive().describe("Numeric project id from list_projects."),
5788
+ name: z34.string().regex(METRIC_NAME_RE).optional().describe("Metric name from the catalog, e.g. http.server.request.duration."),
5789
+ q: z34.string().max(255).optional().describe("Catalog only: part of a metric name."),
5790
+ aggregation: z34.enum(METRIC_AGGREGATIONS).optional(),
5786
5791
  start: isoWindow.start.optional(),
5787
5792
  end: isoWindow.end.optional(),
5788
- step: z33.number().int().min(60).max(86400).multipleOf(60).optional().describe("Seconds per point (whole minutes); picked from the window when absent."),
5789
- attrs: z33.string().max(2000).optional(),
5790
- group_by: z33.string().max(600).optional(),
5791
- environment: z33.string().max(2000).optional().describe("Comma-separated environments.")
5793
+ step: z34.number().int().min(60).max(86400).multipleOf(60).optional().describe("Seconds per point (whole minutes); picked from the window when absent."),
5794
+ attrs: z34.string().max(2000).optional(),
5795
+ group_by: z34.string().max(600).optional(),
5796
+ environment: z34.string().max(2000).optional().describe("Comma-separated environments.")
5792
5797
  }),
5793
5798
  async run(args, rt) {
5794
5799
  const scope = {
@@ -5843,8 +5848,8 @@ var MCP_TOOL_DEFS = [
5843
5848
  title: "Release health",
5844
5849
  description: "What changed with a release (spec 13). With `version`: that release in one environment against the previous one (or `compare`) — three lists for its first 24 hours: new issues, regressed issues and increased issues (≥ 2× events per hour and ≥ 10 events), up to 50 each with hourly sparklines, plus its deploy markers. Without `version`: the project's releases, newest deploy first, with those three counts. `environment` defaults to production (else the busiest). Whether a resolved issue is really fixed: get_issue returns its fix status.",
5845
5850
  operations: ["releases.list", "releases.health"],
5846
- input: z33.object({
5847
- project: z33.number().int().positive().describe("Numeric project id from list_projects."),
5851
+ input: z34.object({
5852
+ project: z34.number().int().positive().describe("Numeric project id from list_projects."),
5848
5853
  version: releaseNameSchema.optional().describe("Release name exactly as the SDK sends it, e.g. web@1.4.2."),
5849
5854
  environment: environmentNameSchema.optional().describe("One environment, e.g. production."),
5850
5855
  compare: releaseNameSchema.optional().describe("With version: compare against this release instead of the previous one.")
@@ -5876,11 +5881,11 @@ var MCP_TOOL_DEFS = [
5876
5881
  title: "Correlate by trace or run",
5877
5882
  description: "Everything that shares one W3C trace id or one Belvador run id (`belvador.run.id`, set by job monitors) in a time window: the trace summary, its error spans and the logs. Give exactly one of trace_id or run_id.",
5878
5883
  operations: ["traces.get", "traces.spans", "spans.list", "logs.list"],
5879
- input: z33.object({
5884
+ input: z34.object({
5880
5885
  trace_id: traceIdSchema.optional(),
5881
- run_id: z33.string().min(1).max(128).optional(),
5886
+ run_id: z34.string().min(1).max(128).optional(),
5882
5887
  ...isoWindow,
5883
- project: z33.string().max(2000).optional().describe("Comma-separated project ids.")
5888
+ project: z34.string().max(2000).optional().describe("Comma-separated project ids.")
5884
5889
  }),
5885
5890
  async run(args, rt) {
5886
5891
  const trace = args["trace_id"];
@@ -5939,10 +5944,10 @@ var MCP_TOOL_DEFS = [
5939
5944
  title: "List monitors",
5940
5945
  description: "Monitors (cron, heartbeat, count, assertion, deadline, progress), uptime checks and SLOs with their current status. `kind` narrows to one family; `project_id` to one project (cron and uptime).",
5941
5946
  operations: ["monitors.list", "uptime.list", "slos.list"],
5942
- input: z33.object({
5943
- kind: z33.enum(["all", "cron", "uptime", "slo"]).default("all"),
5944
- project_id: z33.number().int().positive().optional(),
5945
- limit: z33.number().int().min(1).max(200).default(50)
5947
+ input: z34.object({
5948
+ kind: z34.enum(["all", "cron", "uptime", "slo"]).default("all"),
5949
+ project_id: z34.number().int().positive().optional(),
5950
+ limit: z34.number().int().min(1).max(200).default(50)
5946
5951
  }),
5947
5952
  async run(args, rt) {
5948
5953
  const kinds = args["kind"] && args["kind"] !== "all" ? [args["kind"]] : ["cron", "uptime", "slo"];
@@ -5977,10 +5982,10 @@ var MCP_TOOL_DEFS = [
5977
5982
  "monitors.occurrences",
5978
5983
  "monitors.backtest"
5979
5984
  ],
5980
- input: z33.object({
5981
- kind: z33.enum(["cron", "uptime", "slo"]),
5982
- id: z33.guid(),
5983
- backtest: z33.boolean().default(false)
5985
+ input: z34.object({
5986
+ kind: z34.enum(["cron", "uptime", "slo"]),
5987
+ id: z34.guid(),
5988
+ backtest: z34.boolean().default(false)
5984
5989
  }),
5985
5990
  async run(args, rt) {
5986
5991
  const k = MONITOR_KINDS2[args["kind"]];
@@ -6040,9 +6045,9 @@ var MCP_TOOL_DEFS = [
6040
6045
  title: "Send a test event",
6041
6046
  description: "Asks the node to send one tagged test error through the public intake of a project, proving the path real errors take. Not read-only: it creates one test event (reuse idempotency_key to retry without a second one).",
6042
6047
  operations: ["projects.send_test_event"],
6043
- input: z33.object({
6044
- project_id: z33.number().int().positive(),
6045
- idempotency_key: z33.string().min(8).max(255).optional()
6048
+ input: z34.object({
6049
+ project_id: z34.number().int().positive(),
6050
+ idempotency_key: z34.string().min(8).max(255).optional()
6046
6051
  }),
6047
6052
  async run(args, rt) {
6048
6053
  const r = await rt.call("projects.send_test_event", { project_id: args["project_id"] }, { idempotencyKey: args["idempotency_key"] ?? rt.newKey() });
@@ -6060,9 +6065,9 @@ var MCP_TOOL_DEFS = [
6060
6065
  title: "Find a configuration change",
6061
6066
  description: "Searches what this token can change in its Belvador workspace: projects, keys and tokens, monitors of every type, maintenance windows, occurrences, uptime checks, SLOs, alert rules and destinations, members, service accounts and the node. Returns operation ids for describe_operation and plan_change, whether a person must approve the change, and whether this token holds the scope.",
6062
6067
  operations: [],
6063
- input: z33.object({
6064
- query: z33.string().min(1).max(200).describe("Words such as `rotate dsn key`, `heartbeat monitor`, `slack alert`."),
6065
- limit: z33.number().int().min(1).max(20).default(10)
6068
+ input: z34.object({
6069
+ query: z34.string().min(1).max(200).describe("Words such as `rotate dsn key`, `heartbeat monitor`, `slack alert`."),
6070
+ limit: z34.number().int().min(1).max(20).default(10)
6066
6071
  }),
6067
6072
  async run(args, rt) {
6068
6073
  const q = words(String(args["query"]));
@@ -6090,7 +6095,7 @@ var MCP_TOOL_DEFS = [
6090
6095
  title: "Describe a configuration change",
6091
6096
  description: "Everything needed to call one operation: its fields (JSON Schema, wire names), the scope, whether it needs If-Match (call plan_change for the current ETag), an idempotency key, or a person's approval, and which fields the approving person types on belvador.dev instead of the agent.",
6092
6097
  operations: [],
6093
- input: z33.object({ operation_id: operationIdArg }),
6098
+ input: z34.object({ operation_id: operationIdArg }),
6094
6099
  async run(args, rt) {
6095
6100
  const op = configureOp(args["operation_id"]);
6096
6101
  if (!op || op.method === "GET")
@@ -6119,7 +6124,7 @@ var MCP_TOOL_DEFS = [
6119
6124
  title: "Check a change before applying it",
6120
6125
  description: "Validates params for one operation without changing anything: field errors, missing scope, whether a person must approve, and — when the resource can be read — its current state, the fields that would change and the ETag to pass as if_match.",
6121
6126
  operations: [],
6122
- input: z33.object({ operation_id: operationIdArg, params }),
6127
+ input: z34.object({ operation_id: operationIdArg, params }),
6123
6128
  async run(args, rt) {
6124
6129
  const op = configureOp(args["operation_id"]);
6125
6130
  if (!op || op.method === "GET")
@@ -6168,11 +6173,11 @@ var MCP_TOOL_DEFS = [
6168
6173
  title: "Apply a configuration change",
6169
6174
  description: "Runs one operation with params (validate first with plan_change). Always send idempotency_key: repeating a call with the same key never applies it twice. Sensitive operations answer approval_required with an approval_url a person opens on belvador.dev; nothing changes until they approve with their authenticator code.",
6170
6175
  operations: [],
6171
- input: z33.object({
6176
+ input: z34.object({
6172
6177
  operation_id: operationIdArg,
6173
6178
  params,
6174
- idempotency_key: z33.string().min(8).max(255).describe("Unique per change; reuse it to retry or to fetch the result."),
6175
- if_match: z33.string().max(200).optional().describe("ETag from plan_change, for operations that need it.")
6179
+ idempotency_key: z34.string().min(8).max(255).describe("Unique per change; reuse it to retry or to fetch the result."),
6180
+ if_match: z34.string().max(200).optional().describe("ETag from plan_change, for operations that need it.")
6176
6181
  }),
6177
6182
  async run(args, rt) {
6178
6183
  const op = configureOp(args["operation_id"]);
@@ -6233,7 +6238,7 @@ var MCP_TOOL_DEFS = [
6233
6238
  title: "Follow an approval",
6234
6239
  description: "State of a change waiting for a person's approval: pending, approved, executed (with the ids it produced), rejected, expired or failed (with the error code).",
6235
6240
  operations: ["approvals.get"],
6236
- input: z33.object({ approval_id: z33.guid().describe("approval_id from apply_change.") }),
6241
+ input: z34.object({ approval_id: z34.guid().describe("approval_id from apply_change.") }),
6237
6242
  async run(args, rt) {
6238
6243
  const r = await rt.call("approvals.get", { approval_id: args["approval_id"] });
6239
6244
  if (!r.ok)
@@ -6253,10 +6258,10 @@ var MCP_TOOL_DEFS = [
6253
6258
  title: "Search Belvador docs",
6254
6259
  description: "Searches the public Belvador documentation (titles and summaries) and returns the best pages with their slugs for get_doc.",
6255
6260
  operations: [],
6256
- input: z33.object({
6257
- query: z33.string().min(1).max(200),
6258
- locale: z33.enum(["en", "vi"]).default("en"),
6259
- limit: z33.number().int().min(1).max(10).default(5)
6261
+ input: z34.object({
6262
+ query: z34.string().min(1).max(200),
6263
+ locale: z34.enum(["en", "vi"]).default("en"),
6264
+ limit: z34.number().int().min(1).max(10).default(5)
6260
6265
  }),
6261
6266
  async run(args, rt) {
6262
6267
  const locale = args["locale"] ?? "en";
@@ -6272,9 +6277,9 @@ var MCP_TOOL_DEFS = [
6272
6277
  title: "Read a docs page",
6273
6278
  description: "The Markdown of one public Belvador docs page by slug (e.g. `quickstart`, `sdk/react`, `reference/api`).",
6274
6279
  operations: [],
6275
- input: z33.object({
6276
- slug: z33.string().regex(/^[a-z0-9][a-z0-9/-]{0,120}$/),
6277
- locale: z33.enum(["en", "vi"]).default("en")
6280
+ input: z34.object({
6281
+ slug: z34.string().regex(/^[a-z0-9][a-z0-9/-]{0,120}$/),
6282
+ locale: z34.enum(["en", "vi"]).default("en")
6278
6283
  }),
6279
6284
  async run(args, rt) {
6280
6285
  const locale = args["locale"] ?? "en";
@@ -6468,7 +6473,7 @@ function findToken(env = process.env, keychain = keychainToken) {
6468
6473
  }
6469
6474
 
6470
6475
  // packages/mcp/src/cli.ts
6471
- var PACKAGE_VERSION = "0.7.2";
6476
+ var PACKAGE_VERSION = "0.8.0";
6472
6477
  var HELP = `belvador-mcp ${PACKAGE_VERSION} — Belvador MCP server (stdio)
6473
6478
 
6474
6479
  Usage: npx -y @belvador/mcp [--toolsets=${MCP_DEFAULT_TOOLSETS.join(",")}]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@belvador/mcp",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "Belvador MCP server over stdio: the same read-only tools as api.belvador.dev/mcp (issues, events, traces, logs, monitors, docs), with node data read straight from the edge.",
5
5
  "license": "MIT",
6
6
  "author": "Belvador (https://belvador.dev)",
@@ -30,7 +30,7 @@
30
30
  "node": ">=20.10"
31
31
  },
32
32
  "dependencies": {
33
- "@belvador/api": "0.7.2",
33
+ "@belvador/api": "0.8.0",
34
34
  "@modelcontextprotocol/server": "2.4.0",
35
35
  "zod": "4.6.7"
36
36
  },