# `io.usefulapi/memberful` 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.usefulapi/memberful
- JSON: https://anlyon.dev/api/v1/servers/io.usefulapi/memberful
- Version: 1.16.3 (active)
- Publisher: io.usefulapi (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Repository: https://github.com/m190/usefulapi-mcp
- Metadata from the official MCP Registry, synced 2026-10-21T19:23:21.685Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Memberful MCP by usefulapi
Manage Memberful members, subscriptions, plans, passes and coupons via the GraphQL API.
```

Scanned 2026-10-21T19:40:52.973Z over streamable-http.

**12 tools: 5 can delete or cancel things and 7 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 5 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 0 | ask |
| Only reads | read | 7 | allow |

## Findings

No check matched anything in these tool definitions.


## Deletes or cancels (5)

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

### `change_subscription_expiration`

- 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
MUTATES Memberful data: change WHEN a subscription expires (extend or shorten access). expiresAt is a Unix timestamp in SECONDS (Int). Memberful GraphQL: subscriptionChangeExpirationTime(id, expiresAt).
```

### `create_coupons`

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

Description, as the server wrote it:

```untrusted-server-text
MUTATES Memberful data: create one or more coupon codes for a discount. Provide the discount id (discountId) and the coupon code strings. Memberful GraphQL: createCoupons(discountId, coupons).
```

### `create_member`

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

Description, as the server wrote it:

```untrusted-server-text
MUTATES Memberful data: create a new member with an email (and optional full name). Memberful GraphQL: memberCreate(email, fullName).
```

### `memberful_graphql`

- 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
MUTATES Memberful data (potentially): escape hatch to run an arbitrary Memberful GraphQL operation — including any mutation — against your account's /api/graphql endpoint with optional variables. Prefer memberful_query for read-only calls.
```

### `update_member`

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

Description, as the server wrote it:

```untrusted-server-text
MUTATES Memberful data: update a member's metadata (a JSON string; max 50 keys, 40-char keys, 500-char values). Only metadata is supported here; for other inline member fields use memberful_graphql. Memberful GraphQL: memberUpdate(id, metadata).
```

## Only reads (7)

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

### `get_member`

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

Description, as the server wrote it:

```untrusted-server-text
Fetch one Memberful member by id: profile, Stripe customer id, unrestricted-access flag, total spend, metadata, address, and their subscriptions (each with plan). Memberful GraphQL: member(id).
```

### `get_subscription`

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

Description, as the server wrote it:

```untrusted-server-text
Fetch one subscription by id: status, activated/expires/trial timestamps, plan, member, orders, coupon. Memberful GraphQL: subscription(id).
```

### `list_members`

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

Description, as the server wrote it:

```untrusted-server-text
List members (Relay connection): each edge has a cursor + node (profile, Stripe customer id, unrestricted-access flag, total spend, and their subscriptions). Paginate with `first` + `after` (pass the last edge's `cursor`); `first` defaults to 50. Set `activeOnly` to return only members with an ACTIVE membership state. For member-state filters beyond active, use memberful_query. Memberful GraphQL: members connection.
```

### `list_passes`

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

Description, as the server wrote it:

```untrusted-server-text
List all passes (Memberful dashboard 'Plans' — the access groups a member subscribes to): id, name. Memberful GraphQL: passes.
```

### `list_plans`

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

Description, as the server wrote it:

```untrusted-server-text
List all plans (Memberful dashboard 'Prices'): name, interval, price (cents), for-sale flag, plan group. Memberful GraphQL: plans.
```

### `list_subscriptions`

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

Description, as the server wrote it:

```untrusted-server-text
List subscriptions (Relay connection): each edge has a cursor + node (status, expires/created timestamps, plan, member). Paginate with `first` + `after` (pass the last edge's `cursor`); `first` defaults to 50. NOTE: this uses the top-level `subscriptions` connection, which is sourced from the community SDK — validate against a live account. Memberful GraphQL: subscriptions connection.
```

### `memberful_query`

- The name "memberful_query" says "query": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Escape hatch: run an arbitrary Memberful GraphQL QUERY (read-only) against your account's /api/graphql endpoint with optional variables. Mutations are REJECTED — use the dedicated write tools or memberful_graphql for those. Useful for fields not covered by the curated read tools (e.g. member-state filters beyond active).
```

## Claude Code permissions

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

```json
{
  "permissions": {
    "allow": [
      "mcp__memberful__get_member",
      "mcp__memberful__list_members",
      "mcp__memberful__get_subscription",
      "mcp__memberful__list_subscriptions",
      "mcp__memberful__list_plans",
      "mcp__memberful__list_passes",
      "mcp__memberful__memberful_query"
    ],
    "ask": [],
    "deny": [
      "mcp__memberful__create_member",
      "mcp__memberful__update_member",
      "mcp__memberful__change_subscription_expiration",
      "mcp__memberful__create_coupons",
      "mcp__memberful__memberful_graphql"
    ]
  }
}
```
