southern_push2935
07/31/2025, 5:10 PMpython
@mcp.tool
def get_appointment_timeslots(zip_code: str, address: str, city: str): pass
@mcp.tool
def create_appointment(correlation_id: str, first_name: str, ...): pass
Should expose: get_appointment_timeslots and create_appointment
Vapi exposes: book_appointments (doesn't exist in MCP server)
## Production Failure
AI attempted book_appointments 3 times, all failed:
json
// Request
{"function": {"name": "book_appointments", "arguments": "{\"action\": \"get_appointment_timeslots\", ...}"}}
// Response
{"result": "[{\"type\": \"text\", \"text\": \"Unknown tool: book_appointments\"}]"}
Customer couldn't book appointment due to this bug.
## Root Cause
Vapi incorrectly parses MCP tools/list JSON-RPC responses. Instead of exposing individual tools per the MCP specification, it creates a wrapper that doesn't exist.
Vapi's tool config shows the mismatch:
json
{
"function": {"name": "book_appointments"}, // ❌ Fake wrapper
"metadata": {
"tools": [
{"function": {"name": "ngrokfree-get_appointment_timeslots"}}, // ✅ Real tools
{"function": {"name": "ngrokfree-create_appointment"}}
]
}
}
## Comparison
Claude Desktop (works correctly):
- front-desk-appointment:get_appointment_timeslots ✅
- front-desk-appointment:create_appointment ✅
## Impact on MCP's Purpose
This bug defeats the entire point of MCP. The protocol exists to expose groups of related tools through a single server, but Vapi's implementation forces developers to create individual tools one-by-one instead of leveraging MCP's server-based tool discovery. This makes MCP integration pointless on Vapi.southern_push2935
08/01/2025, 2:55 PMChiranjeet Mishra
08/04/2025, 6:00 PMRyGuy
10/30/2025, 10:05 PMsouthern_push2935
11/06/2025, 1:32 PMsouthern_push2935
11/06/2025, 1:32 PM