Documentation
Everything needed to connect MCP Connector Lint and to reproduce every check locally.
Connect
Remote MCP endpoint: https://mcp-lint.superintelligencesystems.ca/mcp (Streamable HTTP, JSON responses, no authentication).
In Claude, add a custom connector with that URL, then confirm three tools appear:
validate_manifest, check_tool_annotations and lint_listing_text.
Any MCP client that speaks Streamable HTTP can use the same endpoint.
Tool input
validate_manifest
{
"manifest": {
"name": "Example Connector",
"url": "https://api.example.com/mcp",
"transport": "streamable-http",
"authentication": "none",
"service_domain": "example.com",
"tools": [ /* tools/list entries or simplified objects */ ],
"listing": { /* optional listing draft; checked with lint_listing_text rules */ }
},
"expect": "read-only"
}
check_tool_annotations
{ "tools": [ /* raw tools/list entries, or simplified objects with top-level readOnlyHint */ ], "expect": "read-only" }
lint_listing_text
{
"listing": {
"name": "Example Connector",
"one_liner": "Checks a connector before it is submitted to the directory.",
"description": "Long description, up to 2,000 characters.",
"categories": ["Developer tools"],
"docs_url": "https://example.com/docs",
"privacy_url": "https://example.com/privacy",
"support_contact": "support@example.com",
"reviewer_note": "No account needed",
"icon_url": "https://example.com/icon.png",
"slug": "example-connector",
"authentication": "none"
}
}
Output
{
"ok": false,
"verdict": "fail",
"ruleset": "2026-11-03.1",
"summary": { "errors": 2, "warnings": 1, "infos": 0 },
"findings": [
{ "rule": "MNF-008", "severity": "error", "path": "manifest.url",
"message": "host \"localhost\" is a loopback or private address",
"fix": "Publish the server on a public HTTPS hostname." }
],
"guidance": "Fix the 2 blocking errors before submitting. Warnings are advisory, but each one is the kind of thing a reviewer notices."
}
ok is false only when there is a blocking error. Findings are sorted and de-duplicated, so identical input produces identical output. A validation failure is a result, not an error: the call succeeds and returns the report.
Rules
58 deterministic rules across the three tools. The rationale column cites the directory requirement each rule encodes.
| Rule | Severity | Check | Why |
|---|---|---|---|
MNF-001 | error | Manifest must be a JSON object | Every other check needs named fields; an array or scalar has none. |
MNF-002 | error | Server name is required | The directory shows the server name and reviewers use it to identify the connector. |
MNF-003 | warning | Server name over 100 characters | The listing name field is capped at 100 characters; a longer server name will not fit it. |
MNF-004 | error | Local transport cannot be listed | The directory requires a remote server; stdio or local-only transports are refused. |
MNF-005 | warning | SSE transport is legacy | Streamable HTTP is the current remote transport; SSE still works but is the older spec revision. |
MNF-006 | error | Remote URL is required | The portal's first step asks for the connector URL; there is nothing to scan without it. |
MNF-007 | error | URL must use HTTPS | Connector URLs must be remote HTTPS; plain HTTP and WebSocket URLs are refused. |
MNF-008 | error | URL points at a loopback or private host | A localhost or RFC 1918 address is not reachable by the reviewer's machine or the portal scan. |
MNF-009 | error | Static bearer token authentication blocks listing | Directory auth is OAuth 2.0 for account-scoped tools or none for public data; a static token is refused. |
MNF-010 | warning | Authentication mode is missing or unrecognised | The portal asks how users sign in, so the manifest should state none or OAuth 2.0 explicitly. |
MNF-011 | error | Manifest must expose at least one tool | A connector with no tools has no review surface and no reason to be listed. |
MNF-012 | warning | First-party service domain is not declared | The directory requires the server to call its own first-party API; declaring the service domain makes that checkable. |
MNF-013 | error | Server URL does not match the declared service domain | The server domain must match the service it fronts; a mismatch is how proxy servers get refused. |
MNF-014 | warning | Manifest and listing names differ | Reviewers match the connector to its listing; two different names for one product read as two products. |
ANN-001 | error | Tool entry is not an object | tools/list returns objects; anything else cannot carry a name or annotations. |
ANN-002 | error | Tool name is required | An unnamed tool cannot be called or reviewed. |
ANN-003 | error | Tool name over 64 characters | The directory caps tool names at 64 characters, snake_case or kebab-case. |
ANN-004 | warning | Tool name is not snake_case or kebab-case | The directory accepts snake_case or kebab-case names; spaces and mixed case are flagged in review. |
ANN-005 | error | Tool title is required | The portal flags tools whose title is missing; the title is the human label shown to users. |
ANN-006 | warning | Tool title is long | Titles are labels; a long sentence is hard to scan in the connector's tool list. |
ANN-007 | error | Tool description is required | The description is what the model reads to decide when to call the tool. |
ANN-008 | warning | Tool description is very short | A description under 20 characters cannot state what the tool returns. |
ANN-009 | error | Tool has no side-effect annotation | Every tool must set readOnlyHint true, or destructiveHint, so clients know what it does. |
ANN-010 | error | readOnlyHint and destructiveHint are both true | The two hints contradict each other; clients use them to decide whether to ask for confirmation. |
ANN-011 | warning | Tool character is ambiguous | readOnlyHint false with destructiveHint false says the tool acts on data but hides what kind of action it takes. |
ANN-012 | warning | inputSchema is missing or not an object schema | MCP expects an object JSON Schema so clients can validate arguments and render them. |
ANN-013 | warning | Description contains instructions to the model | Tool descriptions describe the tool; hidden instructions or prompt-injection phrasing are refused in review. |
ANN-014 | warning | Description contains a URL, contact or promotion | Cross-promotion and contact details belong in listing fields, not tool descriptions. |
ANN-015 | warning | Write-verb name is marked read-only | A create/update/delete style name with readOnlyHint true is a contradiction a reviewer will test. |
ANN-016 | warning | Read-verb name is marked destructive | A get/list style name with destructiveHint true is a contradiction a reviewer will test. |
ANN-017 | error | Duplicate tool name | tools/list must be unambiguous; duplicate names make a call target undefined. |
ANN-018 | error | Destructive tool in a read-only connector | The caller declared the connector read-only, so a destructive tool is a contract mismatch. |
LST-001 | error | Listing name is required | The portal cannot save a listing without a name. |
LST-002 | error | Listing name over 100 characters | The directory caps the listing name at 100 characters. |
LST-003 | warning | Listing name has stray whitespace | Leading, trailing or doubled spaces are invisible in review and look careless in the directory. |
LST-004 | error | One-liner is required | The portal asks for a one-liner; it is the line that appears under the name. |
LST-005 | error | One-liner over 200 characters | The directory caps the one-liner at 200 characters. |
LST-006 | warning | One-liner is very short | Under 20 characters the one-liner cannot say what task the connector completes. |
LST-007 | error | Description is required | The description is where the listing explains what each tool does and what it does not do. |
LST-008 | error | Description over 2,000 characters | The directory caps the description at 2,000 characters. |
LST-009 | warning | Description is thin | Under 200 characters rarely covers what each tool does, who it is for and what it does not do. |
LST-010 | error | Categories must number 1 to 5 | The listing accepts one to five categories. |
LST-011 | warning | Categories contain duplicates or empty values | A repeated or blank category is a form error reviewers have to sort out. |
LST-012 | error | Documentation URL is required | The portal requires a documentation URL, and it must resolve. |
LST-013 | error | Documentation URL is not HTTPS | Documentation links are fetched by reviewers; plain HTTP or a malformed URL fails the check. |
LST-014 | error | Privacy-policy URL is required | The portal requires a privacy-policy URL for every connector. |
LST-015 | error | Privacy-policy URL is not HTTPS | The privacy link is clicked in review; plain HTTP or a malformed URL fails the check. |
LST-016 | error | Support contact is required | The listing must name a support route a user can actually reach. |
LST-017 | warning | Support contact looks like a placeholder | example.com, todo and tbd addresses do not reach anyone. |
LST-018 | warning | Unverifiable superlative in the copy | Superlatives such as best or world-class are not checkable and draw reviewer questions. |
LST-019 | warning | Contact details inside listing text | The directory asks for contact details in their own fields, not inside the name, one-liner or description. |
LST-020 | warning | Instructions to the model inside listing text | Listing copy is read by people; instruction or prompt-injection phrasing is refused in review. |
LST-021 | warning | Slug is missing or invalid | The slug is permanent once published; it should be lowercase, hyphenated and short. |
LST-022 | warning | Icon is missing | The listing asks for an icon; a connector without one ships an unfinished card. |
LST-023 | error | Icon URL is not HTTPS | Icons should be served over HTTPS; a malformed or insecure icon URL fails the asset check. |
LST-024 | warning | Authless listing has no reviewer note | For authless connectors the portal asks for a note such as "no account needed"; leaving it blank stalls review. |
LST-026 | error | Listing payload is not a JSON object | The listing fields are read by name; an array or scalar has none. |
LST-025 | warning | Reviewer note mentions credentials for an authless connector | If the connector needs no account, a note containing a password or token contradicts it. |
Limits
- Request body: 256 KB maximum (413 above that).
- Tools per call: 200 maximum (checked by
check_tool_annotationsandvalidate_manifest). - The MCP endpoint is stateless: every POST is a complete JSON-RPC exchange, no session to expire.
- GET streaming is not supported; POST JSON-RPC to
/mcp.
REST API
Same engine, same report, for testing outside an MCP client:
POST /api/v1/validate-manifest POST /api/v1/check-tool-annotations POST /api/v1/lint-listing-text GET /health GET /rules
The request body is the tool argument object shown above. Responses are application/json; errors are
{"error":{"code":"…","message":"…"}} with a 4xx status and an actionable message.
Run it locally
npm install npm test # deterministic suite npm run dev # wrangler dev, http://localhost:8787 npm run typecheck
Source and issue tracker: https://github.com/devops-gm88/mcp-connector-lint.