mcpspec 1.0.1 → 1.0.3

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 (3) hide show
  1. package/README.md +68 -369
  2. package/dist/index.js +29 -4
  3. package/package.json +5 -5
package/README.md CHANGED
@@ -1,10 +1,27 @@
1
- # MCPSpec
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/light-handle/mcpspec/main/mcpspec.png" alt="MCPSpec" width="200" />
3
+ </p>
2
4
 
3
- **The complete testing, debugging, and quality platform for MCP servers.**
5
+ <h1 align="center">MCPSpec</h1>
4
6
 
5
- MCPSpec is Postman for [Model Context Protocol](https://modelcontextprotocol.io) — test collections, interactive inspection, security auditing, performance benchmarking, auto-generated docs, and a quality scoring system. Works from the CLI, in CI/CD, or through a full web UI.
7
+ <p align="center">
8
+ <strong>The complete testing platform for MCP servers</strong>
9
+ </p>
6
10
 
7
- ```
11
+ <p align="center">
12
+ <a href="https://www.npmjs.com/package/mcpspec"><img src="https://img.shields.io/npm/v/mcpspec.svg?style=flat&colorA=18181B&colorB=3b82f6" alt="npm version" /></a>
13
+ <a href="https://www.npmjs.com/package/mcpspec"><img src="https://img.shields.io/npm/dm/mcpspec.svg?style=flat&colorA=18181B&colorB=3b82f6" alt="npm downloads" /></a>
14
+ <a href="https://github.com/light-handle/mcpspec/blob/main/LICENSE"><img src="https://img.shields.io/github/license/light-handle/mcpspec?style=flat&colorA=18181B&colorB=3b82f6" alt="license" /></a>
15
+ <img src="https://img.shields.io/badge/node-%3E%3D22-3b82f6?style=flat&colorA=18181B" alt="node 22+" />
16
+ </p>
17
+
18
+ <p align="center">
19
+ Test collections, interactive inspection, security auditing, performance benchmarking, auto-generated docs, and quality scoring for <a href="https://modelcontextprotocol.io">Model Context Protocol</a> servers. Works from the CLI, in CI/CD, or through a full web UI.
20
+ </p>
21
+
22
+ ---
23
+
24
+ ```bash
8
25
  mcpspec test ./collection.yaml # Run tests
9
26
  mcpspec inspect "npx my-server" # Interactive REPL
10
27
  mcpspec audit "npx my-server" # Security scan
@@ -14,400 +31,82 @@ mcpspec docs "npx my-server" # Auto-generate documentation
14
31
  mcpspec ui # Launch web dashboard
15
32
  ```
16
33
 
17
- ---
18
-
19
- ## Why MCPSpec?
20
-
21
- MCP servers expose tools (file access, database queries, API calls) to AI assistants. Before shipping a server, you need to answer:
22
-
23
- - **Does it work?** — Do tools return correct results? Do they handle bad input?
24
- - **Is it safe?** — Can inputs cause path traversal, injection, or information leaks?
25
- - **Is it fast?** — What's the P95 latency? Can it handle load?
26
- - **Is it documented?** — Do tools have descriptions and proper schemas?
27
-
28
- MCPSpec answers all of these with a single tool.
29
-
30
- ---
31
-
32
- ## Installation
34
+ ## Quick Start
33
35
 
34
36
  ```bash
37
+ # 1. Install
35
38
  npm install -g mcpspec
36
- ```
37
-
38
- Requires Node.js 22+.
39
39
 
40
- ---
41
-
42
- ## Quick Start
43
-
44
- ### 1. Initialize a project
45
-
46
- ```bash
40
+ # 2. Scaffold a project
47
41
  mcpspec init --template standard
48
- ```
49
-
50
- ### 2. Write a test collection
51
-
52
- ```yaml
53
- name: Filesystem Server Tests
54
- server: npx @modelcontextprotocol/server-filesystem /tmp
55
-
56
- tests:
57
- - name: Read a file
58
- call: read_file
59
- with:
60
- path: /tmp/test.txt
61
- expect:
62
- - exists: $.content
63
-
64
- - name: Handle missing file
65
- call: read_file
66
- with:
67
- path: /tmp/nonexistent.txt
68
- expectError: true
69
- ```
70
-
71
- ### 3. Run it
72
-
73
- ```bash
74
- mcpspec test ./collection.yaml
75
- ```
76
42
 
43
+ # 3. Run tests
44
+ mcpspec test
77
45
  ```
78
- MCPSpec running Filesystem Server Tests (2 tests)
79
46
 
80
- Read a file (124ms)
81
- ✓ Handle missing file (89ms)
47
+ ## Features
82
48
 
83
- Tests: 2 passed (2 total)
84
- Time: 0.45s
85
- ```
86
-
87
- ---
49
+ | | Feature | Description |
50
+ |---|---|---|
51
+ | **Test Collections** | YAML-based test suites with 10 assertion types, environments, variables, tags, retries, and parallel execution |
52
+ | **Interactive Inspector** | Connect to any MCP server and explore tools, resources, and schemas in a live REPL |
53
+ | **Security Audit** | Scan for path traversal, injection, auth bypass, resource exhaustion, and info disclosure. Safety filter auto-skips destructive tools; `--dry-run` previews targets |
54
+ | **Benchmarks** | Measure min/max/mean/median/P95/P99 latency and throughput across hundreds of iterations |
55
+ | **MCP Score** | 0-100 quality rating across documentation, schema quality, error handling, responsiveness, and security |
56
+ | **Doc Generator** | Auto-generate Markdown or HTML documentation from server introspection |
57
+ | **Web Dashboard** | Full React UI with server management, test runner, audit viewer, and dark mode |
58
+ | **CI/CD Ready** | JUnit/JSON/TAP reporters, deterministic exit codes, `--ci` mode, GitHub Actions compatible |
88
59
 
89
60
  ## Commands
90
61
 
91
- ### `mcpspec test` — Run Test Collections
92
-
93
- ```bash
94
- mcpspec test # Uses ./mcpspec.yaml
95
- mcpspec test ./tests.yaml # Specific file
96
- mcpspec test --env staging # Use staging variables
97
- mcpspec test --tag @smoke # Filter by tag
98
- mcpspec test --parallel 4 # Parallel execution
99
- mcpspec test --reporter junit --output results.xml # JUnit for CI
100
- mcpspec test --baseline main # Compare against saved baseline
101
- mcpspec test --watch # Re-run on file changes
102
- mcpspec test --ci # CI mode (no colors, strict exit codes)
103
- ```
104
-
105
- **Reporters:** `console`, `json`, `junit`, `html`, `tap`
106
-
107
- ### `mcpspec inspect` — Interactive REPL
108
-
109
- ```bash
110
- mcpspec inspect "npx @modelcontextprotocol/server-filesystem /tmp"
111
- ```
112
-
113
62
  | Command | Description |
114
63
  |---------|-------------|
115
- | `.tools` | List all tools |
116
- | `.resources` | List all resources |
117
- | `.call <tool> <json>` | Call a tool |
118
- | `.schema <tool>` | Show input schema |
119
- | `.info` | Server info |
120
- | `.exit` | Disconnect |
121
-
122
- ### `mcpspec audit` Security Scanner
123
-
124
- Scans for 6 categories of vulnerabilities:
125
-
126
- ```bash
127
- mcpspec audit "npx my-server" # Passive (safe, read-only)
128
- mcpspec audit "npx my-server" --mode active # Active (test payloads)
129
- mcpspec audit "npx my-server" --mode aggressive # Aggressive probing
130
- mcpspec audit "npx my-server" --fail-on medium # Fail CI on medium+ findings
131
- ```
132
-
133
- | Rule | What It Detects |
134
- |------|-----------------|
135
- | Path Traversal | `../../etc/passwd` style attacks |
136
- | Input Validation | Missing/malformed input handling |
137
- | Resource Exhaustion | Crash-inducing large payloads |
138
- | Auth Bypass | Access control circumvention |
139
- | Injection | SQL/command injection in tool inputs |
140
- | Information Disclosure | Leaked paths, stack traces, secrets |
141
-
142
- Active and aggressive modes send potentially harmful payloads and require confirmation (or `--acknowledge-risk` for CI).
143
-
144
- ### `mcpspec bench` — Performance Benchmark
145
-
146
- ```bash
147
- mcpspec bench "npx my-server" # Default: 100 iterations
148
- mcpspec bench "npx my-server" --iterations 500 # More iterations
149
- mcpspec bench "npx my-server" --tool read_file # Specific tool
150
- mcpspec bench "npx my-server" --args '{"path":"/tmp/f"}' # With arguments
151
- ```
152
-
153
- Reports min, max, mean, median, P95, P99, standard deviation, and throughput (calls/sec).
154
-
155
- ### `mcpspec score` — MCP Quality Score
156
-
157
- Calculates a 0–100 quality rating:
158
-
159
- ```bash
160
- mcpspec score "npx my-server"
161
- mcpspec score "npx my-server" --badge badge.svg # Generate SVG badge
162
- ```
163
-
164
- ```
165
- MCP Score
166
- ────────────────────────────────────────
167
- Documentation ████████████████████ 100/100
168
- Schema Quality ████████████████████ 100/100
169
- Error Handling ██████████████░░░░░░ 70/100
170
- Performance ████████████████░░░░ 80/100
171
- Security ████████████████████ 100/100
172
-
173
- Overall: 91/100
174
- ```
175
-
176
- | Category (weight) | What It Measures |
177
- |--------------------|-----------------|
178
- | Documentation (25%) | % of tools/resources with descriptions |
179
- | Schema Quality (25%) | Proper `type`, `properties`, `required` in input schemas |
180
- | Error Handling (20%) | Returns `isError: true` for bad input vs. crashing |
181
- | Performance (15%) | Median response latency |
182
- | Security (15%) | Findings from a passive security scan |
183
-
184
- The `--badge` flag generates a shields.io-style SVG for your README.
185
-
186
- ### `mcpspec docs` — Documentation Generator
187
-
188
- ```bash
189
- mcpspec docs "npx my-server" # Markdown to stdout
190
- mcpspec docs "npx my-server" --format html # HTML output
191
- mcpspec docs "npx my-server" --output ./docs # Write to directory
192
- ```
193
-
194
- Connects to the server, introspects all tools and resources, and generates documentation with tool descriptions, input schemas, and resource tables.
195
-
196
- ### `mcpspec compare` / `mcpspec baseline` — Regression Detection
197
-
198
- ```bash
199
- mcpspec baseline save main # Save current run as "main"
200
- mcpspec baseline list # List saved baselines
201
- mcpspec compare --baseline main # Compare latest run against baseline
202
- mcpspec compare <run-id-1> <run-id-2> # Compare two specific runs
203
- ```
204
-
205
- ### `mcpspec init` — Project Scaffolding
206
-
207
- ```bash
208
- mcpspec init # Current directory
209
- mcpspec init ./my-project # Specific directory
210
- mcpspec init --template minimal # Minimal starter
211
- mcpspec init --template standard # Standard (recommended)
212
- mcpspec init --template full # Full with environments
213
- ```
214
-
215
- ### `mcpspec ui` — Web Dashboard
216
-
217
- ```bash
218
- mcpspec ui # Opens localhost:6274
219
- mcpspec ui --port 8080 # Custom port
220
- ```
221
-
222
- Full web interface with:
223
- - Server management and connection testing
224
- - Collection editor with YAML validation
225
- - Test run history with drill-down
226
- - Interactive tool inspector
227
- - Security audit with live progress
228
- - Performance benchmarking with real-time stats
229
- - Documentation generator with copy/download
230
- - MCP Score calculator with category breakdown
231
- - Dark mode
232
-
233
- ---
234
-
235
- ## Collection Format
236
-
237
- ### Simple Format
238
-
239
- ```yaml
240
- name: My Tests
241
- server: npx my-mcp-server
242
-
243
- tests:
244
- - name: Basic call
245
- call: tool_name
246
- with:
247
- param: value
248
- expect:
249
- - exists: $.result
250
- ```
251
-
252
- ### Advanced Format
253
-
254
- ```yaml
255
- schemaVersion: "1.0"
256
- name: Comprehensive Tests
257
- description: Full test suite
258
-
259
- server:
260
- transport: stdio
261
- command: npx
262
- args: ["my-mcp-server"]
263
- env:
264
- NODE_ENV: test
265
-
266
- environments:
267
- dev:
268
- variables:
269
- BASE_PATH: /tmp/dev
270
- prod:
271
- variables:
272
- BASE_PATH: /data
273
-
274
- defaultEnvironment: dev
275
-
276
- tests:
277
- - id: test-1
278
- name: Get data
279
- tags: [smoke, api]
280
- timeout: 5000
281
- retries: 2
282
- call: get_data
283
- with:
284
- path: "{{BASE_PATH}}/file.txt"
285
- assertions:
286
- - type: schema
287
- - type: exists
288
- path: $.content
289
- - type: matches
290
- path: $.content
291
- pattern: "^Hello"
292
- - type: latency
293
- maxMs: 1000
294
- - type: expression
295
- expr: "response.content.length > 0"
296
- extract:
297
- - name: fileContent
298
- path: $.content
299
- ```
300
-
301
- ### Assertion Types
302
-
303
- | Type | Description | Example |
304
- |------|-------------|---------|
305
- | `schema` | Response is valid | `type: schema` |
306
- | `equals` | Exact match | `path: $.id, value: 123` |
307
- | `contains` | Array/string contains | `path: $.tags, value: "active"` |
308
- | `exists` | Path exists | `path: $.name` |
309
- | `matches` | Regex match | `path: $.email, pattern: ".*@.*"` |
310
- | `type` | Type check | `path: $.count, expected: number` |
311
- | `length` | Length check | `path: $.items, operator: gt, value: 0` |
312
- | `latency` | Response time | `maxMs: 1000` |
313
- | `mimeType` | Content type | `expected: "image/png"` |
314
- | `expression` | Safe expression | `expr: "response.total > 0"` |
315
-
316
- Expressions use [expr-eval](https://github.com/silentmatt/expr-eval) — comparisons, logical operators, property access, and math. No arbitrary code execution.
317
-
318
- ---
319
-
320
- ## CI/CD Integration
321
-
322
- ### GitHub Actions
323
-
324
- ```yaml
325
- name: MCP Server Tests
326
- on: [push, pull_request]
327
-
328
- jobs:
329
- test:
330
- runs-on: ubuntu-latest
331
- steps:
332
- - uses: actions/checkout@v4
333
- - uses: actions/setup-node@v4
334
- with:
335
- node-version: '22'
336
-
337
- - run: npm install -g mcpspec
338
-
339
- - name: Run tests
340
- run: mcpspec test --ci --reporter junit --output results.xml
341
-
342
- - name: Security audit
343
- run: mcpspec audit "npx my-server" --mode passive --fail-on high
344
-
345
- - uses: mikepenz/action-junit-report@v4
346
- if: always()
347
- with:
348
- report_paths: results.xml
349
- ```
350
-
351
- ### Exit Codes
352
-
353
- | Code | Meaning |
354
- |------|---------|
355
- | 0 | Success |
356
- | 1 | Test failure |
357
- | 2 | Runtime error |
358
- | 3 | Configuration error |
359
- | 4 | Connection error |
360
- | 5 | Timeout |
361
- | 6 | Security findings above threshold |
362
- | 7 | Validation error |
363
- | 130 | Interrupted (Ctrl+C) |
364
-
365
- ---
64
+ | `mcpspec test [collection]` | Run test collections with `--env`, `--tag`, `--parallel`, `--reporter`, `--watch`, `--ci` |
65
+ | `mcpspec inspect <server>` | Interactive REPL — `.tools`, `.call`, `.schema`, `.resources`, `.info` |
66
+ | `mcpspec audit <server>` | Security scan `--mode`, `--fail-on`, `--exclude-tools`, `--dry-run` |
67
+ | `mcpspec bench <server>` | Performance benchmark `--iterations`, `--tool`, `--args` |
68
+ | `mcpspec score <server>` | Quality score (0-100) — `--badge badge.svg` |
69
+ | `mcpspec docs <server>` | Generate docs — `--format markdown\|html`, `--output <dir>` |
70
+ | `mcpspec compare` | Compare test runs or `--baseline <name>` |
71
+ | `mcpspec baseline save <name>` | Save/list baselines for regression detection |
72
+ | `mcpspec init [dir]` | Scaffold project — `--template minimal\|standard\|full` |
73
+ | `mcpspec ui` | Launch web dashboard on `localhost:6274` |
74
+
75
+ ## Community Collections
76
+
77
+ Pre-built test suites for popular MCP servers in [`examples/collections/servers/`](https://github.com/light-handle/mcpspec/tree/main/examples/collections/servers):
78
+
79
+ | Collection | Server | Tests |
80
+ |------------|--------|-------|
81
+ | filesystem.yaml | @modelcontextprotocol/server-filesystem | 12 |
82
+ | memory.yaml | @modelcontextprotocol/server-memory | 10 |
83
+ | everything.yaml | @modelcontextprotocol/server-everything | 11 |
84
+ | fetch.yaml | @modelcontextprotocol/server-fetch | 7 |
85
+ | time.yaml | @modelcontextprotocol/server-time | 10 |
86
+ | chrome-devtools.yaml | chrome-devtools-mcp | 11 |
87
+ | github.yaml | @modelcontextprotocol/server-github | 9 |
88
+
89
+ **70 tests** covering tool discovery, read/write operations, error handling, security edge cases, and latency.
366
90
 
367
91
  ## Architecture
368
92
 
369
- MCPSpec is a TypeScript monorepo:
370
-
371
93
  | Package | Description |
372
94
  |---------|-------------|
373
95
  | `@mcpspec/shared` | Types, Zod schemas, constants |
374
96
  | `@mcpspec/core` | MCP client, test runner, assertions, security scanner, profiler, doc generator, scorer |
375
97
  | `@mcpspec/cli` | 10 CLI commands built with Commander.js |
376
- | `@mcpspec/server` | Hono HTTP server with REST API + WebSocket for real-time updates |
377
- | `@mcpspec/ui` | React SPA with TanStack Router, TanStack Query, Tailwind CSS, shadcn/ui |
378
-
379
- Key design decisions:
380
- - **Local-first** — works offline, no account needed, server binds to localhost only
381
- - **Safe by default** — FAILSAFE YAML parsing, secret masking, process cleanup on SIGINT/SIGTERM
382
- - **sql.js** for storage — WebAssembly SQLite, no native compilation required
383
- - **Transports** — stdio, SSE, and streamable-http (SSE/HTTP lazy-loaded for code splitting)
384
-
385
- ---
98
+ | `@mcpspec/server` | Hono HTTP server with REST API + WebSocket |
99
+ | `@mcpspec/ui` | React SPA TanStack Router, TanStack Query, Tailwind, shadcn/ui |
386
100
 
387
101
  ## Development
388
102
 
389
103
  ```bash
390
- git clone https://github.com/mcpspec/mcpspec.git
104
+ git clone https://github.com/light-handle/mcpspec.git
391
105
  cd mcpspec
392
- pnpm install
393
- pnpm build
394
- pnpm test # 259 tests across core + server
395
- ```
396
-
397
- Run the CLI locally:
398
-
399
- ```bash
400
- node packages/cli/dist/index.js test ./examples/collections/simple.yaml
401
- ```
402
-
403
- Launch the UI in dev mode:
404
-
405
- ```bash
406
- node packages/cli/dist/index.js ui
106
+ pnpm install && pnpm build
107
+ pnpm test # 260 tests across core + server
407
108
  ```
408
109
 
409
- ---
410
-
411
110
  ## License
412
111
 
413
112
  MIT
package/dist/index.js CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  // src/index.ts
4
4
  import { Command as Command11 } from "commander";
5
+ import { readFileSync as readFileSync3 } from "fs";
6
+ import { dirname, join as join2 } from "path";
7
+ import { fileURLToPath } from "url";
5
8
 
6
9
  // src/commands/test.ts
7
10
  import { Command } from "commander";
@@ -758,14 +761,16 @@ var SEVERITY_COLORS = {
758
761
  low: COLORS2.cyan,
759
762
  info: COLORS2.gray
760
763
  };
761
- var auditCommand = new Command7("audit").description("Run security audit on an MCP server").argument("<server>", "Server command or URL").option("--mode <mode>", "Scan mode: passive, active, aggressive", "passive").option("--acknowledge-risk", "Skip confirmation prompt for active/aggressive modes", false).option("--fail-on <severity>", "Fail with exit code 6 if findings at or above severity: info, low, medium, high, critical").option("--rules <rules...>", "Only run specific rules").action(async (serverCommand, options) => {
764
+ var auditCommand = new Command7("audit").description("Run security audit on an MCP server").argument("<server>", "Server command or URL").option("--mode <mode>", "Scan mode: passive, active, aggressive", "passive").option("--acknowledge-risk", "Skip confirmation prompt for active/aggressive modes", false).option("--fail-on <severity>", "Fail with exit code 6 if findings at or above severity: info, low, medium, high, critical").option("--rules <rules...>", "Only run specific rules").option("--exclude-tools <tools...>", "Skip specific tools during scanning").option("--dry-run", "Preview which tools will be scanned without running payloads", false).action(async (serverCommand, options) => {
762
765
  let client = null;
763
766
  try {
764
767
  const mode = options.mode;
765
768
  const config = new ScanConfig({
766
769
  mode,
767
770
  acknowledgeRisk: options.acknowledgeRisk,
768
- rules: options.rules
771
+ rules: options.rules,
772
+ excludeTools: options.excludeTools,
773
+ dryRun: options.dryRun
769
774
  });
770
775
  if (config.requiresConfirmation()) {
771
776
  console.log(`
@@ -793,6 +798,24 @@ ${COLORS2.cyan} Connecting to:${COLORS2.reset} ${serverCommand}`);
793
798
  console.log(`${COLORS2.gray} Scan mode: ${mode} | Rules: ${config.rules.join(", ")}${COLORS2.reset}
794
799
  `);
795
800
  const scanner = new SecurityScanner();
801
+ if (config.dryRun) {
802
+ const preview = await scanner.dryRun(client, config);
803
+ console.log(`${COLORS2.bold} Dry Run \u2014 Tools to scan:${COLORS2.reset}
804
+ `);
805
+ for (const tool of preview.tools) {
806
+ if (tool.included) {
807
+ console.log(` ${COLORS2.green}\u2713${COLORS2.reset} ${tool.name}`);
808
+ } else {
809
+ console.log(` ${COLORS2.yellow}\u2717${COLORS2.reset} ${tool.name} ${COLORS2.gray}(${tool.reason})${COLORS2.reset}`);
810
+ }
811
+ }
812
+ console.log(`
813
+ ${COLORS2.gray}Rules: ${preview.rules.join(", ")}${COLORS2.reset}`);
814
+ console.log(` ${COLORS2.gray}Mode: ${preview.mode}${COLORS2.reset}
815
+ `);
816
+ await client.disconnect();
817
+ process.exit(EXIT_CODES6.SUCCESS);
818
+ }
796
819
  const result = await scanner.scan(client, config, {
797
820
  onRuleStart: (_ruleId, ruleName) => {
798
821
  process.stdout.write(` ${COLORS2.gray}Running ${ruleName}...${COLORS2.reset}`);
@@ -1062,7 +1085,7 @@ ${COLORS5.bold} MCP Score${COLORS5.reset}`);
1062
1085
  { name: "Documentation", score: score.categories.documentation },
1063
1086
  { name: "Schema Quality", score: score.categories.schemaQuality },
1064
1087
  { name: "Error Handling", score: score.categories.errorHandling },
1065
- { name: "Performance", score: score.categories.performance },
1088
+ { name: "Responsiveness", score: score.categories.responsiveness },
1066
1089
  { name: "Security", score: score.categories.security }
1067
1090
  ];
1068
1091
  for (const cat of categories) {
@@ -1094,8 +1117,10 @@ ${COLORS5.bold} MCP Score${COLORS5.reset}`);
1094
1117
  });
1095
1118
 
1096
1119
  // src/index.ts
1120
+ var __cliDir = dirname(fileURLToPath(import.meta.url));
1121
+ var pkg = JSON.parse(readFileSync3(join2(__cliDir, "..", "package.json"), "utf-8"));
1097
1122
  var program = new Command11();
1098
- program.name("mcpspec").description("The definitive MCP server testing platform").version("1.0.0");
1123
+ program.name("mcpspec").description("The definitive MCP server testing platform").version(pkg.version);
1099
1124
  program.addCommand(testCommand);
1100
1125
  program.addCommand(inspectCommand);
1101
1126
  program.addCommand(initCommand);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcpspec",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "The definitive MCP server testing platform",
5
5
  "keywords": [
6
6
  "mcp",
@@ -19,7 +19,7 @@
19
19
  "license": "MIT",
20
20
  "repository": {
21
21
  "type": "git",
22
- "url": "https://github.com/anthropics/mcpspec.git",
22
+ "url": "https://github.com/light-handle/mcpspec.git",
23
23
  "directory": "packages/cli"
24
24
  },
25
25
  "engines": {
@@ -29,9 +29,9 @@
29
29
  "@inquirer/prompts": "^7.0.0",
30
30
  "commander": "^12.1.0",
31
31
  "open": "^10.1.0",
32
- "@mcpspec/core": "1.0.1",
33
- "@mcpspec/shared": "1.0.1",
34
- "@mcpspec/server": "1.0.1"
32
+ "@mcpspec/core": "1.0.3",
33
+ "@mcpspec/shared": "1.0.3",
34
+ "@mcpspec/server": "1.0.3"
35
35
  },
36
36
  "devDependencies": {
37
37
  "tsup": "^8.0.0",