# io.usefulapi/castle (remote · castle.usefulapi.io)

Investigate security events and manage the allow/deny lists an analyst acts on.

- Trust score: 33/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-04

## Components

- remote · `castle.usefulapi.io`: 33/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-castle/castle.md), [page](https://verifymcp.io/servers/io-usefulapi-castle/castle)

## Channel facts

- Endpoint: `https://castle.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-04.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to connect, but we couldn't read the whole tool list to see what that exposes.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 0/100
  - Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Tool Safety**: 0/100
  - Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Capabilities**: 0/100
  - Capabilities not yet verified: we couldn't read the endpoint's capabilities.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

### How do I install the io.usefulapi/castle MCP server?

io.usefulapi/castle is a hosted endpoint at https://castle.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http io-usefulapi-castle 'https://castle.usefulapi.io/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-castle": {
      "url": "https://castle.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-usefulapi-castle": {
      "type": "http",
      "url": "https://castle.usefulapi.io/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-usefulapi-castle]
url = "https://castle.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-castle": {
      "type": "remote",
      "url": "https://castle.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-castle --url 'https://castle.usefulapi.io/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-castle:
    url: "https://castle.usefulapi.io/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-castle": {
      "Transport": "http",
      "Url": "https://castle.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-castle -t streamable-http -u 'https://castle.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-castle": {
      "type": "http",
      "url": "https://castle.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-04 (score 33, +15)

- [security improvement] HTTPS: unverified → pass
- [security improvement] Transport: fail → pass
- [security] Authorization: Authorisation not fully verified: no authorisation is required to connect, but we couldn't read the whole tool list to see what that exposes.

### 2026-10-01 (score 18, −54)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [security regression] Tool safety: pass → unverified
- [security regression] Authorization: pass → unverified
- [security regression] Transport: pass → fail
- [functional regression] Capabilities: fail → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-09-30 (score 72, +54)

- [security improvement] Transport: unverified → pass
- [security improvement] Authorization: unverified → pass
- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] First check of Authorization: partial
- [functional regression] MCP protocol: unverified → fail
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100

### 2026-09-29 (score 18)

First indexed and scored.

## MCP tools (14)

### `castle_get_events_schema` (~47 tokens)

Get the event schema

List the event fields you can filter and group on, with their types. Read this first — the other query tools need real field names. Castle: GET /v1/events/schema.

### `castle_search_events` (~258 tokens)

Search security events

Query the security event stream — logins, registrations, transactions and their risk verdicts. Read-only despite being a POST: Castle takes the query in the body. Castle: POST /v1/events/query.

Input parameters:

- `columns` (array): Only return these event fields.
- `filters` (array, required): Castle query filters, ANDed together. Each is {field, op, value} — e.g. {"field":"user.email","op":"$eq","value":"a@example.com"}. Operators: $eq, $neq, $in, $nin, $like, $nlike, $contains, $ncontain…
- `page` (integer): 1-based page number.
- `query_type` (string): Return matching records, just a count, or both. Defaults to records.
- `results_size` (integer): Results per page, 1-100.

### `castle_group_events` (~253 tokens)

Group security events

Aggregate matching events by one or more fields — the fast way to see which IPs, devices or countries dominate a spike. Read-only despite being a POST. Castle: POST /v1/events/group.

Input parameters:

- `filters` (array, required): Castle query filters, ANDed together. Each is {field, op, value} — e.g. {"field":"user.email","op":"$eq","value":"a@example.com"}. Operators: $eq, $neq, $in, $nin, $like, $nlike, $contains, $ncontain…
- `group_by_fields` (array, required): Fields to group by, e.g. ["ip", "user.email"]. Names come from the event schema.
- `page` (integer): 1-based page number.
- `results_size` (integer): Results per page, 1-100.

### `castle_search_lists` (~85 tokens)

Search lists

Find the allow/deny lists defined in the environment. Read-only despite being a POST. Castle: POST /v1/lists/query.

Input parameters:

- `filters` (array): Optional {field, op, value} filters over the lists themselves.
- `page` (integer): 1-based page number.
- `results_size` (integer): Results per page, 1-100.

### `castle_get_list` (~44 tokens)

Get one list

Fetch a single list with its primary and secondary field definitions. Castle: GET /v1/lists/{id}.

Input parameters:

- `list_id` (string, required): The list's id.

### `castle_search_list_items` (~110 tokens)

Search items in a list

Search the entries of one list — the blocked IPs, emails or device ids it holds. Read-only despite being a POST. Castle: POST /v1/lists/{list_id}/items/query.

Input parameters:

- `filters` (array): Optional {field, op, value} filters over the items.
- `list_id` (string, required): The list to search.
- `page` (integer): 1-based page number.
- `results_size` (integer): Results per page, 1-100.

### `castle_count_list_items` (~79 tokens)

Count items in a list

Count the entries in one list, with the same optional filters as the search. Read-only despite being a POST. Castle: POST /v1/lists/{list_id}/items/count.

Input parameters:

- `filters` (array): Optional {field, op, value} filters over the items.
- `list_id` (string, required): The list to count.

### `castle_get_list_item` (~70 tokens)

Get one list item

Fetch a single list entry — its value, who added it, the comment and its archive time. Castle: GET /v1/lists/{list_id}/items/{id}.

Input parameters:

- `item_id` (string, required): The item's id.
- `list_id` (string, required): The list holding the item.

### `castle_create_list` (~130 tokens)

Create a list

Create a new allow or deny list. primary_field is the event field its entries match on, e.g. ip or user.email. Castle: POST /v1/lists.

Input parameters:

- `color` (string, required): Dashboard colour label, e.g. $red, $green, $blue — Castle requires one.
- `description` (string): What this list is for.
- `name` (string, required): The list name.
- `primary_field` (string, required): The event field entries match on, e.g. ip or user.email.
- `secondary_field` (string): An optional second field entries also carry.

### `castle_update_list` (~70 tokens)

Update a list

Rename a list or change its colour or description. Castle: PUT /v1/lists/{id}.

Input parameters:

- `color` (string): New colour label.
- `description` (string): New description.
- `list_id` (string, required): The list to update.
- `name` (string): New name.

### `castle_create_list_item` (~162 tokens)

Add an item to a list

Add an entry to a list — for example block an IP or an email. This changes live policy behaviour. Castle: POST /v1/lists/{list_id}/items.

Input parameters:

- `author_identifier` (string, required): Who is adding it, e.g. the analyst's email address.
- `author_type` (string, required): What kind of actor is adding this entry.
- `auto_archives_at` (string): ISO-8601 time to archive the entry automatically.
- `comment` (string): Why this entry was added.
- `list_id` (string, required): The list to add to.
- `primary_value` (string, required): The value to add, matching the list's primary_field.
- `secondary_value` (string): Value for the list's secondary_field.

### `castle_update_list_item` (~69 tokens)

Update a list item's comment

Change the comment on a list entry. Castle: PUT /v1/lists/{list_id}/items/{id}.

Input parameters:

- `comment` (string, required): The new comment.
- `item_id` (string, required): The item to update.
- `list_id` (string, required): The list holding the item.

### `castle_archive_list_item` (~71 tokens)

Archive a list item

Archive a list entry so it stops matching. Reversible with castle_unarchive_list_item. Castle: DELETE /v1/lists/{list_id}/items/{id}/archive.

Input parameters:

- `item_id` (string, required): The item to archive.
- `list_id` (string, required): The list holding the item.

### `castle_unarchive_list_item` (~66 tokens)

Unarchive a list item

Restore a previously archived list entry so it matches again. Castle: PUT /v1/lists/{list_id}/items/{id}/unarchive.

Input parameters:

- `item_id` (string, required): The item to restore.
- `list_id` (string, required): The list holding the item.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-castle/castle#diagnostics

## Score history

- 2026-10-04: 33
- 2026-10-03: 18
- 2026-10-02: 18
- 2026-10-01: 18
- 2026-09-30: 72
- 2026-09-29: 18

## Common questions

### What is the io.usefulapi/castle MCP server?

io.usefulapi/castle is an MCP server listed in the public MCP registry as io.usefulapi/castle. Investigate security events and manage the allow/deny lists an analyst acts on. This page covers its hosted endpoint (https://castle.usefulapi.io/mcp).

### Is the io.usefulapi/castle MCP server safe to use?

io.usefulapi/castle scores 33 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.usefulapi/castle MCP server expose?

io.usefulapi/castle exposes 14 tools: castle_get_events_schema, castle_search_events, castle_group_events, castle_search_lists, castle_get_list, and 9 more. Their descriptions and schemas cost roughly 1,514 tokens of context every time the server is loaded.

### Does the io.usefulapi/castle MCP server require authentication?

No. We connected to io.usefulapi/castle without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the io.usefulapi/castle MCP server still maintained?

io.usefulapi/castle is still listed as active in the MCP registry. We last reached this channel on 4 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://castle.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-castle/castle.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-castle/castle.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-castle/castle
