Consolidated follow-up from implementation of #173.
Each section below lists scope-checked follow-up items discovered during implementation. Items are restricted to core library defects, security, safety hazards, or critical functional bugs.
Safety
Dispatcher.call_tool raises bare KeyError on missing team_id argument
mcp_server.py:82 does str(arguments["team_id"]) with no guard. The MCP SDK passes the raw arguments dict without validating it against the inputSchema, so a client that omits team_id causes an unhandled KeyError that propagates through _call_tool in build_server() and crashes the stdio server process rather than returning a structured MCP error. Fix: catch KeyError (or use arguments.get) and raise a descriptive ValueError (or return a TextContent error response) so the server stays alive across bad requests.
The implementer also considered the items below and rejected them as out of scope; they are recorded in the PR body, not filed as separate issues.
Consolidated follow-up from implementation of #173.
Each section below lists scope-checked follow-up items discovered during implementation. Items are restricted to core library defects, security, safety hazards, or critical functional bugs.
Safety
Dispatcher.call_tool raises bare KeyError on missing team_id argument
mcp_server.py:82 does
str(arguments["team_id"])with no guard. The MCP SDK passes the rawargumentsdict without validating it against the inputSchema, so a client that omitsteam_idcauses an unhandled KeyError that propagates through_call_toolin build_server() and crashes the stdio server process rather than returning a structured MCP error. Fix: catch KeyError (or usearguments.get) and raise a descriptive ValueError (or return a TextContent error response) so the server stays alive across bad requests.The implementer also considered the items below and rejected them as out of scope; they are recorded in the PR body, not filed as separate issues.