Memberful MCP by usefulapi
Manage Memberful members, subscriptions, plans, passes and coupons via the GraphQL API.
Should I use this
Quality & Safety
Findings (2)
- LOWin memberful_change_subscription_expiration
- LOWin memberful_change_subscription_expiration
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"memberful": {
"url": "https://memberful.usefulapi.io/mcp"
}
}
}Remote endpoints
https://memberful.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (12)
🟢memberful_get_member(id)
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).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The member id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberful_list_members(first, after, last, before, activeOnly)
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.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "Max members to return, from the start (page size).",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"after": {
"description": "Cursor for the next page (the `cursor` of the last edge from a prior call).",
"type": "string"
},
"last": {
"description": "Max members to return, from the end.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"before": {
"description": "Cursor for the previous page.",
"type": "string"
},
"activeOnly": {
"description": "Only return members with an ACTIVE membership state.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberful_get_subscription(id)
Fetch one subscription by id: status, activated/expires/trial timestamps, plan, member, orders, coupon. Memberful GraphQL: subscription(id).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The subscription id."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberful_list_subscriptions(first, after, last, before)
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.
Input Schema
{
"type": "object",
"properties": {
"first": {
"description": "Max subscriptions to return, from the start (page size).",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"after": {
"description": "Cursor for the next page (the `cursor` of the last edge from a prior call).",
"type": "string"
},
"last": {
"description": "Max subscriptions to return, from the end.",
"type": "integer",
"minimum": 1,
"maximum": 1000
},
"before": {
"description": "Cursor for the previous page.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberful_list_plans
List all plans (Memberful dashboard 'Prices'): name, interval, price (cents), for-sale flag, plan group. Memberful GraphQL: plans.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberful_list_passes
List all passes (Memberful dashboard 'Plans' — the access groups a member subscribes to): id, name. Memberful GraphQL: passes.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberful_query(query, variables)
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).
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "A GraphQL query document (must be a query, not a mutation)."
},
"variables": {
"description": "Variables object for the query.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberful_create_member(email, fullName)
MUTATES Memberful data: create a new member with an email (and optional full name). Memberful GraphQL: memberCreate(email, fullName).
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "The new member's email (required)."
},
"fullName": {
"description": "The new member's full name.",
"type": "string"
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberful_update_member(id, metadata)
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).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The member id (required)."
},
"metadata": {
"description": "Metadata as a JSON string (max 50 keys, 40-char keys, 500-char values).",
"type": "string"
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberful_change_subscription_expiration(id, expiresAt)
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).
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The subscription id (required)."
},
"expiresAt": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "New expiration as a Unix timestamp in SECONDS (Int, required)."
}
},
"required": [
"id",
"expiresAt"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberful_create_coupons(codes, discountId)
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).
Input Schema
{
"type": "object",
"properties": {
"codes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
},
"description": "Coupon code strings to create (at least one, required)."
},
"discountId": {
"description": "The discount id to attach the coupons to.",
"type": "string"
}
},
"required": [
"codes"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberful_graphql(query, variables)
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.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "A GraphQL query or mutation document."
},
"variables": {
"description": "Variables object for the operation.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence