Compare commits

..

3 Commits

Author SHA1 Message Date
Space-Banane 8083b0b8a8 fix: remove stale legal:write from api-keys scope list
CI / Build & Test (push) Successful in 17s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 23:53:58 +02:00
Space-Banane e6f6e1c19f docs: update CLAUDE.md files for static legal model
Remove DB-backed legal document system references across all repos.
Update root CLAUDE.md: replace "Legal System" section with static
document workflow; add step to remind Paul about material-change emails.
Update api/: remove LegalDocument model, Legal route table, legal:write
from permission matrix, whoami grace-period bullet.
Update frontend/: update /terms /privacy page descriptions, remove
legal-service.ts, remove legal types, replace banner/grace-period
behaviors with static model.
Update queue-worker/: remove legal-update.ts worker row and queue ref.
Update mcp-server/: remove Legal tool category, tool count 89 → 85.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 23:52:28 +02:00
Space-Banane 163e145b9e feat: remove 4 legal document MCP tools
Delete tools/legal.ts (get_terms_of_service, get_privacy_policy,
list_legal_documents, accept_legal_documents) and remove the
registerLegalTools call from index.ts. Tool count: 89 → 85.
Legal documents are now static; no API endpoints back them.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-26 23:41:59 +02:00
4 changed files with 0 additions and 64 deletions
-10
View File
@@ -18,7 +18,6 @@ Auth: `BETTERNEWS_API_KEY` env var, sent as `Authorization: Bearer` on every req
| `src/tools/user.ts` | 7 user/profile tools | | `src/tools/user.ts` | 7 user/profile tools |
| `src/tools/moderation.ts` | 11 moderation tools | | `src/tools/moderation.ts` | 11 moderation tools |
| `src/tools/tickets.ts` | 5 support ticket tools | | `src/tools/tickets.ts` | 5 support ticket tools |
| `src/tools/legal.ts` | 4 legal document tools |
| `src/tools/blog.ts` | 7 blog tools | | `src/tools/blog.ts` | 7 blog tools |
| `src/tools/api-keys.ts` | 4 API key tools | | `src/tools/api-keys.ts` | 4 API key tools |
| `src/tools/sessions.ts` | 3 session tools | | `src/tools/sessions.ts` | 3 session tools |
@@ -118,15 +117,6 @@ Format: `tool_name` → file → `METHOD /api/route` → minimum auth
| `reply_to_ticket` | `POST /api/tickets/{id}/reply` | `tickets:write` | | `reply_to_ticket` | `POST /api/tickets/{id}/reply` | `tickets:write` |
| `update_ticket_status` | `PATCH /api/tickets/{id}/status` | `tickets:moderate` Mod/Admin | | `update_ticket_status` | `PATCH /api/tickets/{id}/status` | `tickets:moderate` Mod/Admin |
### Legal — `tools/legal.ts`
| Tool | Route | Auth |
| ---- | ----- | ---- |
| `get_terms_of_service` | `GET /api/legal/current/terms_of_service` | public |
| `get_privacy_policy` | `GET /api/legal/current/privacy_policy` | public |
| `list_legal_documents` | `GET /api/legal` | optional; Mod/Admin see drafts |
| `accept_legal_documents` | `POST /api/legal/accept` | User+ |
### Blog — `tools/blog.ts` ### Blog — `tools/blog.ts`
| Tool | Route | Auth | | Tool | Route | Auth |
-2
View File
@@ -8,7 +8,6 @@ import { registerSourceTools } from "./tools/sources.js";
import { registerUserTools } from "./tools/user.js"; import { registerUserTools } from "./tools/user.js";
import { registerModerationTools } from "./tools/moderation.js"; import { registerModerationTools } from "./tools/moderation.js";
import { registerTicketTools } from "./tools/tickets.js"; import { registerTicketTools } from "./tools/tickets.js";
import { registerLegalTools } from "./tools/legal.js";
import { registerBlogTools } from "./tools/blog.js"; import { registerBlogTools } from "./tools/blog.js";
import { registerApiKeyTools } from "./tools/api-keys.js"; import { registerApiKeyTools } from "./tools/api-keys.js";
import { registerSessionTools } from "./tools/sessions.js"; import { registerSessionTools } from "./tools/sessions.js";
@@ -37,7 +36,6 @@ registerSourceTools(server, client);
registerUserTools(server, client); registerUserTools(server, client);
registerModerationTools(server, client); registerModerationTools(server, client);
registerTicketTools(server, client); registerTicketTools(server, client);
registerLegalTools(server, client);
registerBlogTools(server, client); registerBlogTools(server, client);
registerApiKeyTools(server, client); registerApiKeyTools(server, client);
registerSessionTools(server, client); registerSessionTools(server, client);
-1
View File
@@ -18,7 +18,6 @@ const SCOPES = [
"mod:stats", "mod:stats",
"mod:users", "mod:users",
"blog:write", "blog:write",
"legal:write",
"user:profile", "user:profile",
"user:apikeys", "user:apikeys",
"privacy:read", "privacy:read",
-51
View File
@@ -1,51 +0,0 @@
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import type { BetterNewsClient } from "../client.js";
import { handleTool } from "../utils.js";
export function registerLegalTools(server: McpServer, client: BetterNewsClient) {
server.tool(
"get_terms_of_service",
"Get the current published Terms of Service document.",
{},
handleTool(async () => {
const data = await client.get<unknown>("/api/legal/current/terms_of_service");
return JSON.stringify(data, null, 2);
}),
);
server.tool(
"get_privacy_policy",
"Get the current published Privacy Policy document.",
{},
handleTool(async () => {
const data = await client.get<unknown>("/api/legal/current/privacy_policy");
return JSON.stringify(data, null, 2);
}),
);
server.tool(
"list_legal_documents",
"List legal documents. Public sees published only; Mod/Admin see all.",
{
type: z.enum(["terms_of_service", "privacy_policy"]).optional().describe("Filter by document type"),
status: z.enum(["draft", "published", "archived"]).optional().describe("Filter by status (Mod/Admin only)"),
page: z.number().int().positive().optional().describe("Page number (default 1)"),
limit: z.number().int().min(1).max(50).optional().describe("Items per page (default 20)"),
},
handleTool(async (args) => {
const data = await client.get<unknown>("/api/legal", args);
return JSON.stringify(data, null, 2);
}),
);
server.tool(
"accept_legal_documents",
"Accept the current legal documents (Terms of Service and Privacy Policy). Clears the legalAcceptanceRequired flag.",
{},
handleTool(async () => {
const data = await client.post<unknown>("/api/legal/accept");
return JSON.stringify(data, null, 2);
}),
);
}