Python port of @mariozechner/pi-ai — unified LLM streaming API with OAuth authentication. Exposes ChatGPT Plus/Pro access via MCP tools without API keys or per-token billing.
Single tool 'complete' has a basic description (58 chars) but critical gaps in schema documentation and parameter guidance. Input schema visible with 'query' and 'model' parameters, both typed as strings with descriptions. However, no output schema is documented, LLMs cannot plan downstream actions or extract structured data. The 'model' parameter lists example values in the description ('gpt-5.1-codex-mini', 'gpt-5.1', etc.) rather than declaring them as an enum, inviting hallucinated model names. No error handling guidance, no idempotency declaration, and no indication of whether this tool modifies state (it appears read-only per the Risk field, but this is not stated in the description). The tool name 'complete' is generic and does not follow verb_noun convention, 'query_llm' or 'send_to_model' would be clearer. No parameter constraints (min/max length for query, valid model list as enum). Baseline: 100% of A+ tools have documented return types; this tool has none visible.
Send a query to a ChatGPT model and return the response.
No output schema documented. LLMs cannot infer what fields the response contains, blocking downstream tool chaining and structured data extraction.
Model parameter lists example values in description instead of declaring an enum. This invites LLMs to hallucinate invalid model names like 'gpt-5.1-turbo' or 'gpt-6.0'.
Tool name 'complete' is generic and does not follow verb_noun convention. Does not clearly convey the action (querying an LLM). Rename to 'query_llm' or 'send_to_model'.
No error handling guidance. If the model is unavailable, the API key is invalid, or the query is malformed, the LLM receives no recovery instructions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 35 | 2026-07-28+ | v2 |
No parameter constraints. 'query' has no length limits; 'model' has no enum. Unbounded strings invite API errors and token waste.