# `io.debriefing/debriefing` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/io.debriefing/debriefing
- JSON: https://anlyon.dev/api/v1/servers/io.debriefing/debriefing
- Version: 2.0.0 (active)
- Publisher: io.debriefing (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Repository: https://github.com/0xrome/debriefing-mcp
- Metadata from the official MCP Registry, synced 2026-10-21T18:13:39.960Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Debriefing
Competitive intelligence: tracked competitors, evidence-backed signals, digests and battlecards.
```

Scanned 2026-10-21T18:39:19.853Z over streamable-http.

**43 tools: 14 can delete or cancel things, 1 do something that can't be undone, 10 change things and 18 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 14 | deny |
| Can't be undone | irreversible | 1 | ask |
| Changes things | write | 10 | ask |
| Only reads | read | 18 | allow |

## Exfil surface

No private-data -> untrusted-input -> outbound path in this server alone: no tool is tagged private-data.

| Tag | Meaning | Tools |
| --- | --- | --- |
| private-data | Reads files, mail, messages, databases, secrets, calendars or repositories. | none |
| untrusted-input | Brings in text someone else can write: web pages, inbound email, messages, issues and comments. | `mcp__debriefing__add_competitor` `mcp__debriefing__add_digest_note` `mcp__debriefing__add_monitored_page` `mcp__debriefing__add_signal_note` `mcp__debriefing__create_checkout_link` `mcp__debriefing__create_share_link` `mcp__debriefing__draft_positioning` `mcp__debriefing__get_delivery_settings` `mcp__debriefing__get_evidence` `mcp__debriefing__get_free_brief_link` `mcp__debriefing__get_public_brief` `mcp__debriefing__get_workspace` `mcp__debriefing__invite_member` `mcp__debriefing__list_competitors` `mcp__debriefing__pin_digest` `mcp__debriefing__pin_signal` `mcp__debriefing__refresh_watchlist` `mcp__debriefing__request_free_brief` `mcp__debriefing__research_competitor` `mcp__debriefing__search_guides` |
| outbound | Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL. | `mcp__debriefing__add_monitored_page` `mcp__debriefing__get_public_brief` `mcp__debriefing__invite_member` |

## Findings

- **warn** Annotations that disagree with the tool in `draft_positioning` ([annotation-conflict](https://anlyon.dev/methodology#annotation-conflict))

```untrusted-server-text
The server marks "draft_positioning" as not read-only (readOnlyHint: false), and its words say it reads.

annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The description's first verb is "read": a word for reading.
```


## Deletes or cancels (14)

Removes, cancels or revokes something. Claude Code: deny.

### `create_share_link`

- The name "create_share_link" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Makes a public link to one signal that anyone with the address can open. A new link replaces the old one, which stops working. The plan sets how long a link can live; the free plan and Starter allow 24 hours. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again.
```

### `generate_battlecard`

- The name "generate_battlecard" says "generate": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Writes or rewrites the battlecard for one core competitor now, instead of at the next cycle. It takes about a minute; read it afterwards with get_battlecard. The competitor needs finished research. Needs a paid plan or the free first week, and counts toward a daily cap per workspace. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again. It starts no second job and uses no allowance or daily cap a second time.
```

### `pin_digest`

- The name "pin_digest" says "pin": a word for a change.
- The server marks it destructive (destructiveHint: true).
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Pins a digest for the whole team, or removes the pin with pinned false.
```

### `pin_signal`

- The name "pin_signal" says "pin": a word for a change.
- The server marks it destructive (destructiveHint: true).
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Pins a signal for the whole team, or removes the pin with pinned false.
```

### `rate_digest`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Scores a digest from 1 to 5, says what is missing from it, or both. A new rating replaces your old one.
```

### `rate_signal`

- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Tells Debriefing whether a signal was useful to you. For not useful, add reasons and a comment. A new rating replaces your old one.
```

### `remove_competitor`

- The name "remove_competitor" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Takes one core competitor off the watchlist. Debriefing stops monitoring it and keeps its history. Admin only, on a paid plan.
```

### `remove_monitored_page`

- The name "remove_monitored_page" says "remove": a word for removing or ending something.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Stops watching a page that someone added on a core competitor. Name it by page_id or url. Admin only, on a paid plan.
```

### `rename_competitor`

- The name "rename_competitor" says "rename": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Changes the display name of one tracked competitor. Admin only.
```

### `save_signal`

- The name "save_signal" says "save": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Saves a signal to your own saved list, or removes it with saved false. Only you see your saved signals.
```

### `set_delivery_channels`

- The name "set_delivery_channels" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Turns delivery by email and to Slack on or off. Slack gets the finished cycle, and also the daily digest and each high signal alert when slack_digest and slack_alerts are on. Only the switches you send change. Slack needs Growth or above and a Slack connection made in the app. Channel rules for Slack are set in the app. Admin only.
```

### `set_monitoring_cadence`

- The name "set_monitoring_cadence" says "set": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Sets how often Debriefing runs a monitoring cycle. The plan decides which cadences are allowed; get_delivery_settings lists them. Admin only, on a paid plan.
```

### `update_company_profile`

- The name "update_company_profile" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Changes fields of the workspace's company profile. Only the fields you send change. The lists replace the old lists. Admin only. Locked while the first brief runs.
```

### `update_icp`

- The name "update_icp" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Sets the ideal customer profile, then re-reads how much each tracked competitor overlaps it. Only the dimensions you send change; an empty list clears one. Admin only. Counts toward a daily cap per workspace. Locked while the first brief runs. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again. It starts no second job and uses no allowance or daily cap a second time.
```

## Can't be undone (1)

Sends, pays, publishes or merges: once done, it cannot be taken back. Claude Code: ask.

### `invite_member`

- The name "invite_member" says "invite": a word for sending, and what is sent cannot be taken back.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.
- Tag outbound: The name "invite_member" says "invite": it sends or publishes something to other people.

Description, as the server wrote it:

```untrusted-server-text
Sends an email invitation to join the workspace as a member. The invitation lasts 7 days. Inviting the same address again sends a fresh email. Admin only, on a paid plan. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again.
```

## Changes things (10)

Creates or changes something that can be changed back. Claude Code: ask.

### `add_battlecard_note`

- The name "add_battlecard_note" says "add": a word for a change.

Description, as the server wrote it:

```untrusted-server-text
Adds what the team knows about a core competitor that no page says. The next rewrite of its battlecard reads the note as framing, never as a verified fact.
```

### `add_competitor`

- The name "add_competitor" says "add": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Adds a competitor to the workspace's core watchlist from its website. Debriefing then monitors it. Admin only. The plan sets how many core competitors fit; get_plan_and_limits shows the free slots.
```

### `add_digest_note`

- The name "add_digest_note" says "add": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Adds a talking point to a digest. The team sees it in the workspace.
```

### `add_monitored_page`

- The name "add_monitored_page" says "add": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.
- Tag outbound: The input takes a URL (input.url): a request to a URL can carry data to whoever runs it.

Description, as the server wrote it:

```untrusted-server-text
Asks Debriefing to watch one more page of a core competitor, such as its pricing page. Changes on it then show up as signals. Up to 10 pages per competitor. Admin only, on a paid plan.
```

### `add_signal_note`

- The name "add_signal_note" says "add": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Adds a talking point to a signal. The team sees it in the workspace. It never appears on a public link unless the link includes notes.
```

### `create_checkout_link`

- The name "create_checkout_link" says "create": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Creates a Stripe Checkout link that buys one Debriefing plan for this workspace. It charges nothing. The admin opens the link in a browser, checks the price, and pays there. Give the link to the person; never complete the payment for them. The link expires after 24 hours. Admin only. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again.
```

### `draft_positioning`

- The description's first verb is "read": a word for reading.
- The server marks it as not read-only (readOnlyHint: false).
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data. The description's first sentence says "read" and "website": it reads web pages, which anyone can write.
- Findings: warn annotation-conflict

Description, as the server wrote it:

```untrusted-server-text
Reads the company's own website and drafts the empty positioning fields: value propositions, differentiators, and exclusions. Filled fields stay as they are. Read the result later with get_company_profile. Admin only. Counts toward a daily cap per workspace. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again. It starts no second job and uses no allowance or daily cap a second time.
```

### `refresh_watchlist`

- Nothing in its name or description says what it does, so it is counted as a write.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Refreshes the research on the core watchlist now, instead of at the next cycle. It uses one update from the weekly research allowance. Admin only. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again. It starts no second job and uses no allowance or daily cap a second time.
```

### `request_free_brief`

- The name "request_free_brief" says "request": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Requests a free competitive brief for a person who has no Debriefing account, and returns a claim URL. Debriefing researches the company and the competitors, and emails the brief to the person. The person opens the claim URL and signs up once, with the same email, to get a workspace that holds the brief. Ask the person first: send person_consented true only after they agree. One email address gets one brief this way; a repeat returns the same claim URL.
```

### `research_competitor`

- The description's first verb is "start": a word for a change.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Starts the first research on one core competitor that has none yet: Debriefing reads its site and outside sources. It uses one update from the weekly research allowance. Admin only. Send an idempotency_key. A retry with the same idempotency_key returns the first answer and does not act again. It starts no second job and uses no allowance or daily cap a second time.
```

## Only reads (18)

Looks things up and changes nothing. Claude Code: allow.

### `get_battlecard`

- The name "get_battlecard" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Gets one battlecard by competitor_id or battlecard_id. Use it when the user prepares a sales call against a competitor.
```

### `get_company_profile`

- The name "get_company_profile" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Gets the workspace's own company profile: description, category, target customer, positioning lists, and the ideal customer profile. Debriefing reads every competitor move against it.
```

### `get_competitor`

- The name "get_competitor" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Gets the dossier for one tracked competitor: company facts, the risk and opportunity it poses to this workspace, and the stored reads on positioning, product, pricing, funding, traffic, and more. Use it when the user asks about one competitor in depth.
```

### `get_delivery_settings`

- The name "get_delivery_settings" says "get": a word for reading.
- Tag untrusted-input: The description's first sentence says "get" and "post": it reads posts, which other people can write.

Description, as the server wrote it:

```untrusted-server-text
Gets how often Debriefing runs a monitoring cycle for the workspace, the cadences the plan allows, and where Debriefing sends its posts. Email and Slack each get the finished cycle. Slack also gets the daily digest and each high signal alert when those switches are on. Admin only.
```

### `get_digest`

- The name "get_digest" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Gets one digest by id or slug, or the newest digest when no id is given. Pass type daily_digest for the newest daily digest. Use it when the user asks for the latest brief.
```

### `get_evidence`

- The name "get_evidence" says "get": a word for reading.
- Tag untrusted-input: The description's first sentence says "get" and "url": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Gets the evidence behind one signal: each source excerpt with its URL and date. Use it when the user asks where a claim comes from.
```

### `get_free_brief_link`

- The name "get_free_brief_link" says "get": a word for reading.
- Tag untrusted-input: The server marks it openWorldHint: true: it reaches things outside the server's own data.

Description, as the server wrote it:

```untrusted-server-text
Gets the debriefing.io links where a person requests a free competitive brief about their own company and competitors, signs up for a workspace, or compares plans. It only returns links. It sends nothing and creates nothing. One email address may request 3 free briefs in 24 hours. Send the person's email, with their consent, to check that limit before you give them the link.
```

### `get_plan_and_limits`

- The name "get_plan_and_limits" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Gets the workspace plan and every limit an agent runs into: competitor slots, the weekly research allowance, the daily caps on battlecards, ICP refreshes and positioning drafts, share link lifetimes, monitoring cadences, and which features need a paid plan. Includes the pricing link.
```

### `get_public_brief`

- The name "get_public_brief" says "get": a word for reading.
- Tag untrusted-input: The input takes a URL (input.url), and the tool reads it: it reads web pages, which anyone can write.
- Tag outbound: The input takes a URL (input.url): a request to a URL can carry data to whoever runs it.
- Claude Code: ask, because it is tagged outbound.

Description, as the server wrote it:

```untrusted-server-text
Gets one competitive brief that Debriefing published on debriefing.io: the summary, each finding with its category and date, and the numbered public sources with their URLs. Name the brief by its URL, or by company_slug and slug from search_public_briefs. With company_slug only, gets the newest brief about that company. Needs no Debriefing account.
```

### `get_workspace`

- The name "get_workspace" says "get": a word for reading.
- Tag untrusted-input: The description's first sentence says "get" and "website": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Gets the Debriefing workspace this connection works on: its name and website, who you are in it and your role, the scopes this connection holds, and the plan. Call it first when you are not sure what you may do.
```

### `list_battlecards`

- The name "list_battlecards" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Lists the battlecards Debriefing wrote for this workspace, one for each competitor that has one. A battlecard holds talk tracks for sales calls against that competitor.
```

### `list_competitors`

- The name "list_competitors" says "list": a word for reading.
- Tag untrusted-input: The description's first sentence says "list" and "website": it reads web pages, which anyone can write.

Description, as the server wrote it:

```untrusted-server-text
Lists the competitors this Debriefing workspace tracks, with the id, name, website, and category of each. Call it first to get the competitor_id that other tools take.
```

### `list_digests`

- The name "list_digests" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Lists the digests Debriefing wrote for this workspace, newest first. A digest is a brief that sums up competitor moves over a period. Filter by type, such as daily_digest.
```

### `list_members`

- The name "list_members" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Lists the people in the workspace with their roles. An admin also sees pending invitations.
```

### `search_guides`

- The name "search_guides" says "search": a word for reading.
- Tag untrusted-input: The description's first sentence says "search" and "post": it reads posts, which other people can write.

Description, as the server wrote it:

```untrusted-server-text
Searches the public competitive intelligence library on debriefing.io: how-to guides, glossary terms, tool comparisons, alternatives pages, company profiles, and market intel posts. Returns the title, a short excerpt, and the page URL of each match, best match first. Needs no Debriefing account.
```

### `search_public_briefs`

- The name "search_public_briefs" says "search": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Searches the competitive briefs Debriefing publishes on debriefing.io about named companies, newest first. Each brief is dated and every finding cites a public source. Filter by words in the brief and by company name, slug, or domain. With no arguments, lists the newest briefs. Needs no Debriefing account. Returns the page URL of each brief.
```

### `search_signals`

- The name "search_signals" says "search": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Searches open signals, newest first. A signal is a competitor move that Debriefing found, such as a price change or a launch, with the source evidence. Filter by competitor_id, severity (low, medium, high), a text query, or a since time. Use it when the user asks what a competitor changed.
```

### `what_changed`

- The description's first verb is "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Lists everything new in the workspace since a time: signals Debriefing found, digests it wrote, and battlecards it wrote or rewrote. Use it to catch up, such as since the user's last visit.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `debriefing`:

```json
{
  "permissions": {
    "allow": [
      "mcp__debriefing__get_workspace",
      "mcp__debriefing__get_plan_and_limits",
      "mcp__debriefing__list_competitors",
      "mcp__debriefing__get_competitor",
      "mcp__debriefing__search_signals",
      "mcp__debriefing__list_digests",
      "mcp__debriefing__get_digest",
      "mcp__debriefing__list_battlecards",
      "mcp__debriefing__get_battlecard",
      "mcp__debriefing__get_evidence",
      "mcp__debriefing__get_company_profile",
      "mcp__debriefing__get_delivery_settings",
      "mcp__debriefing__list_members",
      "mcp__debriefing__what_changed",
      "mcp__debriefing__search_public_briefs",
      "mcp__debriefing__search_guides",
      "mcp__debriefing__get_free_brief_link"
    ],
    "ask": [
      "mcp__debriefing__create_checkout_link",
      "mcp__debriefing__add_competitor",
      "mcp__debriefing__add_monitored_page",
      "mcp__debriefing__research_competitor",
      "mcp__debriefing__refresh_watchlist",
      "mcp__debriefing__add_signal_note",
      "mcp__debriefing__add_digest_note",
      "mcp__debriefing__add_battlecard_note",
      "mcp__debriefing__draft_positioning",
      "mcp__debriefing__invite_member",
      "mcp__debriefing__get_public_brief",
      "mcp__debriefing__request_free_brief"
    ],
    "deny": [
      "mcp__debriefing__rename_competitor",
      "mcp__debriefing__remove_competitor",
      "mcp__debriefing__remove_monitored_page",
      "mcp__debriefing__pin_signal",
      "mcp__debriefing__save_signal",
      "mcp__debriefing__rate_signal",
      "mcp__debriefing__pin_digest",
      "mcp__debriefing__rate_digest",
      "mcp__debriefing__generate_battlecard",
      "mcp__debriefing__update_company_profile",
      "mcp__debriefing__update_icp",
      "mcp__debriefing__set_monitoring_cadence",
      "mcp__debriefing__set_delivery_channels",
      "mcp__debriefing__create_share_link"
    ]
  }
}
```

Capability tags behind the rules (a read tagged outbound is asked about):

- `mcp__debriefing__get_workspace`: untrusted-input
- `mcp__debriefing__create_checkout_link`: untrusted-input
- `mcp__debriefing__list_competitors`: untrusted-input
- `mcp__debriefing__get_evidence`: untrusted-input
- `mcp__debriefing__add_competitor`: untrusted-input
- `mcp__debriefing__add_monitored_page`: untrusted-input, outbound
- `mcp__debriefing__research_competitor`: untrusted-input
- `mcp__debriefing__refresh_watchlist`: untrusted-input
- `mcp__debriefing__pin_signal`: untrusted-input
- `mcp__debriefing__add_signal_note`: untrusted-input
- `mcp__debriefing__pin_digest`: untrusted-input
- `mcp__debriefing__add_digest_note`: untrusted-input
- `mcp__debriefing__draft_positioning`: untrusted-input
- `mcp__debriefing__get_delivery_settings`: untrusted-input
- `mcp__debriefing__create_share_link`: untrusted-input
- `mcp__debriefing__invite_member`: untrusted-input, outbound
- `mcp__debriefing__get_public_brief`: untrusted-input, outbound
- `mcp__debriefing__search_guides`: untrusted-input
- `mcp__debriefing__get_free_brief_link`: untrusted-input
- `mcp__debriefing__request_free_brief`: untrusted-input

## Remote posture

What an anonymous client saw at the remote endpoint, last 2026-10-22T14:49:46.024Z, unchanged since 2026-10-22T14:49:46.024Z. No credentials were sent and no tool was called. Values are shown as the endpoint returned them. Method: https://anlyon.dev/methodology#remote-posture

| Fact | Observed |
| --- | --- |
| Reachable | `yes` |
| HTTP status of an anonymous initialize | `200` |
| tools/list served without credentials | `yes` |
| Tools that change things, listed without credentials | `25` |
| Protocol version | `2025-06-18` |
| WWW-Authenticate on 401 | `not observed` |
| resource_metadata in WWW-Authenticate | `none` |
| RFC 9728 protected resource metadata | `https://debriefing.io/.well-known/oauth-protected-resource/mcp` |
| Authorization servers | `https://debriefing.io` |
| Legacy HTTP+SSE transport | `no` |
| Dynamic client registration | `yes` |
| Client ID metadata documents | `yes` |

- **high** Tools that change things, listed to anyone ([unauth-remote-writes](https://anlyon.dev/methodology#unauth-remote-writes))

```untrusted-server-text
The endpoint served tools/list without credentials, and the list has 25 tools that change things (14 destructive, 1 irreversible, 10 write). Whether a call also works without credentials was not tested: tools are never called.

https://debriefing.io/mcp: tools/list returned 43 tools to an anonymous client, including rename_competitor (destructive), remove_competitor (destructive), remove_monitored_page (destructive), pin_signal (destructive), save_signal (destructive) and 20 more
```
