MCP server implementation using Azure Functions with support for tools, prompts, resources, and structured content. Includes weather widget, code snippets, QR code generation, and On-Behalf-Of authentication examples.
This Azure Functions MCP server provides 11 tools with visible schemas and descriptions. Strengths: all tools have descriptions (though varying quality), input parameters are typed, and the code demonstrates proper use of Azure Functions MCP binding patterns with structured content support. Weaknesses: tool names are inconsistently capitalized and do not uniformly follow verb_noun conventions (e.g., 'GetWeather' vs 'hello'), descriptions vary widely in actionability and length (some are under 50 chars), output schemas are not documented, and error handling lacks actionability guidance. The server demonstrates functional structure but falls short of production-grade clarity needed for reliable LLM tool selection.
Returns current weather for a location via Open-Meteo.
Generates an SVG status badge - multi McpContentBlock[] example
Generates a QR code PNG - single ImageContent example
Retrieves a code snippet with full metadata as an McpToolResponse (explicit structuredContent demo).
Returns McpToolResponse with explicit structuredContent
Returns McpContentBlock[] - multi-block example
Gets code snippets from your snippet collection.
Inconsistent tool naming convention: 'GetWeather' uses PascalCase while 'hello', 'getsnippets', 'savesnippet' use camelCase. One tool uses 'getImageWithText' (camelCase with compound), another uses 'generateQrCode' (verb-driven). LLMs expect consistent verb_noun patterns starting with lowercase action verbs.
Output schemas are not documented. Tools return responses but the structure of return values is not defined. Example: 'getImageWithText' returns 'McpContentBlock[]' but the fields in that structure are not described. Without documented output schemas, LLMs cannot plan downstream tool calls or extract required data.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | 2025-06-18+ | v2 |
| 2026-03-09 | F | 35 | - | v1 |
Simple hello world MCP Tool that responds with a hello message.
Greets the signed-in user by name using the On-Behalf-Of (OBO) flow to call Microsoft Graph.
Returns a resource link content block.
Saves a code snippet into your snippet collection.
Varying description quality and length. Some descriptions are under 50 characters and lack actionability: 'resourceLink' has 'Returns a resource link content block.' (37 chars, no context on when to use). Others like 'helloMcpWithAuth' are more descriptive. Descriptions should be 50-200 chars and explain WHAT, WHEN, and WHAT the tool returns.
No error handling guidance. Tool implementations check for missing parameters and return error strings (e.g., 'No snippet name provided'), but error responses do not guide LLMs on recovery: should they retry? Call a different tool? Ask the user? Per pattern:recovery-guide, errors must be actionable.
Parameter descriptions lack constraint details. Example: 'location' param in GetWeather says 'City name to check weather for (e.g., Seattle, New York, Miami)', this includes example values that LLMs may reuse literally. Should be format-constrained. 'imageId' and 'snippet_name' are marked optional but no default behavior is documented.
Tool naming does not universally follow verb_noun pattern. 'resourceLink' and 'generateBadge' are action-clear, but 'hello', 'GetWeather', 'helloMcpWithAuth', 'getImageWithText', 'getImageWithMetadata', 'getCodeSnippet' do not signal single, atomic responsibilities as clearly. 'getImageWithText' vs 'getImageWithMetadata' are confusingly similar and require deep reading to distinguish.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. The 'savesnippet' tool is WRITE and 'getsnippets' is READ_ONLY, but these are not declared in the tool definitions via annotations. Modern MCP servers should declare tool intent explicitly.