An MCP server implementation in C# that integrates with Microsoft Semantic Kernel, providing tools for email sending and echo functionality
Two tools with minimal definitions. Echo has a trivial description (34 chars, at baseline minimum) and a single string parameter with a misleading description ('Message for the email' when the tool echoes input). SendEmail has a basic description (32 chars) but critical gaps: no parameter descriptions for 'person' or 'message', no output schema documentation, no error handling guidance, and no indication that it performs a destructive operation (sends email). Neither tool declares input constraints, enums, or validation rules. No pagination, no idempotency markers, no recovery guidance. Schemas are inferred from C# attributes rather than explicitly visible in JSON Schema format.
Echoes the input back to the client.
Sends an Email to someone.
SendEmail lacks parameter descriptions. 'person' and 'message' parameters have no descriptions visible in the tool definition, violating the requirement that every parameter must explain what it controls to the LLM.
SendEmail performs a destructive operation (sends email) but the description does not state this. Agents need to know which calls are irreversible and cannot be safely retried. No confirmation or dry-run pattern is offered.
Echo parameter description is misleading. The parameter is named 'message' and described as 'Message for the email', but Echo does not send email, it echoes input. This mismatch will confuse LLMs about the tool's purpose.
No output schemas documented. Neither tool explicitly documents what fields or structure the response contains. LLMs cannot plan downstream calls or extract data without knowing the response shape.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 35 | <=2025-11-25 | v2 |
SendEmail accepts 'person' as a free-form string but internally uses a hardcoded dictionary lookup. No enum constraint, no validation error message, and no guidance on valid values. If an invalid person is passed, the tool will throw an unhandled KeyNotFoundException.