From a25bb1ba5f189db3bb0437a78f8ee3485dc92b1f Mon Sep 17 00:00:00 2001 From: Juan Cruz Viotti Date: Sat, 23 May 2026 19:13:21 -0400 Subject: [PATCH] Support `websiteUrl` and `description` in MCP server info Signed-off-by: Juan Cruz Viotti --- enterprise/e2e/html/hurl/mcp-2025-06-18.all.hurl | 1 + .../e2e/html/hurl/mcp-2025-11-25-gzip.all.hurl | 4 ++++ .../e2e/html/hurl/mcp-2025-11-25-lifecycle.all.hurl | 2 ++ .../e2e/html/hurl/mcp-2025-11-25-resources.all.hurl | 4 ++-- enterprise/e2e/path/hurl/mcp-2025-06-18.all.hurl | 1 + .../e2e/path/hurl/mcp-2025-11-25-gzip.all.hurl | 4 ++++ .../e2e/path/hurl/mcp-2025-11-25-lifecycle.all.hurl | 2 ++ .../e2e/path/hurl/mcp-2025-11-25-resources.all.hurl | 4 ++-- src/index/explorer.h | 9 +++++++-- src/self/v1/schemas/mcp/initialize/response.json | 12 +++++++++++- src/self/v1/schemas/mcp/response.json | 4 +++- test/e2e/empty/hurl/mcp-2025-11-25.community.hurl | 2 ++ test/e2e/headless/hurl/mcp-2025-11-25.community.hurl | 2 ++ test/e2e/path/hurl/mcp-2025-11-25.community.hurl | 2 ++ 14 files changed, 45 insertions(+), 8 deletions(-) diff --git a/enterprise/e2e/html/hurl/mcp-2025-06-18.all.hurl b/enterprise/e2e/html/hurl/mcp-2025-06-18.all.hurl index 7a96af69..425adb75 100644 --- a/enterprise/e2e/html/hurl/mcp-2025-06-18.all.hurl +++ b/enterprise/e2e/html/hurl/mcp-2025-06-18.all.hurl @@ -35,6 +35,7 @@ jsonpath "$.result.instructions" matches "^.+$" # Added in 2025-11-25 # https://modelcontextprotocol.io/specification/2025-11-25/changelog jsonpath "$.result.serverInfo.description" not exists +jsonpath "$.result.serverInfo.websiteUrl" not exists POST {{base}}/self/v1/api/schemas/evaluate{{schema_path}} ``` diff --git a/enterprise/e2e/html/hurl/mcp-2025-11-25-gzip.all.hurl b/enterprise/e2e/html/hurl/mcp-2025-11-25-gzip.all.hurl index ef9b739b..08dbbb34 100644 --- a/enterprise/e2e/html/hurl/mcp-2025-11-25-gzip.all.hurl +++ b/enterprise/e2e/html/hurl/mcp-2025-11-25-gzip.all.hurl @@ -87,6 +87,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one-enterprise" jsonpath "$.result.serverInfo.title" == "Sourcemeta One Enterprise" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}" jsonpath "$.result.instructions" matches "^This is an instance of Sourcemeta One" POST {{base}}/self/v1/api/schemas/evaluate{{schema_path}} @@ -130,6 +132,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one-enterprise" jsonpath "$.result.serverInfo.title" == "Sourcemeta One Enterprise" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}" jsonpath "$.result.instructions" matches "^This is an instance of Sourcemeta One" POST {{base}}/self/v1/api/schemas/evaluate{{schema_path}} diff --git a/enterprise/e2e/html/hurl/mcp-2025-11-25-lifecycle.all.hurl b/enterprise/e2e/html/hurl/mcp-2025-11-25-lifecycle.all.hurl index 6051e657..b0de997a 100644 --- a/enterprise/e2e/html/hurl/mcp-2025-11-25-lifecycle.all.hurl +++ b/enterprise/e2e/html/hurl/mcp-2025-11-25-lifecycle.all.hurl @@ -29,6 +29,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one-enterprise" jsonpath "$.result.serverInfo.title" == "Sourcemeta One Enterprise" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}" jsonpath "$.result.instructions" == "This is an instance of Sourcemeta One named \"Sourcemeta\" (The next-generation JSON Schema platform). Sourcemeta One is a JSON Schema registry. It serves a catalog of JSON Schemas organized as a tree of directories. Every schema is exposed as an MCP resource via the `JSON Schema` resource template (see `resources/templates/list`) and is addressable by its canonical absolute URI. Use `tools/list` to discover the operations this catalog exposes. Learn more at https://one.sourcemeta.com" POST {{base}}/self/v1/api/schemas/evaluate{{schema_path}} diff --git a/enterprise/e2e/html/hurl/mcp-2025-11-25-resources.all.hurl b/enterprise/e2e/html/hurl/mcp-2025-11-25-resources.all.hurl index 8098f04e..3fb435b6 100644 --- a/enterprise/e2e/html/hurl/mcp-2025-11-25-resources.all.hurl +++ b/enterprise/e2e/html/hurl/mcp-2025-11-25-resources.all.hurl @@ -163,7 +163,7 @@ jsonpath "$.result.resources[28].uri" == "{{base}}/self/v1/schemas/mcp/initializ jsonpath "$.result.resources[28].name" == "response" jsonpath "$.result.resources[28].description" == "Sourcemeta One's response to a client's initialization" jsonpath "$.result.resources[28].mimeType" == "application/schema+json" -jsonpath "$.result.resources[28].size" == 2174 +jsonpath "$.result.resources[28].size" == 2482 jsonpath "$.result.resources[29].uri" == "{{base}}/self/v1/schemas/mcp/notifications/cancelled" jsonpath "$.result.resources[29].name" == "cancelled" jsonpath "$.result.resources[29].description" == "Cancellation hint from a client for an in-flight request. Sourcemeta One accepts and discards these" @@ -223,7 +223,7 @@ jsonpath "$.result.resources[40].uri" == "{{base}}/self/v1/schemas/mcp/response" jsonpath "$.result.resources[40].name" == "response" jsonpath "$.result.resources[40].description" == "Any outgoing MCP response the server returns" jsonpath "$.result.resources[40].mimeType" == "application/schema+json" -jsonpath "$.result.resources[40].size" == 3117 +jsonpath "$.result.resources[40].size" == 3215 jsonpath "$.result.resources[41].uri" == "{{base}}/self/v1/schemas/mcp/tools/call/request" jsonpath "$.result.resources[41].name" == "request" jsonpath "$.result.resources[41].description" == "Request from a client to invoke an MCP tool by name" diff --git a/enterprise/e2e/path/hurl/mcp-2025-06-18.all.hurl b/enterprise/e2e/path/hurl/mcp-2025-06-18.all.hurl index 49069053..2681af3e 100644 --- a/enterprise/e2e/path/hurl/mcp-2025-06-18.all.hurl +++ b/enterprise/e2e/path/hurl/mcp-2025-06-18.all.hurl @@ -35,6 +35,7 @@ jsonpath "$.result.instructions" matches "^.+$" # Added in 2025-11-25 # https://modelcontextprotocol.io/specification/2025-11-25/changelog jsonpath "$.result.serverInfo.description" not exists +jsonpath "$.result.serverInfo.websiteUrl" not exists POST {{base}}/v1/catalog/self/v1/api/schemas/evaluate{{schema_path}} ``` diff --git a/enterprise/e2e/path/hurl/mcp-2025-11-25-gzip.all.hurl b/enterprise/e2e/path/hurl/mcp-2025-11-25-gzip.all.hurl index a337a49b..c0129c4f 100644 --- a/enterprise/e2e/path/hurl/mcp-2025-11-25-gzip.all.hurl +++ b/enterprise/e2e/path/hurl/mcp-2025-11-25-gzip.all.hurl @@ -87,6 +87,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one-enterprise" jsonpath "$.result.serverInfo.title" == "Sourcemeta One Enterprise" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}/v1/catalog" jsonpath "$.result.instructions" matches "^This is an instance of Sourcemeta One" POST {{base}}/v1/catalog/self/v1/api/schemas/evaluate{{schema_path}} @@ -130,6 +132,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one-enterprise" jsonpath "$.result.serverInfo.title" == "Sourcemeta One Enterprise" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}/v1/catalog" jsonpath "$.result.instructions" matches "^This is an instance of Sourcemeta One" POST {{base}}/v1/catalog/self/v1/api/schemas/evaluate{{schema_path}} diff --git a/enterprise/e2e/path/hurl/mcp-2025-11-25-lifecycle.all.hurl b/enterprise/e2e/path/hurl/mcp-2025-11-25-lifecycle.all.hurl index 13175ca7..6840a4be 100644 --- a/enterprise/e2e/path/hurl/mcp-2025-11-25-lifecycle.all.hurl +++ b/enterprise/e2e/path/hurl/mcp-2025-11-25-lifecycle.all.hurl @@ -29,6 +29,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one-enterprise" jsonpath "$.result.serverInfo.title" == "Sourcemeta One Enterprise" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}/v1/catalog" jsonpath "$.result.instructions" == "This is an instance of Sourcemeta One named \"Sourcemeta\" (The next-generation JSON Schema platform). Sourcemeta One is a JSON Schema registry. It serves a catalog of JSON Schemas organized as a tree of directories. Every schema is exposed as an MCP resource via the `JSON Schema` resource template (see `resources/templates/list`) and is addressable by its canonical absolute URI. Use `tools/list` to discover the operations this catalog exposes. Learn more at https://one.sourcemeta.com" POST {{base}}/v1/catalog/self/v1/api/schemas/evaluate{{schema_path}} diff --git a/enterprise/e2e/path/hurl/mcp-2025-11-25-resources.all.hurl b/enterprise/e2e/path/hurl/mcp-2025-11-25-resources.all.hurl index 40b92fc8..08d6649c 100644 --- a/enterprise/e2e/path/hurl/mcp-2025-11-25-resources.all.hurl +++ b/enterprise/e2e/path/hurl/mcp-2025-11-25-resources.all.hurl @@ -163,7 +163,7 @@ jsonpath "$.result.resources[28].uri" == "{{base}}/v1/catalog/self/v1/schemas/mc jsonpath "$.result.resources[28].name" == "response" jsonpath "$.result.resources[28].description" == "Sourcemeta One's response to a client's initialization" jsonpath "$.result.resources[28].mimeType" == "application/schema+json" -jsonpath "$.result.resources[28].size" == 2185 +jsonpath "$.result.resources[28].size" == 2493 jsonpath "$.result.resources[29].uri" == "{{base}}/v1/catalog/self/v1/schemas/mcp/notifications/cancelled" jsonpath "$.result.resources[29].name" == "cancelled" jsonpath "$.result.resources[29].description" == "Cancellation hint from a client for an in-flight request. Sourcemeta One accepts and discards these" @@ -223,7 +223,7 @@ jsonpath "$.result.resources[40].uri" == "{{base}}/v1/catalog/self/v1/schemas/mc jsonpath "$.result.resources[40].name" == "response" jsonpath "$.result.resources[40].description" == "Any outgoing MCP response the server returns" jsonpath "$.result.resources[40].mimeType" == "application/schema+json" -jsonpath "$.result.resources[40].size" == 3128 +jsonpath "$.result.resources[40].size" == 3226 jsonpath "$.result.resources[41].uri" == "{{base}}/v1/catalog/self/v1/schemas/mcp/tools/call/request" jsonpath "$.result.resources[41].name" == "request" jsonpath "$.result.resources[41].description" == "Request from a client to invoke an MCP tool by name" diff --git a/src/index/explorer.h b/src/index/explorer.h index 06c4a70d..6d4c174c 100644 --- a/src/index/explorer.h +++ b/src/index/explorer.h @@ -621,8 +621,13 @@ struct GENERATE_MCP { initialize_ingredients.push_back( sourcemeta::core::JSON{sourcemeta::one::version()}); initialize_ingredients.push_back(sourcemeta::core::JSON{SERVER_TITLE}); - initialize_ingredients.push_back(sourcemeta::core::JSON{""}); - initialize_ingredients.push_back(sourcemeta::core::JSON{""}); + initialize_ingredients.push_back(sourcemeta::core::JSON{ + configuration.html.has_value() + ? std::string_view{configuration.html->description} + : std::string_view{}}); + initialize_ingredients.push_back(sourcemeta::core::JSON{ + configuration.html.has_value() ? std::string_view{configuration.url} + : std::string_view{}}); initialize_ingredients.push_back( sourcemeta::core::JSON{instructions.str()}); diff --git a/src/self/v1/schemas/mcp/initialize/response.json b/src/self/v1/schemas/mcp/initialize/response.json index 856c647d..6b6c5301 100644 --- a/src/self/v1/schemas/mcp/initialize/response.json +++ b/src/self/v1/schemas/mcp/initialize/response.json @@ -14,7 +14,9 @@ "serverInfo": { "name": "sourcemeta-one-enterprise", "title": "Sourcemeta One Enterprise", - "version": "1.0.0" + "version": "1.0.0", + "description": "A JSON Schema registry", + "websiteUrl": "https://example.com" }, "instructions": "Server instructions" } @@ -68,6 +70,14 @@ }, "version": { "type": "string" + }, + "description": { + "type": "string", + "minLength": 1 + }, + "websiteUrl": { + "type": "string", + "format": "uri" } }, "additionalProperties": false diff --git a/src/self/v1/schemas/mcp/response.json b/src/self/v1/schemas/mcp/response.json index e204dcc5..6e93020d 100644 --- a/src/self/v1/schemas/mcp/response.json +++ b/src/self/v1/schemas/mcp/response.json @@ -14,7 +14,9 @@ "serverInfo": { "name": "sourcemeta-one-enterprise", "title": "Sourcemeta One Enterprise", - "version": "1.0.0" + "version": "1.0.0", + "description": "A JSON Schema registry", + "websiteUrl": "https://example.com" }, "instructions": "Server instructions" } diff --git a/test/e2e/empty/hurl/mcp-2025-11-25.community.hurl b/test/e2e/empty/hurl/mcp-2025-11-25.community.hurl index 1d0f99db..170c6662 100644 --- a/test/e2e/empty/hurl/mcp-2025-11-25.community.hurl +++ b/test/e2e/empty/hurl/mcp-2025-11-25.community.hurl @@ -30,6 +30,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one" jsonpath "$.result.serverInfo.title" == "Sourcemeta One" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}" jsonpath "$.result.instructions" == "This is an instance of Sourcemeta One named \"Sourcemeta\" (The next-generation JSON Schema platform). Sourcemeta One is a JSON Schema registry. It serves a catalog of JSON Schemas organized as a tree of directories. Every schema is exposed as an MCP resource via the `JSON Schema` resource template (see `resources/templates/list`) and is addressable by its canonical absolute URI. Use `tools/list` to discover the operations this catalog exposes. Learn more at https://one.sourcemeta.com" POST {{base}}/self/v1/api/schemas/evaluate{{schema_path}} diff --git a/test/e2e/headless/hurl/mcp-2025-11-25.community.hurl b/test/e2e/headless/hurl/mcp-2025-11-25.community.hurl index 613caeda..395716e1 100644 --- a/test/e2e/headless/hurl/mcp-2025-11-25.community.hurl +++ b/test/e2e/headless/hurl/mcp-2025-11-25.community.hurl @@ -30,6 +30,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one" jsonpath "$.result.serverInfo.title" == "Sourcemeta One" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" not exists +jsonpath "$.result.serverInfo.websiteUrl" not exists jsonpath "$.result.instructions" == "This is an instance of Sourcemeta One. Sourcemeta One is a JSON Schema registry. It serves a catalog of JSON Schemas organized as a tree of directories. Every schema is exposed as an MCP resource via the `JSON Schema` resource template (see `resources/templates/list`) and is addressable by its canonical absolute URI. Use `tools/list` to discover the operations this catalog exposes. Learn more at https://one.sourcemeta.com" POST {{base}}/self/v1/api/schemas/evaluate{{schema_path}} diff --git a/test/e2e/path/hurl/mcp-2025-11-25.community.hurl b/test/e2e/path/hurl/mcp-2025-11-25.community.hurl index 39d6e30d..cf6b5c94 100644 --- a/test/e2e/path/hurl/mcp-2025-11-25.community.hurl +++ b/test/e2e/path/hurl/mcp-2025-11-25.community.hurl @@ -30,6 +30,8 @@ jsonpath "$.result.capabilities.resources" isEmpty jsonpath "$.result.serverInfo.name" == "sourcemeta-one" jsonpath "$.result.serverInfo.title" == "Sourcemeta One" jsonpath "$.result.serverInfo.version" matches "^.+$" +jsonpath "$.result.serverInfo.description" == "The next-generation JSON Schema platform" +jsonpath "$.result.serverInfo.websiteUrl" == "{{base}}/v1/catalog" jsonpath "$.result.instructions" == "This is an instance of Sourcemeta One named \"Sourcemeta\" (The next-generation JSON Schema platform). Sourcemeta One is a JSON Schema registry. It serves a catalog of JSON Schemas organized as a tree of directories. Every schema is exposed as an MCP resource via the `JSON Schema` resource template (see `resources/templates/list`) and is addressable by its canonical absolute URI. Use `tools/list` to discover the operations this catalog exposes. Learn more at https://one.sourcemeta.com" POST {{base}}/v1/catalog/self/v1/api/schemas/evaluate{{schema_path}}