@iris-eval/mcp-server 0.3.0 → 0.4.0-rc.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.
Files changed (103) hide show
  1. package/README.md +11 -3
  2. package/dist/audit-log-reader.d.ts +24 -0
  3. package/dist/audit-log-reader.js +87 -0
  4. package/dist/config/defaults.js +7 -1
  5. package/dist/custom-rule-store.d.ts +27 -0
  6. package/dist/custom-rule-store.js +188 -0
  7. package/dist/dashboard/assets/index-BEG5FYWH.css +1 -0
  8. package/dist/dashboard/assets/index-D9JHfSB2.js +12 -0
  9. package/dist/dashboard/index.html +2 -2
  10. package/dist/dashboard/routes/audit.d.ts +3 -0
  11. package/dist/dashboard/routes/audit.js +36 -0
  12. package/dist/dashboard/routes/eval-stats.js +9 -4
  13. package/dist/dashboard/routes/evaluations.js +3 -1
  14. package/dist/dashboard/routes/filters.js +5 -3
  15. package/dist/dashboard/routes/health.js +8 -1
  16. package/dist/dashboard/routes/index.d.ts +4 -0
  17. package/dist/dashboard/routes/index.js +4 -0
  18. package/dist/dashboard/routes/moments.d.ts +3 -0
  19. package/dist/dashboard/routes/moments.js +115 -0
  20. package/dist/dashboard/routes/preferences.d.ts +3 -0
  21. package/dist/dashboard/routes/preferences.js +52 -0
  22. package/dist/dashboard/routes/rules.d.ts +10 -0
  23. package/dist/dashboard/routes/rules.js +169 -0
  24. package/dist/dashboard/routes/summary.js +3 -1
  25. package/dist/dashboard/routes/traces.js +7 -4
  26. package/dist/dashboard/server.d.ts +9 -1
  27. package/dist/dashboard/server.js +52 -3
  28. package/dist/eval/citation-verify/extract.d.ts +11 -0
  29. package/dist/eval/citation-verify/extract.js +102 -0
  30. package/dist/eval/citation-verify/resolve.d.ts +26 -0
  31. package/dist/eval/citation-verify/resolve.js +237 -0
  32. package/dist/eval/citation-verify/verifier.d.ts +43 -0
  33. package/dist/eval/citation-verify/verifier.js +203 -0
  34. package/dist/eval/decision-moment.d.ts +12 -0
  35. package/dist/eval/decision-moment.js +181 -0
  36. package/dist/eval/llm-judge/client.d.ts +28 -0
  37. package/dist/eval/llm-judge/client.js +183 -0
  38. package/dist/eval/llm-judge/evaluator.d.ts +32 -0
  39. package/dist/eval/llm-judge/evaluator.js +138 -0
  40. package/dist/eval/llm-judge/pricing.d.ts +9 -0
  41. package/dist/eval/llm-judge/pricing.js +31 -0
  42. package/dist/eval/llm-judge/templates/index.d.ts +20 -0
  43. package/dist/eval/llm-judge/templates/index.js +170 -0
  44. package/dist/eval/rules/custom.js +13 -2
  45. package/dist/eval/rules/relevance.js +51 -6
  46. package/dist/eval/rules/safety.d.ts +1 -0
  47. package/dist/eval/rules/safety.js +87 -3
  48. package/dist/index.js +77 -14
  49. package/dist/middleware/index.d.ts +1 -0
  50. package/dist/middleware/index.js +1 -0
  51. package/dist/middleware/tenant.d.ts +17 -0
  52. package/dist/middleware/tenant.js +26 -0
  53. package/dist/otel/exporter.d.ts +24 -0
  54. package/dist/otel/exporter.js +116 -0
  55. package/dist/otel/lazy.d.ts +5 -0
  56. package/dist/otel/lazy.js +31 -0
  57. package/dist/otel/mapper.d.ts +24 -0
  58. package/dist/otel/mapper.js +208 -0
  59. package/dist/preferences.d.ts +129 -0
  60. package/dist/preferences.js +152 -0
  61. package/dist/resources/dashboard-summary.js +3 -1
  62. package/dist/resources/trace-detail.js +5 -3
  63. package/dist/server.d.ts +3 -1
  64. package/dist/server.js +9 -3
  65. package/dist/storage/migrations/004-tenant-id.d.ts +3 -0
  66. package/dist/storage/migrations/004-tenant-id.js +40 -0
  67. package/dist/storage/migrations/index.js +2 -1
  68. package/dist/storage/sqlite-adapter.d.ts +17 -15
  69. package/dist/storage/sqlite-adapter.js +130 -79
  70. package/dist/tools/delete-rule.d.ts +3 -0
  71. package/dist/tools/delete-rule.js +53 -0
  72. package/dist/tools/delete-trace.d.ts +3 -0
  73. package/dist/tools/delete-trace.js +54 -0
  74. package/dist/tools/deploy-rule.d.ts +3 -0
  75. package/dist/tools/deploy-rule.js +91 -0
  76. package/dist/tools/evaluate-output.js +23 -2
  77. package/dist/tools/evaluate-with-llm-judge.d.ts +3 -0
  78. package/dist/tools/evaluate-with-llm-judge.js +147 -0
  79. package/dist/tools/get-traces.js +23 -3
  80. package/dist/tools/index.d.ts +2 -1
  81. package/dist/tools/index.js +13 -1
  82. package/dist/tools/list-rules.d.ts +3 -0
  83. package/dist/tools/list-rules.js +66 -0
  84. package/dist/tools/log-trace.js +30 -2
  85. package/dist/tools/verify-citations.d.ts +3 -0
  86. package/dist/tools/verify-citations.js +157 -0
  87. package/dist/types/custom-rule.d.ts +70 -0
  88. package/dist/types/custom-rule.js +1 -0
  89. package/dist/types/decision-moment.d.ts +122 -0
  90. package/dist/types/decision-moment.js +17 -0
  91. package/dist/types/index.d.ts +2 -0
  92. package/dist/types/index.js +1 -1
  93. package/dist/types/query.d.ts +25 -15
  94. package/dist/types/tenant.d.ts +26 -0
  95. package/dist/types/tenant.js +58 -0
  96. package/dist/utils/open-browser.d.ts +1 -0
  97. package/dist/utils/open-browser.js +45 -0
  98. package/dist/utils/validate-port-config.d.ts +2 -0
  99. package/dist/utils/validate-port-config.js +9 -0
  100. package/package.json +4 -1
  101. package/server.json +2 -2
  102. package/dist/dashboard/assets/index-CnDg6bYi.js +0 -43
  103. package/dist/dashboard/assets/index-ZsBou2-c.css +0 -1
@@ -0,0 +1,122 @@
1
+ export type MomentVerdict = 'pass' | 'fail' | 'partial' | 'unevaluated';
2
+ export type MomentSignificanceKind = 'safety-violation' | 'cost-spike' | 'first-failure' | 'novel-pattern' | 'rule-collision' | 'normal-pass' | 'normal-fail';
3
+ export interface MomentSignificance {
4
+ /** Classifier kind. */
5
+ kind: MomentSignificanceKind;
6
+ /** 0-1; how moment-worthy this trace is. Used for visual emphasis on the timeline. */
7
+ score: number;
8
+ /** Short human-readable label (≤30 chars) — shown on timeline dot tooltip. */
9
+ label: string;
10
+ /** Longer explanation — shown in the detail surface. */
11
+ reason: string;
12
+ }
13
+ export interface MomentRuleSnapshot {
14
+ /** Names of rules that failed. */
15
+ failed: string[];
16
+ /** Names of rules that were skipped (insufficient context). */
17
+ skipped: string[];
18
+ /** Count of rules that passed. */
19
+ passedCount: number;
20
+ /** Count of rules that fired total (across all eval_types). */
21
+ totalCount: number;
22
+ }
23
+ export interface DecisionMoment {
24
+ /** Stable id; equals the source trace_id. */
25
+ id: string;
26
+ /** Source trace_id (same as id; included for query convenience). */
27
+ traceId: string;
28
+ /** Agent that produced the output. */
29
+ agentName: string;
30
+ /** ISO timestamp of the trace. */
31
+ timestamp: string;
32
+ /** Input the agent received (may be omitted for storage-size reasons). */
33
+ input?: string;
34
+ /** Output the agent produced. */
35
+ output?: string;
36
+ /** Trace-level cost in USD. */
37
+ costUsd?: number;
38
+ /** Trace-level end-to-end latency. */
39
+ latencyMs?: number;
40
+ /** Aggregated eval verdict across all eval_types that ran on this trace. */
41
+ verdict: MomentVerdict;
42
+ /** Weighted average score across all eval rules that fired (excludes skipped). */
43
+ overallScore: number;
44
+ /** Count of distinct evaluations (one per eval_type) recorded for this trace. */
45
+ evalCount: number;
46
+ /** Per-rule pass/fail/skip breakdown. */
47
+ ruleSnapshot: MomentRuleSnapshot;
48
+ /** Why this trace is (or isn't) moment-worthy. */
49
+ significance: MomentSignificance;
50
+ }
51
+ /**
52
+ * Detailed view returned by the moment-detail endpoint. Includes the full
53
+ * eval result list (with messages + scores per rule) and the source trace
54
+ * for context.
55
+ */
56
+ export interface DecisionMomentDetail extends DecisionMoment {
57
+ /** Every eval recorded for this trace, with full rule result detail. */
58
+ evals: Array<{
59
+ id: string;
60
+ evalType: string;
61
+ score: number;
62
+ passed: boolean;
63
+ ruleResults: Array<{
64
+ ruleName: string;
65
+ passed: boolean;
66
+ score: number;
67
+ message: string;
68
+ skipped?: boolean;
69
+ skipReason?: string;
70
+ }>;
71
+ suggestions: string[];
72
+ createdAt?: string;
73
+ }>;
74
+ /** Full input (uncompressed). */
75
+ input?: string;
76
+ /** Full output (uncompressed). */
77
+ output?: string;
78
+ /** Tool-call sequence from the trace, if any. */
79
+ toolCalls?: Array<{
80
+ tool_name: string;
81
+ input?: unknown;
82
+ output?: unknown;
83
+ latency_ms?: number;
84
+ error?: string;
85
+ }>;
86
+ /** Span tree from the trace, if any. */
87
+ spans?: Array<{
88
+ span_id: string;
89
+ parent_span_id?: string;
90
+ name: string;
91
+ kind: string;
92
+ start_time: string;
93
+ end_time?: string;
94
+ }>;
95
+ }
96
+ export interface MomentQueryFilter {
97
+ /** Filter by agent name. */
98
+ agentName?: string;
99
+ /** Filter by verdict. */
100
+ verdict?: MomentVerdict;
101
+ /** Filter to only show moments above a significance threshold. */
102
+ minSignificance?: number;
103
+ /** Filter by significance kind (e.g., only show safety-violations). */
104
+ significanceKind?: MomentSignificanceKind;
105
+ /** ISO timestamp; only moments at or after. */
106
+ since?: string;
107
+ /** ISO timestamp; only moments at or before. */
108
+ until?: string;
109
+ }
110
+ export interface MomentQueryOptions {
111
+ filter?: MomentQueryFilter;
112
+ limit?: number;
113
+ offset?: number;
114
+ /** Default 'desc' (most recent first). */
115
+ sortOrder?: 'asc' | 'desc';
116
+ }
117
+ export interface MomentQueryResult {
118
+ moments: DecisionMoment[];
119
+ total: number;
120
+ limit: number;
121
+ offset: number;
122
+ }
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Decision Moment — the new primary unit of the Iris dashboard.
3
+ *
4
+ * A Decision Moment is the point at which an agent's output was scored.
5
+ * It is derived from existing data: one trace + its aggregated eval results.
6
+ * No schema migration — the moment is computed on read.
7
+ *
8
+ * The system-design reframe: not every eval is a moment. The significance
9
+ * classifier separates moments worth a human's attention (safety violations,
10
+ * cost spikes, first-failures, novel patterns) from operational data
11
+ * (passing evals on the happy path).
12
+ *
13
+ * This is the workflow primitive that supports Make-This-A-Rule: a user
14
+ * looking at a moment can promote the observed behavior into a new rule
15
+ * without leaving the moment context.
16
+ */
17
+ export {};
@@ -2,3 +2,5 @@ export type { SpanKind, SpanStatus, SpanEvent, ToolCallRecord, TokenUsage, Span,
2
2
  export type { EvalType, EvalRule, EvalContext, EvalRuleResult, EvalResult, CustomRuleType, CustomRuleDefinition, } from './eval.js';
3
3
  export type { TraceFilter, TraceQueryOptions, TraceQueryResult, DashboardSummary, EvalStatsPeriod, EvalStats, EvalStatsTrendBucket, EvalStatsRuleBreakdown, EvalStatsFailure, IStorageAdapter, } from './query.js';
4
4
  export type { IrisConfig } from './config.js';
5
+ export type { TenantId } from './tenant.js';
6
+ export { LOCAL_TENANT, asTenantId, TenantContextRequiredError } from './tenant.js';
@@ -1 +1 @@
1
- export {};
1
+ export { LOCAL_TENANT, asTenantId, TenantContextRequiredError } from './tenant.js';
@@ -1,5 +1,6 @@
1
1
  import type { Trace, Span } from './trace.js';
2
2
  import type { EvalResult } from './eval.js';
3
+ import type { TenantId } from './tenant.js';
3
4
  export interface TraceFilter {
4
5
  agent_name?: string;
5
6
  framework?: string;
@@ -74,14 +75,14 @@ export interface DashboardSummary {
74
75
  export interface IStorageAdapter {
75
76
  initialize(): Promise<void>;
76
77
  close(): Promise<void>;
77
- insertTrace(trace: Trace): Promise<void>;
78
- getTrace(traceId: string): Promise<Trace | null>;
79
- queryTraces(options: TraceQueryOptions): Promise<TraceQueryResult>;
80
- insertSpan(span: Span): Promise<void>;
81
- getSpansByTraceId(traceId: string): Promise<Span[]>;
82
- insertEvalResult(result: EvalResult): Promise<void>;
83
- getEvalsByTraceId(traceId: string): Promise<EvalResult[]>;
84
- queryEvalResults(options: {
78
+ insertTrace(tenantId: TenantId, trace: Trace): Promise<void>;
79
+ getTrace(tenantId: TenantId, traceId: string): Promise<Trace | null>;
80
+ queryTraces(tenantId: TenantId, options: TraceQueryOptions): Promise<TraceQueryResult>;
81
+ insertSpan(tenantId: TenantId, span: Span): Promise<void>;
82
+ getSpansByTraceId(tenantId: TenantId, traceId: string): Promise<Span[]>;
83
+ insertEvalResult(tenantId: TenantId, result: EvalResult): Promise<void>;
84
+ getEvalsByTraceId(tenantId: TenantId, traceId: string): Promise<EvalResult[]>;
85
+ queryEvalResults(tenantId: TenantId, options: {
85
86
  eval_type?: string;
86
87
  passed?: boolean;
87
88
  since?: string;
@@ -92,11 +93,20 @@ export interface IStorageAdapter {
92
93
  results: EvalResult[];
93
94
  total: number;
94
95
  }>;
95
- getDashboardSummary(sinceHours?: number): Promise<DashboardSummary>;
96
- deleteTracesOlderThan(days: number): Promise<number>;
97
- getDistinctValues(column: string): Promise<string[]>;
98
- getEvalStats(period: EvalStatsPeriod): Promise<EvalStats>;
99
- getEvalStatsTrend(period: EvalStatsPeriod): Promise<EvalStatsTrendBucket[]>;
100
- getEvalStatsRules(period: EvalStatsPeriod): Promise<EvalStatsRuleBreakdown[]>;
101
- getEvalStatsFailures(period: EvalStatsPeriod, limit: number): Promise<EvalStatsFailure[]>;
96
+ getDashboardSummary(tenantId: TenantId, sinceHours?: number): Promise<DashboardSummary>;
97
+ deleteTracesOlderThan(tenantId: TenantId, days: number): Promise<number>;
98
+ /**
99
+ * Delete a single trace by id. Cascades to spans via FK ON DELETE
100
+ * CASCADE; eval_results get their trace_id set to NULL (so score
101
+ * history survives even after the trace is deleted).
102
+ *
103
+ * Returns true if a row was deleted, false if the id didn't exist
104
+ * (or belonged to a different tenant).
105
+ */
106
+ deleteTrace(tenantId: TenantId, traceId: string): Promise<boolean>;
107
+ getDistinctValues(tenantId: TenantId, column: string): Promise<string[]>;
108
+ getEvalStats(tenantId: TenantId, period: EvalStatsPeriod): Promise<EvalStats>;
109
+ getEvalStatsTrend(tenantId: TenantId, period: EvalStatsPeriod): Promise<EvalStatsTrendBucket[]>;
110
+ getEvalStatsRules(tenantId: TenantId, period: EvalStatsPeriod): Promise<EvalStatsRuleBreakdown[]>;
111
+ getEvalStatsFailures(tenantId: TenantId, period: EvalStatsPeriod, limit: number): Promise<EvalStatsFailure[]>;
102
112
  }
@@ -0,0 +1,26 @@
1
+ /** Nominal brand on string. A plain string cannot be used where TenantId is required. */
2
+ export type TenantId = string & {
3
+ readonly __brand: 'TenantId';
4
+ };
5
+ /** The sentinel tenant used by OSS / single-user installs. */
6
+ export declare const LOCAL_TENANT: TenantId;
7
+ /**
8
+ * Coerce a raw string into a TenantId after validating non-empty.
9
+ * Throws TenantContextRequiredError when the input is empty/null/undefined.
10
+ *
11
+ * This is the only officially-sanctioned way to mint a TenantId from user
12
+ * input. It centralizes the non-empty invariant so every call site is
13
+ * safe by construction.
14
+ */
15
+ export declare function asTenantId(value: string | null | undefined): TenantId;
16
+ /**
17
+ * Thrown when a storage method is invoked without a valid tenant
18
+ * context. Fail-safe: we'd rather crash than return data that might
19
+ * cross a tenant boundary.
20
+ *
21
+ * Catch at the route-handler layer and translate to 500 + correlation
22
+ * ID; never surface the raw message to end users.
23
+ */
24
+ export declare class TenantContextRequiredError extends Error {
25
+ constructor(message?: string);
26
+ }
@@ -0,0 +1,58 @@
1
+ /*
2
+ * tenant — tenant identity primitives.
3
+ *
4
+ * Every storage read/write in Iris takes a TenantId. For OSS / single-
5
+ * user installs the value is always `LOCAL_TENANT` (the literal string
6
+ * `'local'`). For the future Cloud SKU, the value is resolved by the
7
+ * authentication middleware from the session and carried on the
8
+ * request context.
9
+ *
10
+ * Design constraints (from the 2026-04-23 threat model §5.1):
11
+ * 1. Tenant context is a REQUIRED parameter on every storage method;
12
+ * no Optional<TenantId>. The type system enforces it.
13
+ * 2. The default for OSS is the literal string 'local' — never null,
14
+ * never undefined, never auto-generated. No "no tenant" code path
15
+ * exists that could become a "show me everything" path.
16
+ * 3. Tenant resolution happens in middleware, not storage. Storage
17
+ * receives the resolved TenantId and uses it verbatim.
18
+ * 4. Default-deny: a storage method receiving an empty tenantId MUST
19
+ * throw TenantContextRequiredError, not return all rows.
20
+ * 5. TenantId is an opaque non-empty string. No assumption beyond
21
+ * "valid non-empty UTF-8"; Cloud will use UUID/KSUID, OSS uses
22
+ * 'local'.
23
+ *
24
+ * Branded string pattern: we wrap `string` in a nominal brand so passing
25
+ * a raw `string` where `TenantId` is expected is a compile error. The
26
+ * only path to a TenantId is through `asTenantId()` or the LOCAL_TENANT
27
+ * constant — both of which validate non-empty.
28
+ */
29
+ /** The sentinel tenant used by OSS / single-user installs. */
30
+ export const LOCAL_TENANT = 'local';
31
+ /**
32
+ * Coerce a raw string into a TenantId after validating non-empty.
33
+ * Throws TenantContextRequiredError when the input is empty/null/undefined.
34
+ *
35
+ * This is the only officially-sanctioned way to mint a TenantId from user
36
+ * input. It centralizes the non-empty invariant so every call site is
37
+ * safe by construction.
38
+ */
39
+ export function asTenantId(value) {
40
+ if (typeof value !== 'string' || value.length === 0) {
41
+ throw new TenantContextRequiredError(`TenantId must be a non-empty string; got ${value === null ? 'null' : typeof value}`);
42
+ }
43
+ return value;
44
+ }
45
+ /**
46
+ * Thrown when a storage method is invoked without a valid tenant
47
+ * context. Fail-safe: we'd rather crash than return data that might
48
+ * cross a tenant boundary.
49
+ *
50
+ * Catch at the route-handler layer and translate to 500 + correlation
51
+ * ID; never surface the raw message to end users.
52
+ */
53
+ export class TenantContextRequiredError extends Error {
54
+ constructor(message = 'Tenant context required; storage cannot be called without a resolved TenantId') {
55
+ super(message);
56
+ this.name = 'TenantContextRequiredError';
57
+ }
58
+ }
@@ -0,0 +1 @@
1
+ export declare function openBrowser(url: string): void;
@@ -0,0 +1,45 @@
1
+ /*
2
+ * open-browser — minimal cross-platform browser launcher.
3
+ *
4
+ * Avoids the `open` npm dep so iris-mcp's install size stays small.
5
+ * Uses the platform's default URL handler:
6
+ * Windows: `cmd /c start "" "<url>"`
7
+ * macOS: `open "<url>"`
8
+ * Linux: `xdg-open "<url>"`
9
+ *
10
+ * Spawns detached + ignores stdio so the iris-mcp process doesn't depend
11
+ * on the launched browser staying alive.
12
+ */
13
+ import { spawn } from 'node:child_process';
14
+ export function openBrowser(url) {
15
+ const platform = process.platform;
16
+ let command;
17
+ let args;
18
+ if (platform === 'win32') {
19
+ // The empty title argument is required so cmd treats the URL as the
20
+ // target rather than as the window title.
21
+ command = 'cmd';
22
+ args = ['/c', 'start', '', url];
23
+ }
24
+ else if (platform === 'darwin') {
25
+ command = 'open';
26
+ args = [url];
27
+ }
28
+ else {
29
+ // Linux + BSDs.
30
+ command = 'xdg-open';
31
+ args = [url];
32
+ }
33
+ try {
34
+ const child = spawn(command, args, {
35
+ detached: true,
36
+ stdio: 'ignore',
37
+ });
38
+ child.unref();
39
+ }
40
+ catch {
41
+ // Best-effort: if the launch fails (no browser, missing utility,
42
+ // sandboxed environment), the dashboard is still reachable manually
43
+ // at the URL we logged.
44
+ }
45
+ }
@@ -0,0 +1,2 @@
1
+ import type { IrisConfig } from '../types/index.js';
2
+ export declare function validatePortConfig(config: IrisConfig): void;
@@ -0,0 +1,9 @@
1
+ export function validatePortConfig(config) {
2
+ if (config.transport.type === 'http' &&
3
+ config.dashboard.enabled &&
4
+ config.transport.port === config.dashboard.port) {
5
+ throw new Error(`Port collision: HTTP transport and dashboard are both configured for port ${config.transport.port}. ` +
6
+ `Pass --dashboard-port <other> or set IRIS_DASHBOARD_PORT to a different port. ` +
7
+ `Default dashboard port is 6920; a common pair is --port 6919 --dashboard-port 6920.`);
8
+ }
9
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iris-eval/mcp-server",
3
- "version": "0.3.0",
3
+ "version": "0.4.0-rc.1",
4
4
  "description": "The agent eval standard for MCP. Score every agent output for quality, safety, and cost.",
5
5
  "mcpName": "io.github.iris-eval/mcp-server",
6
6
  "type": "module",
@@ -21,6 +21,8 @@
21
21
  "test:watch": "vitest",
22
22
  "test:coverage": "vitest run --coverage",
23
23
  "test:integration": "vitest run tests/integration/",
24
+ "test:e2e": "playwright test",
25
+ "test:e2e:ui": "playwright test --ui",
24
26
  "version:check": "bash scripts/check-version.sh",
25
27
  "version:sync": "node scripts/sync-versions.mjs",
26
28
  "clean": "rm -rf dist coverage",
@@ -81,6 +83,7 @@
81
83
  "zod": "^3.25.0"
82
84
  },
83
85
  "devDependencies": {
86
+ "@playwright/test": "^1.59.1",
84
87
  "@types/better-sqlite3": "^7.6.0",
85
88
  "@types/express": "^5.0.0",
86
89
  "@types/node": "^25.5.2",
package/server.json CHANGED
@@ -6,12 +6,12 @@
6
6
  "url": "https://github.com/iris-eval/mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.3.0",
9
+ "version": "0.4.0-rc.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "identifier": "@iris-eval/mcp-server",
14
- "version": "0.3.0",
14
+ "version": "0.4.0-rc.1",
15
15
  "transport": {
16
16
  "type": "stdio"
17
17
  },