diff --git a/mcp-interview.json b/mcp-interview.json
index 0acb67b..b36c313 100644
--- a/mcp-interview.json
+++ b/mcp-interview.json
@@ -32,8 +32,7 @@
"tools": {
"listChanged": null
},
- "completions": {},
- "elicitation": {}
+ "completions": {}
},
"serverInfo": {
"name": "example-servers/everything",
@@ -237,21 +236,6 @@
"meta": null,
"meta": null
},
- {
- "name": "startElicitation",
- "title": null,
- "description": "Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.",
- "inputSchema": {
- "type": "object",
- "properties": {},
- "additionalProperties": false,
- "$schema": "http://json-schema.org/draft-07/schema#"
- },
- "outputSchema": null,
- "annotations": null,
- "meta": null,
- "meta": null
- },
{
"name": "getResourceLinks",
"title": null,
@@ -321,6 +305,36 @@
"annotations": null,
"meta": null,
"meta": null
+ },
+ {
+ "name": "listRoots",
+ "title": null,
+ "description": "Lists the current MCP roots provided by the client. Demonstrates the roots protocol capability even though this server doesn't access files.",
+ "inputSchema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false,
+ "$schema": "http://json-schema.org/draft-07/schema#"
+ },
+ "outputSchema": null,
+ "annotations": null,
+ "meta": null,
+ "meta": null
+ },
+ {
+ "name": "startElicitation",
+ "title": null,
+ "description": "Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.",
+ "inputSchema": {
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false,
+ "$schema": "http://json-schema.org/draft-07/schema#"
+ },
+ "outputSchema": null,
+ "annotations": null,
+ "meta": null,
+ "meta": null
}
],
"resources": [
@@ -2307,131 +2321,89 @@
"score": "N/A"
}
}
- }
- ],
- "functional_test_scorecard": {
- "meets_expectations": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "error_type": {
- "justification": "No score generated",
- "score": "N/A"
},
- "sampling_requests": 2,
- "elicitation_requests": 1,
- "list_roots_requests": 0,
- "logging_requests": 0,
- "plan": "This testing plan systematically exercises all MCP server tools, starting with foundational and stateless tools, then progressing to those with more complex outputs, annotations, or resource references. Each tool is tested with realistic, varied arguments, including edge cases where appropriate. Tools are ordered to build understanding and respect any implied dependencies. No explicit inter-tool dependencies are present, but related tools (e.g., resource reference and resource links) are tested in sequence for workflow coverage. The plan focuses on positive test cases and includes boundary and error scenario coverage where relevant.",
- "steps": [
- {
- "error_handling": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "error_type": {
+ {
+ "tool_name": {
+ "length": {
"justification": "No score generated",
"score": "N/A"
},
- "no_silent_error": {
+ "uniqueness": {
"justification": "No score generated",
"score": "N/A"
},
- "output_relevance": {
+ "descriptiveness": {
"justification": "No score generated",
"score": "N/A"
- },
- "output_quality": {
+ }
+ },
+ "tool_description": {
+ "length": {
"justification": "No score generated",
"score": "N/A"
},
- "schema_compliance": {
+ "parameters": {
"justification": "No score generated",
"score": "N/A"
},
- "meets_expectations": {
+ "examples": {
"justification": "No score generated",
"score": "N/A"
- },
- "tool_output": {
- "meta": null,
- "content": [
- {
- "type": "text",
- "text": "Echo: Hello, MCP!",
- "annotations": null,
- "meta": null
- }
- ],
- "structuredContent": null,
- "isError": false
- },
- "exception": null,
- "sampling_requests": 0,
- "elicitation_requests": 0,
- "list_roots_requests": 0,
- "logging_requests": 0,
- "justification": "Echo is a foundational tool; test basic functionality with a simple string.",
- "expected_output": "Should return the exact input message: 'Hello, MCP!'",
- "tool_name": "echo",
- "tool_arguments": {
- "message": "Hello, MCP!"
}
},
- {
- "error_handling": {
+ "tool_input_schema": {
+ "complexity": {
"justification": "No score generated",
"score": "N/A"
},
- "error_type": {
+ "parameters": {
"justification": "No score generated",
"score": "N/A"
},
- "no_silent_error": {
+ "optionals": {
"justification": "No score generated",
"score": "N/A"
},
- "output_relevance": {
+ "constraints": {
"justification": "No score generated",
"score": "N/A"
- },
- "output_quality": {
+ }
+ },
+ "tool_output_schema": {
+ "complexity": {
"justification": "No score generated",
"score": "N/A"
},
- "schema_compliance": {
+ "parameters": {
"justification": "No score generated",
"score": "N/A"
},
- "meets_expectations": {
+ "optionals": {
"justification": "No score generated",
"score": "N/A"
},
- "tool_output": {
- "meta": null,
- "content": [
- {
- "type": "text",
- "text": "Echo: ",
- "annotations": null,
- "meta": null
- }
- ],
- "structuredContent": null,
- "isError": false
- },
- "exception": null,
- "sampling_requests": 0,
- "elicitation_requests": 0,
- "list_roots_requests": 0,
- "logging_requests": 0,
- "justification": "Test edge case: empty string input.",
- "expected_output": "Should return an empty string.",
- "tool_name": "echo",
- "tool_arguments": {
- "message": ""
+ "constraints": {
+ "justification": "No score generated",
+ "score": "N/A"
}
- },
+ }
+ }
+ ],
+ "functional_test_scorecard": {
+ "meets_expectations": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "error_type": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "sampling_requests": 2,
+ "elicitation_requests": 1,
+ "list_roots_requests": 0,
+ "logging_requests": 2,
+ "plan": "This testing plan systematically exercises all 12 MCP server tools, starting with foundational, stateless tools and progressing to those demonstrating advanced features or requiring more complex input. Tools are grouped and ordered to build understanding, with dependencies and logical relationships considered. Each tool is tested with realistic arguments, and edge cases are included where appropriate. The plan ensures coverage of normal and boundary scenarios, and anticipates expected outputs for each step.",
+ "steps": [
{
"error_handling": {
"justification": "No score generated",
@@ -2466,7 +2438,7 @@
"content": [
{
"type": "text",
- "text": "The sum of 5 and 7 is 12.",
+ "text": "Echo: Hello, MCP!",
"annotations": null,
"meta": null
}
@@ -2478,13 +2450,12 @@
"sampling_requests": 0,
"elicitation_requests": 0,
"list_roots_requests": 0,
- "logging_requests": 0,
- "justification": "Test normal addition of two positive numbers.",
- "expected_output": "Should return 12.",
- "tool_name": "add",
+ "logging_requests": 2,
+ "justification": "Echo is a foundational tool with no dependencies. Test with a standard string to verify basic echo functionality.",
+ "expected_output": "The response should be an object echoing back the message: {\"message\": \"Hello, MCP!\"}",
+ "tool_name": "echo",
"tool_arguments": {
- "a": 5,
- "b": 7
+ "message": "Hello, MCP!"
}
},
{
@@ -2521,7 +2492,7 @@
"content": [
{
"type": "text",
- "text": "The sum of -3 and 10 is 7.",
+ "text": "Echo: ",
"annotations": null,
"meta": null
}
@@ -2534,12 +2505,11 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test addition with a negative and a positive number.",
- "expected_output": "Should return 7.",
- "tool_name": "add",
+ "justification": "Test echo with an empty string to check handling of edge case input.",
+ "expected_output": "The response should be an object echoing back the empty message: {\"message\": \"\"}",
+ "tool_name": "echo",
"tool_arguments": {
- "a": -3,
- "b": 10
+ "message": ""
}
},
{
@@ -2576,7 +2546,7 @@
"content": [
{
"type": "text",
- "text": "The sum of 0 and 0 is 0.",
+ "text": "The sum of 3 and 7 is 10.",
"annotations": null,
"meta": null
}
@@ -2589,12 +2559,12 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test edge case: both numbers zero.",
- "expected_output": "Should return 0.",
+ "justification": "Test add with two positive integers to verify correct addition.",
+ "expected_output": "The response should be an object with the sum: {\"result\": 10}",
"tool_name": "add",
"tool_arguments": {
- "a": 0,
- "b": 0
+ "a": 3,
+ "b": 7
}
},
{
@@ -2631,7 +2601,7 @@
"content": [
{
"type": "text",
- "text": "Long running operation completed. Duration: 3 seconds, Steps: 3.",
+ "text": "The sum of -5 and 2.5 is -2.5.",
"annotations": null,
"meta": null
}
@@ -2644,12 +2614,12 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test basic long-running operation with short duration and steps for quick feedback.",
- "expected_output": "Should return progress updates at each step and a final completion message after 3 seconds.",
- "tool_name": "longRunningOperation",
+ "justification": "Test add with a negative and a floating-point number to check handling of varied numeric types.",
+ "expected_output": "The response should be an object with the sum: {\"result\": -2.5}",
+ "tool_name": "add",
"tool_arguments": {
- "duration": 3,
- "steps": 3
+ "a": -5,
+ "b": 2.5
}
},
{
@@ -2686,7 +2656,7 @@
"content": [
{
"type": "text",
- "text": "Long running operation completed. Duration: 0 seconds, Steps: 1.",
+ "text": "Long running operation completed. Duration: 2 seconds, Steps: 4.",
"annotations": null,
"meta": null
}
@@ -2699,12 +2669,12 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test edge case: zero duration, single step.",
- "expected_output": "Should immediately return a single progress update and completion.",
+ "justification": "Test longRunningOperation with a short duration and multiple steps to verify progress updates and completion.",
+ "expected_output": "The response should include progress updates at each step and a final completion message after ~2 seconds.",
"tool_name": "longRunningOperation",
"tool_arguments": {
- "duration": 0,
- "steps": 1
+ "duration": 2,
+ "steps": 4
}
},
{
@@ -2741,7 +2711,7 @@
"content": [
{
"type": "text",
- "text": "{\n \"npm_config_user_agent\": \"npm/10.9.2 node/v22.17.0 linux arm64 workspaces/false\",\n \"NODE_VERSION\": \"22.17.0\",\n \"HOSTNAME\": \"dec62aa38426\",\n \"YARN_VERSION\": \"1.22.22\",\n \"npm_node_execpath\": \"/usr/local/bin/node\",\n \"npm_config_noproxy\": \"\",\n \"HOME\": \"/root\",\n \"npm_package_json\": \"/package.json\",\n \"npm_config_userconfig\": \"/root/.npmrc\",\n \"npm_config_local_prefix\": \"/\",\n \"npm_config_yes\": \"true\",\n \"COLOR\": \"0\",\n \"npm_config_prefix\": \"/usr/local\",\n \"npm_config_npm_version\": \"10.9.2\",\n \"npm_config_cache\": \"/root/.npm\",\n \"npm_config_node_gyp\": \"/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js\",\n \"PATH\": \"/root/.npm/_npx/5b2dd62b9d0bddd4/node_modules/.bin:/node_modules/.bin:/usr/local/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n \"NODE\": \"/usr/local/bin/node\",\n \"npm_lifecycle_script\": \"mcp-server-everything\",\n \"npm_lifecycle_event\": \"npx\",\n \"npm_config_globalconfig\": \"/usr/local/etc/npmrc\",\n \"npm_config_init_module\": \"/root/.npm-init.js\",\n \"PWD\": \"/\",\n \"npm_execpath\": \"/usr/local/lib/node_modules/npm/bin/npm-cli.js\",\n \"npm_config_global_prefix\": \"/usr/local\",\n \"npm_command\": \"exec\",\n \"INIT_CWD\": \"/\",\n \"EDITOR\": \"vi\"\n}",
+ "text": "{\n \"npm_config_user_agent\": \"npm/10.9.2 node/v22.17.0 linux arm64 workspaces/false\",\n \"NODE_VERSION\": \"22.17.0\",\n \"HOSTNAME\": \"8e041c52711e\",\n \"YARN_VERSION\": \"1.22.22\",\n \"npm_node_execpath\": \"/usr/local/bin/node\",\n \"npm_config_noproxy\": \"\",\n \"HOME\": \"/root\",\n \"npm_package_json\": \"/package.json\",\n \"npm_config_userconfig\": \"/root/.npmrc\",\n \"npm_config_local_prefix\": \"/\",\n \"npm_config_yes\": \"true\",\n \"COLOR\": \"0\",\n \"npm_config_prefix\": \"/usr/local\",\n \"npm_config_npm_version\": \"10.9.2\",\n \"npm_config_cache\": \"/root/.npm\",\n \"npm_config_node_gyp\": \"/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js\",\n \"PATH\": \"/root/.npm/_npx/5b2dd62b9d0bddd4/node_modules/.bin:/node_modules/.bin:/usr/local/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\",\n \"NODE\": \"/usr/local/bin/node\",\n \"npm_lifecycle_script\": \"mcp-server-everything\",\n \"npm_lifecycle_event\": \"npx\",\n \"npm_config_globalconfig\": \"/usr/local/etc/npmrc\",\n \"npm_config_init_module\": \"/root/.npm-init.js\",\n \"PWD\": \"/\",\n \"npm_execpath\": \"/usr/local/lib/node_modules/npm/bin/npm-cli.js\",\n \"npm_config_global_prefix\": \"/usr/local\",\n \"npm_command\": \"exec\",\n \"INIT_CWD\": \"/\",\n \"EDITOR\": \"vi\"\n}",
"annotations": null,
"meta": null
}
@@ -2754,8 +2724,8 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test environment variable listing; useful for debugging server configuration.",
- "expected_output": "Should return a dictionary of environment variables and their values.",
+ "justification": "Test printEnv to verify the server can enumerate its environment variables.",
+ "expected_output": "The response should be an object listing all environment variables as key-value pairs.",
"tool_name": "printEnv",
"tool_arguments": {}
},
@@ -2806,8 +2776,8 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test LLM sampling with a factual prompt and limited token output.",
- "expected_output": "Should return a short completion, e.g., 'The capital of France is Paris.'",
+ "justification": "Test sampleLLM with a factual prompt and a small maxTokens to verify LLM sampling and token limit.",
+ "expected_output": "The response should be a string or object containing a short answer, e.g., 'Paris'.",
"tool_name": "sampleLLM",
"tool_arguments": {
"prompt": "What is the capital of France?",
@@ -2861,12 +2831,11 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test LLM with creative prompt and larger token limit.",
- "expected_output": "Should return a short poem about rain, up to 50 tokens.",
+ "justification": "Test sampleLLM with a creative prompt and default maxTokens to check default behavior and creative output.",
+ "expected_output": "The response should be a string or object containing a short poem about the sea.",
"tool_name": "sampleLLM",
"tool_arguments": {
- "prompt": "Write a short poem about rain.",
- "maxTokens": 50
+ "prompt": "Write a short poem about the sea."
}
},
{
@@ -2929,8 +2898,8 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test retrieval of the MCP_TINY_IMAGE resource.",
- "expected_output": "Should return a small image object or binary data representing the tiny image.",
+ "justification": "Test getTinyImage to verify the server returns the expected tiny image resource.",
+ "expected_output": "The response should be an object or binary containing the MCP_TINY_IMAGE (e.g., base64-encoded image data).",
"tool_name": "getTinyImage",
"tool_arguments": {}
},
@@ -2976,67 +2945,6 @@
"priority": 0.7
},
"meta": null
- }
- ],
- "structuredContent": null,
- "isError": false
- },
- "exception": null,
- "sampling_requests": 0,
- "elicitation_requests": 0,
- "list_roots_requests": 0,
- "logging_requests": 0,
- "justification": "Test annotation with 'success' type and no image.",
- "expected_output": "Should return a message annotated as 'success', without an image.",
- "tool_name": "annotatedMessage",
- "tool_arguments": {
- "messageType": "success",
- "includeImage": false
- }
- },
- {
- "error_handling": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "error_type": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "no_silent_error": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "output_relevance": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "output_quality": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "schema_compliance": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "meets_expectations": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "tool_output": {
- "meta": null,
- "content": [
- {
- "type": "text",
- "text": "Error: Operation failed",
- "annotations": {
- "audience": [
- "user",
- "assistant"
- ],
- "priority": 1.0
- },
- "meta": null
},
{
"type": "image",
@@ -3059,11 +2967,11 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test annotation with 'error' type and image included.",
- "expected_output": "Should return a message annotated as 'error', with an example image attached.",
+ "justification": "Test annotatedMessage with 'success' type and image included to verify annotation and image embedding.",
+ "expected_output": "The response should be an object with a success message, annotation metadata, and an embedded image.",
"tool_name": "annotatedMessage",
"tool_arguments": {
- "messageType": "error",
+ "messageType": "success",
"includeImage": true
}
},
@@ -3101,12 +3009,13 @@
"content": [
{
"type": "text",
- "text": "Debug: Cache hit ratio 0.95, latency 150ms",
+ "text": "Error: Operation failed",
"annotations": {
"audience": [
+ "user",
"assistant"
],
- "priority": 0.3
+ "priority": 1.0
},
"meta": null
}
@@ -3119,12 +3028,11 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test annotation with 'debug' type, no image.",
- "expected_output": "Should return a message annotated as 'debug', without an image.",
+ "justification": "Test annotatedMessage with 'error' type and default image inclusion (false) to check error annotation.",
+ "expected_output": "The response should be an object with an error message and error annotation metadata, no image.",
"tool_name": "annotatedMessage",
"tool_arguments": {
- "messageType": "debug",
- "includeImage": false
+ "messageType": "error"
}
},
{
@@ -3192,8 +3100,8 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test resource reference with minimum valid ID.",
- "expected_output": "Should return a reference object for resource ID 1.",
+ "justification": "Test getResourceReference with the minimum valid resourceId to check lower boundary.",
+ "expected_output": "The response should be an object referencing resource ID 1.",
"tool_name": "getResourceReference",
"tool_arguments": {
"resourceId": 1
@@ -3264,143 +3172,13 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test resource reference with maximum valid ID.",
- "expected_output": "Should return a reference object for resource ID 100.",
+ "justification": "Test getResourceReference with the maximum valid resourceId to check upper boundary.",
+ "expected_output": "The response should be an object referencing resource ID 100.",
"tool_name": "getResourceReference",
"tool_arguments": {
"resourceId": 100
}
},
- {
- "error_handling": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "error_type": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "no_silent_error": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "output_relevance": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "output_quality": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "schema_compliance": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "meets_expectations": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "tool_output": {
- "meta": null,
- "content": [
- {
- "type": "text",
- "text": "Returning resource reference for Resource 50:",
- "annotations": null,
- "meta": null
- },
- {
- "type": "resource",
- "resource": {
- "uri": "test://static/resource/50",
- "mimeType": "application/octet-stream",
- "meta": null,
- "blob": "UmVzb3VyY2UgNTA6IFRoaXMgaXMgYSBiYXNlNjQgYmxvYg==",
- "name": "Resource 50"
- },
- "annotations": null,
- "meta": null
- },
- {
- "type": "text",
- "text": "You can access this resource using the URI: test://static/resource/50",
- "annotations": null,
- "meta": null
- }
- ],
- "structuredContent": null,
- "isError": false
- },
- "exception": null,
- "sampling_requests": 0,
- "elicitation_requests": 0,
- "list_roots_requests": 0,
- "logging_requests": 0,
- "justification": "Test resource reference with a mid-range valid ID.",
- "expected_output": "Should return a reference object for resource ID 50.",
- "tool_name": "getResourceReference",
- "tool_arguments": {
- "resourceId": 50
- }
- },
- {
- "error_handling": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "error_type": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "no_silent_error": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "output_relevance": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "output_quality": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "schema_compliance": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "meets_expectations": {
- "justification": "No score generated",
- "score": "N/A"
- },
- "tool_output": {
- "meta": null,
- "content": [
- {
- "type": "text",
- "text": "⚠️ User cancelled the elicitation dialog.",
- "annotations": null,
- "meta": null
- },
- {
- "type": "text",
- "text": "\nRaw result: {\n \"action\": \"cancel\"\n}",
- "annotations": null,
- "meta": null
- }
- ],
- "structuredContent": null,
- "isError": false
- },
- "exception": null,
- "sampling_requests": 0,
- "elicitation_requests": 1,
- "list_roots_requests": 0,
- "logging_requests": 0,
- "justification": "Test elicitation feature; should prompt user for favorite color, number, and pets.",
- "expected_output": "Should initiate a multi-step interaction asking for color, number, and pets, and return collected responses.",
- "tool_name": "startElicitation",
- "tool_arguments": {}
- },
{
"error_handling": {
"justification": "No score generated",
@@ -3459,8 +3237,8 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test resource links with minimum count.",
- "expected_output": "Should return a single resource link object.",
+ "justification": "Test getResourceLinks with the minimum count to check lower boundary and single resource link handling.",
+ "expected_output": "The response should be an array or object containing one resource link.",
"tool_name": "getResourceLinks",
"tool_arguments": {
"count": 1
@@ -3623,8 +3401,8 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test resource links with maximum count.",
- "expected_output": "Should return an array of 10 resource link objects.",
+ "justification": "Test getResourceLinks with the maximum count to check upper boundary and multiple resource link handling.",
+ "expected_output": "The response should be an array or object containing ten resource links.",
"tool_name": "getResourceLinks",
"tool_arguments": {
"count": 10
@@ -3664,45 +3442,16 @@
"content": [
{
"type": "text",
- "text": "Here are 3 resource links to resources available in this server (see full output in tool response if your client does not support resource_link yet):",
+ "text": "{\"temperature\":22.5,\"conditions\":\"Partly cloudy\",\"humidity\":65}",
"annotations": null,
"meta": null
- },
- {
- "name": "Resource 1",
- "title": null,
- "uri": "test://static/resource/1",
- "description": "Resource 1: plaintext resource",
- "mimeType": "text/plain",
- "size": null,
- "annotations": null,
- "meta": null,
- "type": "resource_link"
- },
- {
- "name": "Resource 2",
- "title": null,
- "uri": "test://static/resource/2",
- "description": "Resource 2: binary blob resource",
- "mimeType": "application/octet-stream",
- "size": null,
- "annotations": null,
- "meta": null,
- "type": "resource_link"
- },
- {
- "name": "Resource 3",
- "title": null,
- "uri": "test://static/resource/3",
- "description": "Resource 3: plaintext resource",
- "mimeType": "text/plain",
- "size": null,
- "annotations": null,
- "meta": null,
- "type": "resource_link"
}
],
- "structuredContent": null,
+ "structuredContent": {
+ "temperature": 22.5,
+ "conditions": "Partly cloudy",
+ "humidity": 65
+ },
"isError": false
},
"exception": null,
@@ -3710,11 +3459,11 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test resource links with default count.",
- "expected_output": "Should return an array of 3 resource link objects.",
- "tool_name": "getResourceLinks",
+ "justification": "Test structuredContent with a valid city name to verify normal operation and output schema adherence.",
+ "expected_output": "The response should be an object with temperature (number), conditions (string), and humidity (number) for New York.",
+ "tool_name": "structuredContent",
"tool_arguments": {
- "count": 3
+ "location": "New York"
}
},
{
@@ -3768,11 +3517,53 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test structured content with a city name.",
- "expected_output": "Should return an object with temperature, conditions, and humidity for San Francisco, matching the output schema.",
+ "justification": "Test structuredContent with a valid zip code to check alternate location input.",
+ "expected_output": "The response should be an object with temperature, conditions, and humidity for the 90210 area.",
+ "tool_name": "structuredContent",
+ "tool_arguments": {
+ "location": "90210"
+ }
+ },
+ {
+ "error_handling": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "error_type": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "no_silent_error": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "output_relevance": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "output_quality": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "schema_compliance": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "meets_expectations": {
+ "justification": "No score generated",
+ "score": "N/A"
+ },
+ "tool_output": null,
+ "exception": "[\n {\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"type\": \"string\",\n \"inclusive\": true,\n \"exact\": false,\n \"message\": \"String must contain at least 1 character(s)\",\n \"path\": [\n \"location\"\n ]\n }\n]",
+ "sampling_requests": 0,
+ "elicitation_requests": 0,
+ "list_roots_requests": 0,
+ "logging_requests": 0,
+ "justification": "Test structuredContent with an empty location to check input validation and error handling (edge case).",
+ "expected_output": "The response should be an error indicating that 'location' does not meet the minimum length requirement.",
"tool_name": "structuredContent",
"tool_arguments": {
- "location": "San Francisco"
+ "location": ""
}
},
{
@@ -3809,16 +3600,12 @@
"content": [
{
"type": "text",
- "text": "{\"temperature\":22.5,\"conditions\":\"Partly cloudy\",\"humidity\":65}",
+ "text": "Current MCP Roots (1 total):\n\n1. Unnamed Root\n URI: file://dummy.txt/\n\nNote: This server demonstrates the roots protocol capability but doesn't actually access files. The roots are provided by the MCP client and can be used by servers that need file system access.",
"annotations": null,
"meta": null
}
],
- "structuredContent": {
- "temperature": 22.5,
- "conditions": "Partly cloudy",
- "humidity": 65
- },
+ "structuredContent": null,
"isError": false
},
"exception": null,
@@ -3826,12 +3613,10 @@
"elicitation_requests": 0,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test structured content with a zip code.",
- "expected_output": "Should return an object with temperature, conditions, and humidity for zip code 94103, matching the output schema.",
- "tool_name": "structuredContent",
- "tool_arguments": {
- "location": "94103"
- }
+ "justification": "Test listRoots to verify the server can enumerate MCP roots, even if it does not access files.",
+ "expected_output": "The response should be an object or array listing the current MCP roots (may be empty or contain mock roots).",
+ "tool_name": "listRoots",
+ "tool_arguments": {}
},
{
"error_handling": {
@@ -3862,18 +3647,34 @@
"justification": "No score generated",
"score": "N/A"
},
- "tool_output": null,
- "exception": "[\n {\n \"code\": \"too_small\",\n \"minimum\": 1,\n \"type\": \"string\",\n \"inclusive\": true,\n \"exact\": false,\n \"message\": \"String must contain at least 1 character(s)\",\n \"path\": [\n \"location\"\n ]\n }\n]",
+ "tool_output": {
+ "meta": null,
+ "content": [
+ {
+ "type": "text",
+ "text": "⚠️ User cancelled the elicitation dialog.",
+ "annotations": null,
+ "meta": null
+ },
+ {
+ "type": "text",
+ "text": "\nRaw result: {\n \"action\": \"cancel\"\n}",
+ "annotations": null,
+ "meta": null
+ }
+ ],
+ "structuredContent": null,
+ "isError": false
+ },
+ "exception": null,
"sampling_requests": 0,
- "elicitation_requests": 0,
+ "elicitation_requests": 1,
"list_roots_requests": 0,
"logging_requests": 0,
- "justification": "Test edge case: empty location string (should fail validation).",
- "expected_output": "Should return an error or validation failure due to minLength constraint.",
- "tool_name": "structuredContent",
- "tool_arguments": {
- "location": ""
- }
+ "justification": "Test startElicitation to verify the server initiates an elicitation process for user information.",
+ "expected_output": "The response should be a prompt or object requesting the user's favorite color, number, and pets.",
+ "tool_name": "startElicitation",
+ "tool_arguments": {}
}
]
}
diff --git a/mcp-interview.md b/mcp-interview.md
index b29e74c..0f19f7d 100644
--- a/mcp-interview.md
+++ b/mcp-interview.md
@@ -50,16 +50,16 @@ If asked about server instructions, respond with "🎉 Server instructions are w
#### Metadata
-**Date:** 2025-09-11
+**Date:** 2025-10-11
-**mcp-interviewer Version:** [0.0.11](https://github.com/microsoft/mcp-interviewer)
+**mcp-interviewer Version:** [0.0.12](https://github.com/microsoft/mcp-interviewer)
**Evaluation Model:** gpt-4.1
#### CLI Command
```bash
-mcp-interviewerdocker run -i --rm node:lts npx -y @modelcontextprotocol/server-everything --test --model gpt-4.1 --client trapi.Trapi --accept-risk
+mcp-interviewer--test --model gpt-4.1 docker run -i --rm node:lts npx -y @modelcontextprotocol/server-everything
```
#### Server Launch Parameters
@@ -74,7 +74,7 @@ mcp-interviewerdocker run -i --rm node:lts npx -y @modelcontextprotocol/server-e
| Feature | Supported | Count | Additional Features |
| --- | --- | --- | --- |
-| Tools | ✅ | 11 | |
+| Tools | ✅ | 12 | |
| Resources | ✅ | 100 | subscribe |
| Resource Templates | ✅ | 1 | |
| Prompts | ✅ | 3 | |
@@ -84,27 +84,28 @@ mcp-interviewerdocker run -i --rm node:lts npx -y @modelcontextprotocol/server-e
| Metric | Total | Average | Min | Max |
| --- | --- | --- | --- | --- |
-| Input schema lengths (gpt-4o tokens) | 544 | 49.5 | 29 | 76 |
-| Input schemas parameter count | | 1.1 | 0 | 2 |
+| Input schema lengths (gpt-4o tokens) | 589 | 49.1 | 29 | 76 |
+| Input schemas parameter count | | 1.0 | 0 | 2 |
| Input schemas required parameter count | | 0.6 | 0 | 2 |
-| Input schemas optional parameter count | | 0.5 | 0 | 2 |
-| Input schema max depth | | 1.5 | 0 | 3 |
+| Input schemas optional parameter count | | 0.4 | 0 | 2 |
+| Input schema max depth | | 1.4 | 0 | 3 |
## Tool Call Statistics
| Metric | Total | Average | Min | Max |
| --- | --- | --- | --- | --- |
-| Tool calls attempted | 24 | | | |
-| Tool calls returned output | 23 | | | |
-| Tool call outputs with no error | 23 | | | |
+| Tool calls attempted | 20 | | | |
+| Tool calls returned output | 19 | | | |
+| Tool call outputs with no error | 19 | | | |
| Tool call outputs with error | 0 | | | |
| Exceptions calling tools | 1 | | | |
-| Tool call output lengths (gpt-4o text tokens) | 751 | 32.7 | 3 | 404 |
-| Text output content blocks | 28 | 7.0 | 1 | 2 |
-| Resource_Link output content blocks | 14 | 3.5 | 0 | 10 |
-| Resource output content blocks | 3 | 0.8 | 0 | 1 |
+| Tool call output lengths (gpt-4o text tokens) | 719 | 37.8 | 3 | 406 |
+| Text output content blocks | 23 | 5.8 | 1 | 2 |
+| Resource_Link output content blocks | 11 | 2.8 | 0 | 10 |
| Image output content blocks | 2 | 0.5 | 0 | 1 |
+| Resource output content blocks | 2 | 0.5 | 0 | 1 |
| Sampling requests | 2 | 0.1 | 0 | 1 |
-| Elicitation requests | 1 | 0.0 | 0 | 1 |
+| Elicitation requests | 1 | 0.1 | 0 | 1 |
+| Logging requests | 2 | 0.1 | 0 | 2 |
## Constraint Violations
✅ **No constraint violations found**
@@ -112,7 +113,7 @@ mcp-interviewerdocker run -i --rm node:lts npx -y @modelcontextprotocol/server-e
Checked constraints
-**Constraints checked:** openai-tool-count, openai-name-length, openai-name-pattern, openai-token-length
+**Constraints checked:** openai-tool-count, openai-name-length, openai-name-pattern, openai-token-length, tool-schema-flatness
@@ -131,7 +132,7 @@ mcp-interviewerdocker run -i --rm node:lts npx -y @modelcontextprotocol/server-e
[→ View tool details](#tool-echo)
-**Reasoning (🤖):** Echo is a foundational tool; test basic functionality with a simple string.
+**Reasoning (🤖):** Echo is a foundational tool with no dependencies. Test with a standard string to verify basic echo functionality.
**Tool Call (🤖):**
```json
@@ -139,7 +140,7 @@ mcp-interviewerdocker run -i --rm node:lts npx -y @modelcontextprotocol/server-e
"message": "Hello, MCP!"
}
```
-**Expected Output (🤖):** Should return the exact input message: 'Hello, MCP!'
+**Expected Output (🤖):** The response should be an object echoing back the message: {"message": "Hello, MCP!"}
**Actual Output (1 blocks):**
@@ -155,6 +156,12 @@ Echo: Hello, MCP!
| Text token count | 6 |
| Text blocks | 1 |
+**MCP Requests:**
+
+| Request Type | Count |
+| --- | --- |
+| Logging | 2 |
+
#### Step 2: echo ✅
@@ -164,7 +171,7 @@ Echo: Hello, MCP!
[→ View tool details](#tool-echo)
-**Reasoning (🤖):** Test edge case: empty string input.
+**Reasoning (🤖):** Test echo with an empty string to check handling of edge case input.
**Tool Call (🤖):**
```json
@@ -172,7 +179,7 @@ Echo: Hello, MCP!
"message": ""
}
```
-**Expected Output (🤖):** Should return an empty string.
+**Expected Output (🤖):** The response should be an object echoing back the empty message: {"message": ""}
**Actual Output (1 blocks):**
@@ -197,23 +204,23 @@ Echo:
[→ View tool details](#tool-add)
-**Reasoning (🤖):** Test normal addition of two positive numbers.
+**Reasoning (🤖):** Test add with two positive integers to verify correct addition.
**Tool Call (🤖):**
```json
{
- "a": 5,
+ "a": 3,
"b": 7
}
```
-**Expected Output (🤖):** Should return 12.
+**Expected Output (🤖):** The response should be an object with the sum: {"result": 10}
**Actual Output (1 blocks):**
✅ **No Error**
```
-The sum of 5 and 7 is 12.
+The sum of 3 and 7 is 10.
```
**Output Statistics:**
@@ -231,91 +238,23 @@ The sum of 5 and 7 is 12.
[→ View tool details](#tool-add)
-**Reasoning (🤖):** Test addition with a negative and a positive number.
-
-**Tool Call (🤖):**
-```json
-{
- "a": -3,
- "b": 10
-}
-```
-**Expected Output (🤖):** Should return 7.
-
-**Actual Output (1 blocks):**
-
-✅ **No Error**
-
-```
-The sum of -3 and 10 is 7.
-```
-**Output Statistics:**
-
-| Metric | Value |
-| --- | --- |
-| Text token count | 12 |
-| Text blocks | 1 |
-
-
-
-#### Step 5: add ✅
-
-
-Toggle step details
-
-[→ View tool details](#tool-add)
-
-**Reasoning (🤖):** Test edge case: both numbers zero.
+**Reasoning (🤖):** Test add with a negative and a floating-point number to check handling of varied numeric types.
**Tool Call (🤖):**
```json
{
- "a": 0,
- "b": 0
+ "a": -5,
+ "b": 2.5
}
```
-**Expected Output (🤖):** Should return 0.
+**Expected Output (🤖):** The response should be an object with the sum: {"result": -2.5}
**Actual Output (1 blocks):**
✅ **No Error**
```
-The sum of 0 and 0 is 0.
-```
-**Output Statistics:**
-
-| Metric | Value |
-| --- | --- |
-| Text token count | 12 |
-| Text blocks | 1 |
-
-
-
-#### Step 6: longRunningOperation ✅
-
-
-Toggle step details
-
-[→ View tool details](#tool-longRunningOperation)
-
-**Reasoning (🤖):** Test basic long-running operation with short duration and steps for quick feedback.
-
-**Tool Call (🤖):**
-```json
-{
- "duration": 3,
- "steps": 3
-}
-```
-**Expected Output (🤖):** Should return progress updates at each step and a final completion message after 3 seconds.
-
-**Actual Output (1 blocks):**
-
-✅ **No Error**
-
-```
-Long running operation completed. Duration: 3 seconds, Steps: 3.
+The sum of -5 and 2.5 is -2.5.
```
**Output Statistics:**
@@ -326,30 +265,30 @@ Long running operation completed. Duration: 3 seconds, Steps: 3.
-#### Step 7: longRunningOperation ✅
+#### Step 5: longRunningOperation ✅
Toggle step details
[→ View tool details](#tool-longRunningOperation)
-**Reasoning (🤖):** Test edge case: zero duration, single step.
+**Reasoning (🤖):** Test longRunningOperation with a short duration and multiple steps to verify progress updates and completion.
**Tool Call (🤖):**
```json
{
- "duration": 0,
- "steps": 1
+ "duration": 2,
+ "steps": 4
}
```
-**Expected Output (🤖):** Should immediately return a single progress update and completion.
+**Expected Output (🤖):** The response should include progress updates at each step and a final completion message after ~2 seconds.
**Actual Output (1 blocks):**
✅ **No Error**
```
-Long running operation completed. Duration: 0 seconds, Steps: 1.
+Long running operation completed. Duration: 2 seconds, Steps: 4.
```
**Output Statistics:**
@@ -360,20 +299,20 @@ Long running operation completed. Duration: 0 seconds, Steps: 1.
-#### Step 8: printEnv ✅
+#### Step 6: printEnv ✅
Toggle step details
[→ View tool details](#tool-printEnv)
-**Reasoning (🤖):** Test environment variable listing; useful for debugging server configuration.
+**Reasoning (🤖):** Test printEnv to verify the server can enumerate its environment variables.
**Tool Call (🤖):**
```json
{}
```
-**Expected Output (🤖):** Should return a dictionary of environment variables and their values.
+**Expected Output (🤖):** The response should be an object listing all environment variables as key-value pairs.
**Actual Output (1 blocks):**
@@ -383,7 +322,7 @@ Long running operation completed. Duration: 0 seconds, Steps: 1.
{
"npm_config_user_agent": "npm/10.9.2 node/v22.17.0 linux arm64 workspaces/false",
"NODE_VERSION": "22.17.0",
- "HOSTNAME": "dec62aa38426",
+ "HOSTNAME": "8e041c52711e",
"YARN_VERSION": "1.22.22",
"npm_node_execpath": "/usr/local/bin/node",
"npm_config_noproxy": "",
@@ -401,19 +340,19 @@ Long running operation completed. Duration: 0 seconds, Steps: 1.
| Metric | Value |
| --- | --- |
-| Text token count | 404 |
+| Text token count | 406 |
| Text blocks | 1 |
-#### Step 9: sampleLLM ✅
+#### Step 7: sampleLLM ✅
Toggle step details
[→ View tool details](#tool-sampleLLM)
-**Reasoning (🤖):** Test LLM sampling with a factual prompt and limited token output.
+**Reasoning (🤖):** Test sampleLLM with a factual prompt and a small maxTokens to verify LLM sampling and token limit.
**Tool Call (🤖):**
```json
@@ -422,7 +361,7 @@ Long running operation completed. Duration: 0 seconds, Steps: 1.
"maxTokens": 10
}
```
-**Expected Output (🤖):** Should return a short completion, e.g., 'The capital of France is Paris.'
+**Expected Output (🤖):** The response should be a string or object containing a short answer, e.g., 'Paris'.
**Actual Output (1 blocks):**
@@ -446,23 +385,22 @@ LLM sampling result: Dummy content
-#### Step 10: sampleLLM ✅
+#### Step 8: sampleLLM ✅
Toggle step details
[→ View tool details](#tool-sampleLLM)
-**Reasoning (🤖):** Test LLM with creative prompt and larger token limit.
+**Reasoning (🤖):** Test sampleLLM with a creative prompt and default maxTokens to check default behavior and creative output.
**Tool Call (🤖):**
```json
{
- "prompt": "Write a short poem about rain.",
- "maxTokens": 50
+ "prompt": "Write a short poem about the sea."
}
```
-**Expected Output (🤖):** Should return a short poem about rain, up to 50 tokens.
+**Expected Output (🤖):** The response should be a string or object containing a short poem about the sea.
**Actual Output (1 blocks):**
@@ -486,20 +424,20 @@ LLM sampling result: Dummy content
-#### Step 11: getTinyImage ✅
+#### Step 9: getTinyImage ✅
Toggle step details
[→ View tool details](#tool-getTinyImage)
-**Reasoning (🤖):** Test retrieval of the MCP_TINY_IMAGE resource.
+**Reasoning (🤖):** Test getTinyImage to verify the server returns the expected tiny image resource.
**Tool Call (🤖):**
```json
{}
```
-**Expected Output (🤖):** Should return a small image object or binary data representing the tiny image.
+**Expected Output (🤖):** The response should be an object or binary containing the MCP_TINY_IMAGE (e.g., base64-encoded image data).
**Actual Output (3 blocks):**
@@ -525,64 +463,30 @@ The image above is the MCP tiny image.
-#### Step 12: annotatedMessage ✅
+#### Step 10: annotatedMessage ✅
Toggle step details
[→ View tool details](#tool-annotatedMessage)
-**Reasoning (🤖):** Test annotation with 'success' type and no image.
+**Reasoning (🤖):** Test annotatedMessage with 'success' type and image included to verify annotation and image embedding.
**Tool Call (🤖):**
```json
{
"messageType": "success",
- "includeImage": false
-}
-```
-**Expected Output (🤖):** Should return a message annotated as 'success', without an image.
-
-**Actual Output (1 blocks):**
-
-✅ **No Error**
-
-```
-Operation completed successfully
-```
-**Output Statistics:**
-
-| Metric | Value |
-| --- | --- |
-| Text token count | 3 |
-| Text blocks | 1 |
-
-
-
-#### Step 13: annotatedMessage ✅
-
-
-Toggle step details
-
-[→ View tool details](#tool-annotatedMessage)
-
-**Reasoning (🤖):** Test annotation with 'error' type and image included.
-
-**Tool Call (🤖):**
-```json
-{
- "messageType": "error",
"includeImage": true
}
```
-**Expected Output (🤖):** Should return a message annotated as 'error', with an example image attached.
+**Expected Output (🤖):** The response should be an object with a success message, annotation metadata, and an embedded image.
**Actual Output (2 blocks):**
✅ **No Error**
```
-Error: Operation failed
+Operation completed successfully
```
```
[Image: image/png]
@@ -592,54 +496,53 @@ Error: Operation failed
| Metric | Value |
| --- | --- |
-| Text token count | 4 |
+| Text token count | 3 |
| Text blocks | 1 |
| Image blocks | 1 |
-#### Step 14: annotatedMessage ✅
+#### Step 11: annotatedMessage ✅
Toggle step details
[→ View tool details](#tool-annotatedMessage)
-**Reasoning (🤖):** Test annotation with 'debug' type, no image.
+**Reasoning (🤖):** Test annotatedMessage with 'error' type and default image inclusion (false) to check error annotation.
**Tool Call (🤖):**
```json
{
- "messageType": "debug",
- "includeImage": false
+ "messageType": "error"
}
```
-**Expected Output (🤖):** Should return a message annotated as 'debug', without an image.
+**Expected Output (🤖):** The response should be an object with an error message and error annotation metadata, no image.
**Actual Output (1 blocks):**
✅ **No Error**
```
-Debug: Cache hit ratio 0.95, latency 150ms
+Error: Operation failed
```
**Output Statistics:**
| Metric | Value |
| --- | --- |
-| Text token count | 14 |
+| Text token count | 4 |
| Text blocks | 1 |
-#### Step 15: getResourceReference ✅
+#### Step 12: getResourceReference ✅
Toggle step details
[→ View tool details](#tool-getResourceReference)
-**Reasoning (🤖):** Test resource reference with minimum valid ID.
+**Reasoning (🤖):** Test getResourceReference with the minimum valid resourceId to check lower boundary.
**Tool Call (🤖):**
```json
@@ -647,7 +550,7 @@ Debug: Cache hit ratio 0.95, latency 150ms
"resourceId": 1
}
```
-**Expected Output (🤖):** Should return a reference object for resource ID 1.
+**Expected Output (🤖):** The response should be an object referencing resource ID 1.
**Actual Output (3 blocks):**
@@ -675,14 +578,14 @@ You can access this resource using the URI: test://static/resource/1
-#### Step 16: getResourceReference ✅
+#### Step 13: getResourceReference ✅
Toggle step details
[→ View tool details](#tool-getResourceReference)
-**Reasoning (🤖):** Test resource reference with maximum valid ID.
+**Reasoning (🤖):** Test getResourceReference with the maximum valid resourceId to check upper boundary.
**Tool Call (🤖):**
```json
@@ -690,7 +593,7 @@ You can access this resource using the URI: test://static/resource/1
"resourceId": 100
}
```
-**Expected Output (🤖):** Should return a reference object for resource ID 100.
+**Expected Output (🤖):** The response should be an object referencing resource ID 100.
**Actual Output (3 blocks):**
@@ -717,99 +620,14 @@ You can access this resource using the URI: test://static/resource/100
-#### Step 17: getResourceReference ✅
-
-
-Toggle step details
-
-[→ View tool details](#tool-getResourceReference)
-
-**Reasoning (🤖):** Test resource reference with a mid-range valid ID.
-
-**Tool Call (🤖):**
-```json
-{
- "resourceId": 50
-}
-```
-**Expected Output (🤖):** Should return a reference object for resource ID 50.
-
-**Actual Output (3 blocks):**
-
-✅ **No Error**
-
-```
-Returning resource reference for Resource 50:
-```
-```
-[Embedded Resource: test://static/resource/50]
- MIME type: application/octet-stream
- Blob size: 48 bytes (base64)
-```
-```
-You can access this resource using the URI: test://static/resource/50
-```
-**Output Statistics:**
-
-| Metric | Value |
-| --- | --- |
-| Text token count | 23 |
-| Text blocks | 2 |
-| Resource | 1 |
-
-
-
-#### Step 18: startElicitation ✅
-
-
-Toggle step details
-
-[→ View tool details](#tool-startElicitation)
-
-**Reasoning (🤖):** Test elicitation feature; should prompt user for favorite color, number, and pets.
-
-**Tool Call (🤖):**
-```json
-{}
-```
-**Expected Output (🤖):** Should initiate a multi-step interaction asking for color, number, and pets, and return collected responses.
-
-**Actual Output (2 blocks):**
-
-✅ **No Error**
-
-```
-⚠️ User cancelled the elicitation dialog.
-```
-```
-
-Raw result: {
- "action": "cancel"
-}
-```
-**Output Statistics:**
-
-| Metric | Value |
-| --- | --- |
-| Text token count | 22 |
-| Text blocks | 2 |
-
-**MCP Requests:**
-
-| Request Type | Count |
-| --- | --- |
-| Elicitation | 1 |
-
-
-
-#### Step 19: getResourceLinks ✅
+#### Step 14: getResourceLinks ✅
Toggle step details
[→ View tool details](#tool-getResourceLinks)
-**Reasoning (🤖):** Test resource links with minimum count.
+**Reasoning (🤖):** Test getResourceLinks with the minimum count to check lower boundary and single resource link handling.
**Tool Call (🤖):**
```json
@@ -817,7 +635,7 @@ Raw result: {
"count": 1
}
```
-**Expected Output (🤖):** Should return a single resource link object.
+**Expected Output (🤖):** The response should be an array or object containing one resource link.
**Actual Output (2 blocks):**
@@ -841,14 +659,14 @@ Here are 1 resource links to resources available in this server (see full output
-#### Step 20: getResourceLinks ✅
+#### Step 15: getResourceLinks ✅
Toggle step details
[→ View tool details](#tool-getResourceLinks)
-**Reasoning (🤖):** Test resource links with maximum count.
+**Reasoning (🤖):** Test getResourceLinks with the maximum count to check upper boundary and multiple resource link handling.
**Tool Call (🤖):**
```json
@@ -856,7 +674,7 @@ Here are 1 resource links to resources available in this server (see full output
"count": 10
}
```
-**Expected Output (🤖):** Should return an array of 10 resource link objects.
+**Expected Output (🤖):** The response should be an array or object containing ten resource links.
**Actual Output (11 blocks):**
@@ -925,71 +743,22 @@ Here are 10 resource links to resources available in this server (see full outpu
-#### Step 21: getResourceLinks ✅
-
-
-Toggle step details
-
-[→ View tool details](#tool-getResourceLinks)
-
-**Reasoning (🤖):** Test resource links with default count.
-
-**Tool Call (🤖):**
-```json
-{
- "count": 3
-}
-```
-**Expected Output (🤖):** Should return an array of 3 resource link objects.
-
-**Actual Output (4 blocks):**
-
-✅ **No Error**
-
-```
-Here are 3 resource links to resources available in this server (see full output in tool response if your client does not support resource_link yet):
-```
-```
-[Resource Link: test://static/resource/1]
- MIME type: text/plain
- Description: Resource 1: plaintext resource
-```
-```
-[Resource Link: test://static/resource/2]
- MIME type: application/octet-stream
- Description: Resource 2: binary blob resource
-```
-```
-[Resource Link: test://static/resource/3]
- MIME type: text/plain
- Description: Resource 3: plaintext resource
-```
-**Output Statistics:**
-
-| Metric | Value |
-| --- | --- |
-| Text token count | 29 |
-| Text blocks | 1 |
-| Resource link blocks | 3 |
-
-
-
-#### Step 22: structuredContent ✅
+#### Step 16: structuredContent ✅
Toggle step details
[→ View tool details](#tool-structuredContent)
-**Reasoning (🤖):** Test structured content with a city name.
+**Reasoning (🤖):** Test structuredContent with a valid city name to verify normal operation and output schema adherence.
**Tool Call (🤖):**
```json
{
- "location": "San Francisco"
+ "location": "New York"
}
```
-**Expected Output (🤖):** Should return an object with temperature, conditions, and humidity for San Francisco, matching the output schema.
+**Expected Output (🤖):** The response should be an object with temperature (number), conditions (string), and humidity (number) for New York.
**Actual Output (1 blocks):**
@@ -1011,22 +780,22 @@ Here are 3 resource links to resources available in this server (see full output
-#### Step 23: structuredContent ✅
+#### Step 17: structuredContent ✅
Toggle step details
[→ View tool details](#tool-structuredContent)
-**Reasoning (🤖):** Test structured content with a zip code.
+**Reasoning (🤖):** Test structuredContent with a valid zip code to check alternate location input.
**Tool Call (🤖):**
```json
{
- "location": "94103"
+ "location": "90210"
}
```
-**Expected Output (🤖):** Should return an object with temperature, conditions, and humidity for zip code 94103, matching the output schema.
+**Expected Output (🤖):** The response should be an object with temperature, conditions, and humidity for the 90210 area.
**Actual Output (1 blocks):**
@@ -1048,14 +817,14 @@ Here are 3 resource links to resources available in this server (see full output
-#### Step 24: structuredContent ❌
+#### Step 18: structuredContent ❌
Toggle step details
[→ View tool details](#tool-structuredContent)
-**Reasoning (🤖):** Test edge case: empty location string (should fail validation).
+**Reasoning (🤖):** Test structuredContent with an empty location to check input validation and error handling (edge case).
**Tool Call (🤖):**
```json
@@ -1063,7 +832,7 @@ Here are 3 resource links to resources available in this server (see full output
"location": ""
}
```
-**Expected Output (🤖):** Should return an error or validation failure due to minLength constraint.
+**Expected Output (🤖):** The response should be an error indicating that 'location' does not meet the minimum length requirement.
**Exception:**
```
@@ -1084,6 +853,85 @@ Here are 3 resource links to resources available in this server (see full output
+#### Step 19: listRoots ✅
+
+
+Toggle step details
+
+[→ View tool details](#tool-listRoots)
+
+**Reasoning (🤖):** Test listRoots to verify the server can enumerate MCP roots, even if it does not access files.
+
+**Tool Call (🤖):**
+```json
+{}
+```
+**Expected Output (🤖):** The response should be an object or array listing the current MCP roots (may be empty or contain mock roots).
+
+**Actual Output (1 blocks):**
+
+✅ **No Error**
+
+```
+Current MCP Roots (1 total):
+
+1. Unnamed Root
+ URI: file://dummy.txt/
+
+Note: This server demonstrates the roots protocol capability but doesn't actually access files. The roots are provided by the MCP client and can be used by servers that need file system access.
+```
+**Output Statistics:**
+
+| Metric | Value |
+| --- | --- |
+| Text token count | 56 |
+| Text blocks | 1 |
+
+
+
+#### Step 20: startElicitation ✅
+
+
+Toggle step details
+
+[→ View tool details](#tool-startElicitation)
+
+**Reasoning (🤖):** Test startElicitation to verify the server initiates an elicitation process for user information.
+
+**Tool Call (🤖):**
+```json
+{}
+```
+**Expected Output (🤖):** The response should be a prompt or object requesting the user's favorite color, number, and pets.
+
+**Actual Output (2 blocks):**
+
+✅ **No Error**
+
+```
+⚠️ User cancelled the elicitation dialog.
+```
+```
+
+Raw result: {
+ "action": "cancel"
+}
+```
+**Output Statistics:**
+
+| Metric | Value |
+| --- | --- |
+| Text token count | 22 |
+| Text blocks | 2 |
+
+**MCP Requests:**
+
+| Request Type | Count |
+| --- | --- |
+| Elicitation | 1 |
+
+
+
## Tools
@@ -1348,29 +1196,6 @@ Returns a resource reference that can be used by MCP clients
_No Output Schema_
-
-### startElicitation
-
-
-Toggle tool details
-
-**Description:**
-```
-Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.
-```
-**Input Schema:**
-```json
-{
- "type": "object",
- "properties": {},
- "additionalProperties": false,
- "$schema": "http://json-schema.org/draft-07/schema#"
-}
-```
-**Output Schema:**
-_No Output Schema_
-
-
### getResourceLinks
@@ -1459,6 +1284,52 @@ Returns structured content along with an output schema for client data validatio
```
+
+### listRoots
+
+
+Toggle tool details
+
+**Description:**
+```
+Lists the current MCP roots provided by the client. Demonstrates the roots protocol capability even though this server doesn't access files.
+```
+**Input Schema:**
+```json
+{
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false,
+ "$schema": "http://json-schema.org/draft-07/schema#"
+}
+```
+**Output Schema:**
+_No Output Schema_
+
+
+
+### startElicitation
+
+
+Toggle tool details
+
+**Description:**
+```
+Demonstrates the Elicitation feature by asking the user to provide information about their favorite color, number, and pets.
+```
+**Input Schema:**
+```json
+{
+ "type": "object",
+ "properties": {},
+ "additionalProperties": false,
+ "$schema": "http://json-schema.org/draft-07/schema#"
+}
+```
+**Output Schema:**
+_No Output Schema_
+
+
## Resources
diff --git a/src/mcp_interviewer/reports/base.py b/src/mcp_interviewer/reports/base.py
index bfb171c..f0b7d5b 100644
--- a/src/mcp_interviewer/reports/base.py
+++ b/src/mcp_interviewer/reports/base.py
@@ -85,22 +85,27 @@ def add_report(self, report: "BaseReport") -> "BaseReport":
self._lines.extend(report._lines)
return self
- def start_collapsible(self, title: str, level: int = 2) -> "BaseReport":
- """Start a collapsible section with a title."""
- # Always add the markdown header
- prefix = "#" * level
- self._lines.append(f"{prefix} {title}")
- self._lines.append("")
+ def start_collapsible(self, summary: str) -> "BaseReport":
+ """Start a collapsible section.
- # Only add details tags if use_collapsible is True
+ Args:
+ summary: The summary text shown when collapsed
+
+ Returns:
+ Self for method chaining
+ """
if self._options.use_collapsible:
self._lines.append("")
- self._lines.append("Toggle details
")
+ self._lines.append(f"{summary}
")
self._lines.append("")
return self
def end_collapsible(self) -> "BaseReport":
- """End a collapsible section."""
+ """End a collapsible section.
+
+ Returns:
+ Self for method chaining
+ """
if self._options.use_collapsible:
self._lines.append(" ")
self._lines.append("")
diff --git a/src/mcp_interviewer/reports/functional_test/test.py b/src/mcp_interviewer/reports/functional_test/test.py
index 2a2c9ff..01463d9 100644
--- a/src/mcp_interviewer/reports/functional_test/test.py
+++ b/src/mcp_interviewer/reports/functional_test/test.py
@@ -36,7 +36,8 @@ def _build(self):
return
# Check if scoring was disabled
- self.start_collapsible("Functional Test Results", 2)
+ self.add_title("Functional Test Results", 2)
+ self.start_collapsible("Toggle details")
# Test plan
if self.include_evaluations and test.plan:
diff --git a/src/mcp_interviewer/reports/functional_test/tool_scorecards.py b/src/mcp_interviewer/reports/functional_test/tool_scorecards.py
index bb798e1..d4f1c21 100644
--- a/src/mcp_interviewer/reports/functional_test/tool_scorecards.py
+++ b/src/mcp_interviewer/reports/functional_test/tool_scorecards.py
@@ -37,7 +37,8 @@ def _build(self):
scoring_disabled = True
if scoring_disabled:
- self.start_collapsible("Tool Scorecards", 2)
+ self.add_title("Tool Scorecards", 2)
+ self.start_collapsible("Toggle details")
self.add_text(
"_Experimental tool judging disabled - no evaluations generated_"
)
@@ -45,7 +46,8 @@ def _build(self):
self.end_collapsible()
return
else:
- self.start_collapsible("Tool Scorecards (🤖)", 2)
+ self.add_title("Tool Scorecards (🤖)", 2)
+ self.start_collapsible("Toggle details")
if not self._scorecard.tool_scorecards:
self.add_text("_No tool evaluations available_")
diff --git a/src/mcp_interviewer/reports/interviewer/interviewer_info.py b/src/mcp_interviewer/reports/interviewer/interviewer_info.py
index 09e16d8..0711453 100644
--- a/src/mcp_interviewer/reports/interviewer/interviewer_info.py
+++ b/src/mcp_interviewer/reports/interviewer/interviewer_info.py
@@ -26,7 +26,8 @@ def __init__(self, scorecard: ServerScoreCard):
def _build(self):
"""Build the interviewer info section."""
- self.start_collapsible("Interviewer Parameters", 2)
+ self.add_title("Interviewer Parameters", 2)
+ self.start_collapsible("Toggle details")
self.add_title("Metadata", 4)
# Add date and version
diff --git a/src/mcp_interviewer/reports/server/prompts.py b/src/mcp_interviewer/reports/server/prompts.py
index 93a00b2..a820702 100644
--- a/src/mcp_interviewer/reports/server/prompts.py
+++ b/src/mcp_interviewer/reports/server/prompts.py
@@ -22,7 +22,8 @@ def __init__(self, scorecard: ServerScoreCard):
def _build(self):
"""Build the prompts section."""
- self.start_collapsible("Available Prompts", 2)
+ self.add_title("Available Prompts", 2)
+ self.start_collapsible("Toggle details")
if not self._scorecard.prompts:
self.add_text("_No prompts available_")
diff --git a/src/mcp_interviewer/reports/server/resource_templates.py b/src/mcp_interviewer/reports/server/resource_templates.py
index f2d41c4..0279345 100644
--- a/src/mcp_interviewer/reports/server/resource_templates.py
+++ b/src/mcp_interviewer/reports/server/resource_templates.py
@@ -24,7 +24,8 @@ def __init__(self, scorecard: ServerScoreCard):
def _build(self):
"""Build the resource templates section."""
- self.start_collapsible("Resource Templates", 2)
+ self.add_title("Resource Templates", 2)
+ self.start_collapsible("Toggle details")
if not self._scorecard.resource_templates:
self.add_text("_No resource templates available_")
diff --git a/src/mcp_interviewer/reports/server/resources.py b/src/mcp_interviewer/reports/server/resources.py
index a86f2ff..50d2814 100644
--- a/src/mcp_interviewer/reports/server/resources.py
+++ b/src/mcp_interviewer/reports/server/resources.py
@@ -24,7 +24,8 @@ def __init__(self, scorecard: ServerScoreCard):
def _build(self):
"""Build the resources section."""
- self.start_collapsible("Resources", 2)
+ self.add_title("Resources", 2)
+ self.start_collapsible("Toggle details")
if not self._scorecard.resources:
self.add_text("_No resources available_")
diff --git a/src/mcp_interviewer/reports/server/tools.py b/src/mcp_interviewer/reports/server/tools.py
index 10b8ba2..c62d4c7 100644
--- a/src/mcp_interviewer/reports/server/tools.py
+++ b/src/mcp_interviewer/reports/server/tools.py
@@ -28,7 +28,8 @@ def _build(self):
def add_available_tools(self) -> "ToolsReport":
"""Add list of available tools with full details."""
- self.start_collapsible("Tools", 2)
+ self.add_title("Tools", 2)
+ self.start_collapsible("Toggle details")
if not self._scorecard.tools:
self.add_text("_No tools available_")