A self-hosted, Git-backed campaign manager for tabletop RPGs with wiki pages, player-safe portals, maps, sessions, quests, imports, AI tools, and MCP support.
CampaignRepo exposes 35 tools via Next.js API routes with Zod validation. Most tools have descriptions and basic parameter schemas, but quality is inconsistent. Many descriptions are generic (e.g., 'Update campaign calendar') without explaining WHEN to use the tool or what it returns. Parameter descriptions exist but lack detail on constraints, formats, or dependencies. Output schemas are not documented, LLMs cannot predict response structure. No error recovery guidance. Tool names follow verb_noun convention (good), but several lack clarity: 'ai_chat' vs 'get_ai_settings' conflate concerns. Critical security issue: API keys exposed as parameters (set_ai_settings, set_campaign_ai_settings). No tool annotations (readOnlyHint, destructiveHint). Composition is reasonable, tools chain via IDs, but pagination is missing from list tools.
Add a member to a campaign (GM/owner only)
Chat with AI about campaign content (GM/owner only)
Approve or reject wiki pages (GM/owner only)
Change the current user's password
Create a new campaign invite (GM/owner only)
Create a new user account (admin only)
Delete a board (GM/owner only)
Get the current user's AI configuration
API keys and secrets exposed as tool parameters (set_ai_settings, set_campaign_ai_settings, list_ai_models). Credentials must use server-side injection; agent traces log all parameters, leaking secrets.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Tools like list_users, list_campaign_members lack pagination parameters and result limits.
Descriptions are generic and lack context. Many (logout, get_oauth_providers, get_campaign_activity) do not explain WHEN to use the tool or what it returns. Baseline: 194 chars avg; many here are <80 chars.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | 2026-07-28+ | v2 |
Get recent Git commits for a campaign
Get campaign-specific AI settings (GM/owner only)
Get campaign calendar
Get list of configured OAuth providers
List available AI models from a configured endpoint
List all boards in a campaign (GM/owner only)
List campaign invites (GM/owner only)
List members of a campaign
List pages pending approval (GM/owner only)
List all users and campaigns (admin only)
Authenticate a user with email/name and password
Clear the current user's session
Handle OAuth callback from Google or GitHub
Initiate OAuth flow with Google or GitHub
Register a new user account
Remove a member from a campaign (GM/owner only)
Reset a user's password (admin only)
Revoke a campaign invite (GM/owner only)
Create or update a board (GM/owner only)
Update campaign calendar (GM/owner only)
Update the current user's AI configuration
Update campaign-specific AI settings (GM/owner only)
Grant or revoke admin privileges (admin only)
Set a user's role in a campaign (admin only)
Enable or disable a user account (admin only)
Update a campaign member's role or groups (GM/owner only)
Update a user's email and name (admin only)
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes (delete_board, reset_user_password) without explicit hints.
No error recovery guidance. Tools return generic HTTP errors (400, 403) without actionable next steps. E.g., 'User not found' should suggest 'Try search_users() with a partial name.'