DNS-level distraction blocker with MCP (Model Context Protocol) integration - manages domain blocking, time-limited allowances, delay friction, and hard lockouts for focus control
This MCP server provides 8 well-named tools with clear verb-noun conventions (focus_status, focus_blocked_list, focus_check_domain, etc.). All tools have descriptions ranging from 84-314 characters. Input schemas are present and properly typed for all tools. However, there are notable gaps: (1) Output schemas are not documented, we can infer structure from code but LLMs cannot predict what fields to expect from responses. (2) Parameter descriptions are minimal or absent for some tools (e.g., focus_status has empty input {}; focus_blocked_list has no params documented). (3) Error handling lacks recovery guidance, responses are HTTP status codes without actionable next steps. (4) No pagination support visible despite tools returning lists (focus_blocked_list, focus_allowances, focus_delayed_list). (5) Hard-coded domain lockouts (Twitter/X, YouTube) are mentioned in focus_grant description but not in focus_unblock, creating inconsistency. Overall, naming and basic schema presence are solid (B+ tier), but output documentation, error guidance, and composition patterns need work.
List all active time-limited access grants (allowances). Shows which domains have temporary access and when it expires.
Add a domain to the blocklist. Immediately blocks DNS, kills connections, and closes browser tabs for that domain.
List all domains currently on the blocklist.
Check whether a specific domain is currently blocked and if it has an active allowance.
List domains with delay friction (progressive wait times instead of full block).
Grant time-limited access to a blocked domain. Access auto-expires and the domain is aggressively re-blocked (DNS, connections killed, browser tabs closed). IMPORTANT: Before calling this tool, you MUST: 1. Ask the user WHY they need access — what specific task? 2. Challenge whether it's truly necessary — is there an alternative? 3. Clarify their specific intention — "What exactly will you do in the next 10 minutes?" 4. Get a specific duration (5, 10, 15, 30 min max). Twitter/X and YouTube are HARD LOCKED until March 2026. This tool will refuse those domains.
Output schemas not documented. List tools (focus_blocked_list, focus_allowances, focus_delayed_list) return arrays but LLMs cannot predict the structure of each domain/allowance object. Response schema documentation is missing for all 8 tools.
No pagination on list tools. focus_blocked_list, focus_allowances, focus_delayed_list return entire lists without limit or offset parameters. If a user has 1000+ blocked domains, the response could exhaust context windows. Pattern baseline: list tools should accept limit/offset and return total count.
Inconsistent hard-lock documentation. focus_grant describes Twitter/X and YouTube as HARD LOCKED until March 2026, but focus_unblock's description only mentions 'hard-locked domains (configured via API)' without specifying which domains or dates. This creates ambiguity for LLMs deciding whether to retry.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | <=2025-11-25 | v2 |
| 2026-03-09 | C | 63 | - | v1 |
Get the current state of the focus shield: whether it's active, daemon health, number of blocked domains, and any active time-limited allowances.
Permanently remove a domain from the blocklist. Use focus_grant for temporary access instead — permanent unblock should only be used for domains that are genuinely creation/work tools. Hard-locked domains (configured via API) will be refused.
Error responses lack recovery guidance. HTTP 400/403/500 errors (visible in server.ts) do not guide the LLM on next steps. E.g., '400: domain required' should become '400: domain required. Example: focus_check_domain({domain: "twitter.com"})'.
focus_grant requires multi-step validation before calling (ask user why, challenge necessity, get duration). This is documented in the tool description but not enforced at the MCP level. LLMs may skip validation steps. Consider a confirmation-request pattern or pre-execution hook.
Parameter descriptions sparse or missing. focus_status, focus_blocked_list, focus_allowances, focus_delayed_list accept no parameters but schemas are empty objects {}. Parameter annotation coverage < 50%.