AI-powered radar for real OSS contribution opportunities: scores good-first-issue candidates by actual current availability (assignee, competing/abandoned PRs, staleness, maintainer sentiment), not just a label.
Five tools with clear verb-noun naming (list_, add_, refresh_, check_) and solid descriptions (100-200 chars). All tools have input schemas with Zod validation and parameter descriptions. Error handling uses isError:true pattern. Main gaps: no output schemas documented, no pagination support for list tools, missing parameter constraints (e.g., labelFilter array size limits), and no tool annotations (readOnlyHint/destructiveHint). Composition is clean, each tool has one responsibility. Naming is consistent and action-oriented.
Start watching a repo for scored issues - idempotent, returns the existing row if this owner/name is already watched.
Score one issue live, right now, with no caching and no cooldown - the single call that answers "is this issue actually still available, and does a maintainer actually want it worked on?" for a repo that may not even be watched yet.
List the current scored snapshot for a watched repo, highest-opportunity first by default.
List every repo this API key's owner is watching.
Refresh scored issues for a watched repo - a 5-minute cooldown returns the cached snapshot instead of re-hitting GitHub/Gemini.
No output schemas documented. LLMs cannot plan downstream calls or extract fields without knowing response structure. list_watched_repos, list_scored_issues, and add_watched_repo should document returned fields (id, owner, name, score, etc.).
list_watched_repos and list_scored_issues lack pagination (limit, offset, total_count). Without pagination, large result sets blow context windows and violate pattern:paginated-result.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). add_watched_repo is idempotent per description but lacks idempotentHint annotation. refresh_repo and check_issue_feasibility are read-only but lack readOnlyHint.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
labelFilter parameter in add_watched_repo lacks constraints (min/max array size, string length limits). LLMs could pass empty arrays or extremely long labels without validation guidance.
Error messages use generic error.message. Should categorize errors as retryable (GitHub rate limit), user-fixable (invalid repo), or fatal (auth failure) and provide recovery guidance per pattern:recovery-guide.