Implements icon support based on the Model Context Protocol specification, allowing servers to specify display icons with optional size, MIME type, and theme variants. ## Changes - Add `Icon` type to `pkg/model/types.go` with struct tags for automatic API validation - Add `icons` field to `ServerJSON` in `pkg/api/v0/types.go` - Add icon validation in `internal/validators/validators.go`: - Only HTTPS URLs allowed (no HTTP or data URIs) - Maximum URL length of 255 characters - Validates absolute URLs with proper scheme - Update JSON schema and OpenAPI documentation with Icon definitions - Add comprehensive test cases for icon validation - Add example icon to seed.json (Airtable server) - Change `websiteUrl` validation to HTTPS-only for consistency ## Implementation Details The implementation uses a two-layer validation architecture: 1. **Huma framework** validates struct tags (`required`, `maxLength`, `enum`, `pattern`) and returns 422 for violations 2. **Custom validators** handle business logic (HTTPS scheme requirement, absolute URL requirement) and return 400 for violations This approach leverages Huma's automatic validation while keeping business-specific rules in the validator layer. ## Icon Field Specification - `src` (required): HTTPS URL to icon resource, max 255 characters - `mimeType` (optional): One of `image/png`, `image/jpeg`, `image/jpg`, `image/svg+xml`, `image/webp` - `sizes` (optional): Array of size strings in "WxH" format or "any" for scalable formats - `theme` (optional): Either "light" or "dark" to indicate intended background Multiple icons can be provided (e.g., for different themes or sizes).
161 lines
5.3 KiB
JSON
161 lines
5.3 KiB
JSON
[
|
|
{
|
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
"name": "io.github.domdomegg/airtable-mcp-server",
|
|
"description": "Read and write access to Airtable database schemas, tables, and records.",
|
|
"repository": {
|
|
"url": "https://github.com/domdomegg/airtable-mcp-server.git",
|
|
"source": "github"
|
|
},
|
|
"version": "1.7.2",
|
|
"icons": [
|
|
{
|
|
"src": "https://airtable.com/images/favicon/favicon-32x32.png",
|
|
"mimeType": "image/png",
|
|
"sizes": ["32x32"]
|
|
}
|
|
],
|
|
"packages": [
|
|
{
|
|
"registryType": "npm",
|
|
"identifier": "airtable-mcp-server",
|
|
"version": "1.7.2",
|
|
"runtimeHint": "npx",
|
|
"transport": {
|
|
"type": "stdio"
|
|
},
|
|
"environmentVariables": [
|
|
{
|
|
"description": "Airtable personal access token (e.g., pat123.abc123). Create at https://airtable.com/create/tokens/new with scopes: schema.bases:read, data.records:read, and optionally schema.bases:write and data.records:write.",
|
|
"isRequired": true,
|
|
"isSecret": true,
|
|
"name": "AIRTABLE_API_KEY"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"registryType": "oci",
|
|
"identifier": "domdomegg/airtable-mcp-server",
|
|
"version": "1.7.2",
|
|
"runtimeHint": "docker",
|
|
"transport": {
|
|
"type": "stdio"
|
|
},
|
|
"environmentVariables": [
|
|
{
|
|
"description": "Airtable personal access token (e.g., pat123.abc123). Create at https://airtable.com/create/tokens/new with scopes: schema.bases:read, data.records:read, and optionally schema.bases:write and data.records:write.",
|
|
"isRequired": true,
|
|
"isSecret": true,
|
|
"name": "AIRTABLE_API_KEY"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"registryType": "mcpb",
|
|
"identifier": "https://github.com/domdomegg/airtable-mcp-server/releases/download/v1.7.2/airtable-mcp-server.mcpb",
|
|
"version": "1.7.2",
|
|
"fileSha256": "8220de07a08ebe908f04da139ea03dbfe29758141347e945da60535fb7bcca20",
|
|
"transport": {
|
|
"type": "stdio"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
"name": "io.github.domdomegg/airtable-mcp-server",
|
|
"description": "Read and write access to Airtable database schemas, tables, and records.",
|
|
"repository": {
|
|
"url": "https://github.com/domdomegg/airtable-mcp-server.git",
|
|
"source": "github"
|
|
},
|
|
"version": "1.7.3",
|
|
"packages": [
|
|
{
|
|
"registryType": "npm",
|
|
"identifier": "airtable-mcp-server",
|
|
"version": "1.7.3",
|
|
"runtimeHint": "npx",
|
|
"transport": {
|
|
"type": "stdio"
|
|
},
|
|
"environmentVariables": [
|
|
{
|
|
"description": "Airtable personal access token (e.g., pat123.abc123). Create at https://airtable.com/create/tokens/new with scopes: schema.bases:read, data.records:read, and optionally schema.bases:write and data.records:write.",
|
|
"isRequired": true,
|
|
"isSecret": true,
|
|
"name": "AIRTABLE_API_KEY"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"registryType": "oci",
|
|
"identifier": "domdomegg/airtable-mcp-server",
|
|
"version": "1.7.3",
|
|
"runtimeHint": "docker",
|
|
"transport": {
|
|
"type": "stdio"
|
|
},
|
|
"environmentVariables": [
|
|
{
|
|
"description": "Airtable personal access token (e.g., pat123.abc123). Create at https://airtable.com/create/tokens/new with scopes: schema.bases:read, data.records:read, and optionally schema.bases:write and data.records:write.",
|
|
"isRequired": true,
|
|
"isSecret": true,
|
|
"name": "AIRTABLE_API_KEY"
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"registryType": "mcpb",
|
|
"identifier": "https://github.com/domdomegg/airtable-mcp-server/releases/download/v1.7.3/airtable-mcp-server.mcpb",
|
|
"version": "1.7.3",
|
|
"fileSha256": "0f28a9129cfebd262dfb77854c872355d21401bb3e056575b3027081f5d570ca",
|
|
"transport": {
|
|
"type": "stdio"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
"name": "io.github.domdomegg/time-mcp-nuget",
|
|
"description": "Get the current UTC time in RFC 3339 format.",
|
|
"repository": {
|
|
"url": "https://github.com/domdomegg/time-mcp-nuget.git",
|
|
"source": "github"
|
|
},
|
|
"version": "1.0.8",
|
|
"packages": [
|
|
{
|
|
"registryType": "nuget",
|
|
"identifier": "TimeMcpServer",
|
|
"version": "1.0.8",
|
|
"runtimeHint": "dnx",
|
|
"transport": {
|
|
"type": "stdio"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
"name": "io.github.domdomegg/time-mcp-pypi",
|
|
"description": "Get the current UTC time in RFC 3339 format.",
|
|
"repository": {
|
|
"url": "https://github.com/domdomegg/time-mcp-pypi.git",
|
|
"source": "github"
|
|
},
|
|
"version": "1.0.6",
|
|
"packages": [
|
|
{
|
|
"registryType": "pypi",
|
|
"identifier": "time-mcp-pypi",
|
|
"version": "1.0.6",
|
|
"runtimeHint": "python",
|
|
"transport": {
|
|
"type": "stdio"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|