A backend service for managing AI agents with configurable tools, chat capabilities, and logging. Supports tool invocation (GitHub PR summarization, Slack notifications, Groq chat, HTTP requests) and maintains chat history.
This server has fundamental definition quality issues across all 4 tools. Tool naming is inconsistent and lacks the verb-first convention required for LLM understanding. Critical security flaw: credentials are exposed as configuration parameters rather than server-side injected. Input schemas are incomplete or missing descriptions, violating core pattern requirements. Output schemas are not documented. Error handling is absent, no recovery guidance for LLMs. The server appears to implement a custom tool invocation system rather than proper MCP tool registration. Tools are defined in availableTools.ts with configSchema but lack proper input parameter documentation for invocation. No evidence of output schema documentation or structured error responses.
Fetch and summarize a GitHub Pull Request.
Send a message to Groq API for chat completion.
Make an HTTP request with configurable URL, method, headers, and body template.
Post a message to a Slack channel.
CRITICAL: Credentials and API keys exposed in configSchema. githubSummarizer accepts 'token' and 'apiKey' as configuration fields; slackNotifier requires 'webhookUrl'; groqChat takes 'apiKey'. These are server-side configuration secrets that must never be exposed as tool parameters or logged. This violates the secret-injection pattern and will leak credentials into agent traces.
Input parameter schemas are incomplete. The githubSummarizer invocation accepts 'prNumber' (string|number) per the endpoint descriptor, but the configSchema in availableTools.ts lists owner/repo/token/apiKey/model, these are configuration, not invocation inputs. Invocation input schema is not documented anywhere. Cannot verify if input parameters have descriptions.
No output schemas documented. Tools return strings (invokeTool returns Promise<string>) but the structure of those strings is not defined. LLMs cannot plan downstream calls or extract structured data without knowing what fields are returned.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 33 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 23 | - | v1 |
Tool naming does not follow verb-first convention. 'githubSummarizer' should be 'summarize_github_pr' or 'fetch_and_summarize_pr'. 'slackNotifier' should be 'send_slack_message' or 'post_to_slack'. 'groqChat' should be 'send_message_to_groq' or 'chat_with_groq'. Current names are noun-based and do not clearly signal the action to LLMs.
No error handling or recovery guidance. invokeTool() can fail at multiple points (GitHub API, Slack webhook, Groq API, HTTP requests) but no tool documents what errors it may raise, how to classify them (retryable vs fatal), or what the LLM should do next. Raw errors with no recovery instructions.
Input parameter descriptions are missing or insufficient. slackNotifier takes 'text' parameter with description 'The message text to post to Slack', adequate but brief. groqChat takes 'message' with description 'The user message to send for chat completion', vague about what the response contains or how it relates to the system prompt. http tool parameters lack guidance on bodyTemplate placeholder syntax or validation rules.
No parameter type constraints or enums. The http tool accepts 'method' as a string with description 'HTTP method (GET, POST, PUT, DELETE, etc.)' but does not constrain it to an enum. LLMs may pass invalid methods like 'FETCH' or 'SUBSCRIBE'. Other tools lack validation rules (e.g., min/max lengths, regex patterns).
Tool composition is unclear. The 'http' tool is extremely generic and overlaps with githubSummarizer, slackNotifier, and groqChat. Each of those could be implemented as HTTP calls. The server does not document when to use the generic 'http' vs the specialized tools, or if 'http' is meant as a fallback. Generic tools increase LLM reasoning cost and risk wrong tool selection.
Incomplete tool descriptions. 'githubSummarizer' description 'Fetch and summarize a GitHub Pull Request' does not state WHEN to use it (when you need a PR overview), WHAT it returns (a summary text? structured analysis?), or any PREREQUISITES (must have GitHub token configured). Descriptions should be 50-200 chars and include context for LLM selection.
No idempotency or confirmation pattern for destructive tools. slackNotifier and http (if method=POST/DELETE) modify external state but have no dry-run, confirmation, or idempotency guarantee. An agent retrying after a transient failure could post the same message twice or make duplicate HTTP requests.
Missing pagination and result limits. If githubSummarizer or http fetch large datasets, there is no evidence of pagination support, result limits, or guidance on capping results. Returning thousands of items to an LLM wastes context and increases hallucination risk.