Files
mcp-validate/README.md

117 lines
3.3 KiB
Markdown
Raw Normal View History

# mcp-manifest-validate
[![MCP Manifest](https://mcp-manifest.dev/media/mcp-manifest-badge-light.svg)](https://mcp-manifest.dev)
Validate `mcp-manifest.json` files, test autodiscovery from domains, and generate manifests from existing MCP server configs.
## Validate
```bash
# Validate a local manifest
npx mcp-manifest-validate ./mcp-manifest.json
# Test autodiscovery from a domain
npx mcp-manifest-validate ironlicensing.com
# Validate from a URL
npx mcp-manifest-validate https://example.com/mcp-manifest.json
# Only test discovery (skip validation)
npx mcp-manifest-validate --discover ironlicensing.com
```
## What It Checks
1. **Discovery** — Can the manifest be found via well-known URL or HTML link tag?
2. **Schema** — Does it conform to the [mcp-manifest spec](https://mcp-manifest.dev)?
3. **Semantics** — Are config keys unique? Do template variables reference real config entries? Does the transport match the endpoint?
4. **Installation** — Is the command available on PATH?
## Example Output
```
MCP Manifest Validator
Input: ironlicensing.com
Discovery
✓ Manifest found via well-known: https://ironlicensing.com/.well-known/mcp-manifest.json
Schema Validation
✓ Valid against mcp-manifest schema v0.1
Server Info
Name: IronLicensing
Version: 1.1.0
Description: Manage IronLicensing products, tiers, features, licenses, and analytics
Author: IronServices
Installation
Method: dotnet-tool (IronLicensing.Mcp)
Command: ironlicensing-mcp
✓ "ironlicensing-mcp" found on PATH
Transport
Type: stdio
Config
profile [string] (arg: --profile)
api-key [secret] (env: IRONLICENSING_API_KEY, arg: --api-key)
base-url [url] (env: IRONLICENSING_BASE_URL, arg: --base-url)
✓ All checks passed
```
## Programmatic Use
```js
import { validateManifest, discover, checkCommand } from 'mcp-manifest-validate';
// Validate a manifest object
const { valid, errors } = validateManifest(manifest);
// Discover from a domain
const { manifest, source, errors } = await discover('ironlicensing.com');
// Check if a command exists
const exists = await checkCommand('ironlicensing-mcp');
```
## Generate
Create `mcp-manifest.json` from your existing Claude Code MCP server configs:
```bash
# List all configured MCP servers
npx mcp-manifest-generate
# Generate manifest for a specific server
npx mcp-manifest-generate --server ironlicensing
# Use a specific settings file
npx mcp-manifest-generate --from-settings ~/.claude/settings.json --server myserver
# Probe the server for name/version via MCP handshake
npx mcp-manifest-generate --server ironlicensing --probe
# Output to file
npx mcp-manifest-generate --server ironlicensing -o mcp-manifest.json
# Generate for all servers
npx mcp-manifest-generate --all
# Raw JSON (for piping)
npx mcp-manifest-generate --server ironlicensing --json
```
The generator reverse-engineers your existing config:
- **`--flag value`** args become typed config entries (`--api-key` → type: `secret`)
- **Environment variables** become config entries with `env_var` field
- **Command patterns** infer install method (`npx` → npm, `uvx` → pip, `.exe` → dotnet-tool)
- **`--probe`** runs an MCP initialize handshake to get the real server name and version
Review the generated manifest, fill in the `TODO` description, and commit.
## License
CC0 1.0 — Public domain.