Local-first, AI-native knowledge management. Monorepo: Next.js web app + Bun CLI + shared contracts.
Second Brain MCP server has 15 tools with significant quality gaps. Tool naming is moderately clear (verb-based: list, create, update, remove, switch, accept, find, rename, resolve), averaging ~20 characters. Descriptions exist for all tools (range 45-150 chars) but many are generic and lack context on when to use them or what happens on failure. Input schemas are visible but sparse: only 7 of 15 tools have documented parameters with types and descriptions; 8 tools have no visible input schema at all. Output schemas are completely undocumented, callers have no guidance on what fields to expect. Error handling is absent from all tool definitions, no recovery guidance, no categorization of retryable vs fatal errors. Parameter descriptions lack constraints (e.g., no enum for role values despite them being role, no format specs for IDs). Tool composition is reasonable (each tool does one thing), but critical chaining information is missing, e.g., createAgent returns an API key but no agent_id, forcing an extra listAgents call to identify the created agent. Security-relevant tools (createAgent, createInvitation, updateMemberRole, removeMember) lack permission annotations and scope declarations. Baseline for production tools expects 100% tool descriptions (achieved here) and 100% parameter descriptions (only ~47% achieved). Average parameter annotation length in this server is ~35 chars vs production baseline of 72 chars.
Accept a team invitation with a token
Cancel a pending team invitation
Create a new agent with name, scopes, and team assignment. Generates and returns a plaintext API key.
Invite a new member to the team by email with a specified role
Create a new team during onboarding with a name and optional slug
Find an available team slug based on a requested value
List all agents in a team with their metadata including scopes, active status, and timestamps
No output schemas documented for any tool. Callers have no guidance on return types, field names, or structure. This forces LLMs to guess at downstream field names and breaks tool chaining (e.g., createAgent should document it returns agent_id for use with other tools).
8 of 15 tools (listAgents, listInvitations, listOnboardingInvitations, resolvePrincipal, and 4 others implied without visible schema) have NO visible input schema. This prevents parameter validation and LLM planning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 43 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 30 | - | v1 |
List all pending team invitations
List pending team invitations for the current user during onboarding
Regenerate an invitation link for a pending team invitation
Remove a team member
Rename the current team
Resolve the current request principal (user or agent) with team and role information
Switch the active team for the current user
Update a team member's role
Parameter descriptions are sparse and lack constraints. Example: createInvitation accepts 'role' with enum [owner, admin, member] but the parameter description does not document this, LLMs must infer valid values. createAgent's 'scopes' parameter is described as 'JSON object or array' with no guidance on valid keys or format. Baseline expectation: 100% of parameters have descriptions AND constraints.
No error handling guidance in any tool definition. Descriptions do not indicate which errors are retryable, what to do on 404/403/500, or how to recover. Example: acceptInvitation could fail if token is expired, no guidance on retry vs reject. Blocks agent error recovery planning.
Tool descriptions lack context on when to use them or prerequisites. Examples: 'Regenerate an invitation link for a pending team invitation' (45 chars) does not explain what 'regenerate' means (does it invalidate the old link?), whether the invitation must still be pending, or what the new link is used for. Compare to baseline (194 chars avg): these descriptions are half the length and omit critical reasoning guides.
Security-critical tools (createAgent, createInvitation, updateMemberRole, removeMember) have NO scope/permission annotations. Per pattern:scope-declaration, each tool should declare required permissions (e.g., 'write:team', 'read:invitations'). This prevents least-privilege agent configuration and audit clarity.
Tool composition has gaps. createAgent likely returns an API key (per description) but no agent_id. Callers must invoke listAgents to map name→agent_id, wasting a round-trip. Per pattern:tool-chain, createAgent should return all IDs downstream tools need. Similar issue: acceptInvitation takes a token but likely returns minimal info, no team_id or role.
List tools (listAgents, listInvitations, listOnboardingInvitations) have no visible pagination or limit parameters. Per pattern:paginated-result, these should support offset/limit and return a total count. Without pagination, results could exceed context window or be incomplete.