MemberRun MCP by usefulapi
Manage members, events and registrations; read invoices, resources and chapters in MemberRun.
Should I use this
Quality & Safety
Findings (5)
- LOWin memberrun_register_member_for_event
- LOWin memberrun_list_event_registrations
- LOWin memberrun_get_event_registration
- LOWin memberrun_register_member_for_event
- LOWin memberrun_cancel_event_registration
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": {
"memberrun": {
"url": "https://memberrun.usefulapi.io/mcp"
}
}
}Remote endpoints
https://memberrun.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (21)
🟢memberrun_get_account
Show the association this key belongs to, its name and the key's scopes. Good first call to confirm the connection. API: GET /me.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_list_members(status, role, email, limit, starting_after)
List the association's members, filtered by status, role or email. Returns a page with has_more and next_cursor. API: GET /members.
Input Schema
{
"type": "object",
"properties": {
"status": {
"description": "Only members with this status.",
"type": "string",
"enum": [
"active",
"suspended",
"pending",
"expired"
]
},
"role": {
"description": "Only this role.",
"type": "string",
"enum": [
"member",
"staff"
]
},
"email": {
"description": "Only this email (not case sensitive).",
"type": "string"
},
"limit": {
"description": "Objects per page (1-100, default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"starting_after": {
"description": "Cursor: the id of the last object on the previous page (next_cursor).",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_get_member(member_id)
Get one member by id, with status, role, expiry and profile. API: GET /members/{id}.
Input Schema
{
"type": "object",
"properties": {
"member_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_list_events(status, start_after, start_before, limit, starting_after)
List events (conferences, webinars, workshops and so on), filtered by status and start date. API: GET /events.
Input Schema
{
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"draft",
"published",
"cancelled",
"completed"
]
},
"start_after": {
"description": "Only events starting after this date.",
"type": "string"
},
"start_before": {
"description": "Only events starting before this date.",
"type": "string"
},
"limit": {
"description": "Objects per page (1-100, default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"starting_after": {
"description": "Cursor: the id of the last object on the previous page (next_cursor).",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_get_event(event_id)
Get one event by id, with dates, location, capacity, prices and status. API: GET /events/{id}.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"event_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_list_event_registrations(event_id, member_id, status, limit, starting_after)
List registrations, filtered by event, member or status (registered, waitlisted, attended, cancelled). API: GET /event_registrations.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"description": "Only registrations for this event id.",
"type": "string"
},
"member_id": {
"description": "Only registrations for this member id.",
"type": "string"
},
"status": {
"type": "string",
"enum": [
"registered",
"waitlisted",
"attended",
"cancelled"
]
},
"limit": {
"description": "Objects per page (1-100, default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"starting_after": {
"description": "Cursor: the id of the last object on the previous page (next_cursor).",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_get_event_registration(registration_id)
Get one registration by id, with its status, payment status and attendance time. API: GET /event_registrations/{id}.
Input Schema
{
"type": "object",
"properties": {
"registration_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"registration_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_list_invoices(status, member_id, household_id, limit, starting_after)
List invoices (read only), filtered by status, member or household. Refunds and new invoices are not possible here. API: GET /invoices.
Input Schema
{
"type": "object",
"properties": {
"status": {
"description": "Only invoices with this status.",
"type": "string"
},
"member_id": {
"description": "Only invoices for this member id.",
"type": "string"
},
"household_id": {
"description": "Only invoices for this household id.",
"type": "string"
},
"limit": {
"description": "Objects per page (1-100, default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"starting_after": {
"description": "Cursor: the id of the last object on the previous page (next_cursor).",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_get_invoice(invoice_id)
Get one invoice by id, with amount, currency, due date and paid date. API: GET /invoices/{id}.
Input Schema
{
"type": "object",
"properties": {
"invoice_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_list_resources(status, type, limit, starting_after)
List library resources (courses, webinars, articles, templates, guides, toolkits), filtered by status or type. Read only. API: GET /resources.
Input Schema
{
"type": "object",
"properties": {
"status": {
"type": "string"
},
"type": {
"type": "string"
},
"limit": {
"description": "Objects per page (1-100, default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"starting_after": {
"description": "Cursor: the id of the last object on the previous page (next_cursor).",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_get_resource(resource_id)
Get one library resource by id. Read only. API: GET /resources/{id}.
Input Schema
{
"type": "object",
"properties": {
"resource_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"resource_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_list_chapters(is_active, limit, starting_after)
List the association's regional or topic chapters, optionally only active ones. Read only. API: GET /chapters.
Input Schema
{
"type": "object",
"properties": {
"is_active": {
"description": "true = only active chapters.",
"type": "boolean"
},
"limit": {
"description": "Objects per page (1-100, default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"starting_after": {
"description": "Cursor: the id of the last object on the previous page (next_cursor).",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢memberrun_get_chapter(chapter_id)
Get one chapter by id, with name, region and active flag. Read only. API: GET /chapters/{id}.
Input Schema
{
"type": "object",
"properties": {
"chapter_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"chapter_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_create_member(email, name, role, status, expires_at, ...)
Create a membership for an email address and change real records. If the person already has a membership here, the API returns 400. API: POST /members.
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Email address of the member."
},
"name": {
"description": "Full name.",
"type": "string"
},
"role": {
"description": "Membership role. The API never grants admin access.",
"type": "string",
"enum": [
"member",
"staff"
]
},
"status": {
"description": "active, suspended, pending or expired.",
"type": "string",
"enum": [
"active",
"suspended",
"pending",
"expired"
]
},
"expires_at": {
"description": "Membership expiry, ISO 8601.",
"type": "string"
},
"profile": {
"description": "Profile fields (title, company, location, designation, bio, phone, linkedin_url, specializations).",
"type": "object",
"properties": {
"title": {
"type": "string"
},
"company": {
"type": "string"
},
"location": {
"type": "string"
},
"designation": {
"type": "string"
},
"bio": {
"type": "string"
},
"phone": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"specializations": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"idempotency_key": {
"description": "Optional. Reuse the same key only to retry the same create; the API then returns the first answer.",
"type": "string",
"maxLength": 255
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_update_member(member_id, name, role, status, expires_at, ...)
Change a member's name, role, status, expiry or profile. Only the fields you send change. Set status to expired to archive. API: PATCH /members/{id}.
Input Schema
{
"type": "object",
"properties": {
"member_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
},
"name": {
"description": "Full name.",
"type": "string"
},
"role": {
"description": "Membership role. The API never grants admin access.",
"type": "string",
"enum": [
"member",
"staff"
]
},
"status": {
"description": "active, suspended, pending or expired.",
"type": "string",
"enum": [
"active",
"suspended",
"pending",
"expired"
]
},
"expires_at": {
"description": "Membership expiry, ISO 8601.",
"type": "string"
},
"profile": {
"description": "Profile fields (title, company, location, designation, bio, phone, linkedin_url, specializations).",
"type": "object",
"properties": {
"title": {
"type": "string"
},
"company": {
"type": "string"
},
"location": {
"type": "string"
},
"designation": {
"type": "string"
},
"bio": {
"type": "string"
},
"phone": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"specializations": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_suspend_member(member_id)
Suspend a member (soft delete: the status becomes suspended and nothing is erased). Members with admin access cannot be changed through the API. API: DELETE /members/{id}.
Input Schema
{
"type": "object",
"properties": {
"member_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_create_event(title, type, start_at, end_at, location, ...)
Create an event with a title, type, start time and optional prices and capacity. Prices are whole cents. Creates a real record. API: POST /events.
Input Schema
{
"type": "object",
"properties": {
"title": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"conference",
"webinar",
"workshop",
"networking",
"agm",
"general"
],
"description": "conference, webinar, workshop, networking, agm or general."
},
"start_at": {
"type": "string",
"description": "Start, ISO 8601 (for example 2027-09-15T13:00:00Z)."
},
"end_at": {
"description": "End, ISO 8601.",
"type": "string"
},
"location": {
"type": "string"
},
"virtual_url": {
"type": "string"
},
"description": {
"type": "string"
},
"image_url": {
"type": "string"
},
"max_capacity": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"cpd_credits": {
"type": "number",
"minimum": 0
},
"member_price_cents": {
"description": "Member price in whole cents (49900 = 499.00).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"non_member_price_cents": {
"description": "Non-member price in whole cents.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"registration_deadline": {
"type": "string"
},
"slug": {
"type": "string"
},
"is_public": {
"type": "boolean"
},
"allow_non_member_registration": {
"type": "boolean"
},
"registration_mode": {
"type": "string"
},
"chapter_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"draft",
"published",
"cancelled",
"completed"
]
},
"idempotency_key": {
"description": "Optional. Reuse the same key only to retry the same create; the API then returns the first answer.",
"type": "string",
"maxLength": 255
}
},
"required": [
"title",
"type",
"start_at"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_update_event(event_id, title, type, start_at, end_at, ...)
Change an event's fields or status. Only the fields you send change. To cancel, prefer memberrun_cancel_event. API: PATCH /events/{id}.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
},
"title": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"conference",
"webinar",
"workshop",
"networking",
"agm",
"general"
]
},
"start_at": {
"description": "Start, ISO 8601.",
"type": "string"
},
"end_at": {
"description": "End, ISO 8601.",
"type": "string"
},
"location": {
"type": "string"
},
"virtual_url": {
"type": "string"
},
"description": {
"type": "string"
},
"image_url": {
"type": "string"
},
"max_capacity": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"cpd_credits": {
"type": "number",
"minimum": 0
},
"member_price_cents": {
"description": "Member price in whole cents (49900 = 499.00).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"non_member_price_cents": {
"description": "Non-member price in whole cents.",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"registration_deadline": {
"type": "string"
},
"slug": {
"type": "string"
},
"is_public": {
"type": "boolean"
},
"allow_non_member_registration": {
"type": "boolean"
},
"registration_mode": {
"type": "string"
},
"chapter_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"draft",
"published",
"cancelled",
"completed"
]
}
},
"required": [
"event_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_cancel_event(event_id)
Cancel an event (soft: the status becomes cancelled). This emails everyone registered and removes a linked Zoom meeting where it can. API: DELETE /events/{id}.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"event_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_register_member_for_event(event_id, member_id, status, dietary_restrictions, accessibility_needs, ...)
Register an existing member for an event. The API cannot take payment: a paid seat is refused unless payment is external (the ticket was paid on another system). Guests cannot be registered here. API: POST /event_registrations.
Input Schema
{
"type": "object",
"properties": {
"event_id": {
"type": "string"
},
"member_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"registered",
"waitlisted",
"attended",
"cancelled"
]
},
"dietary_restrictions": {
"type": "string"
},
"accessibility_needs": {
"type": "string"
},
"payment": {
"description": "Send external only when the ticket was paid on another system.",
"type": "string",
"const": "external"
},
"idempotency_key": {
"description": "Optional. Reuse the same key only to retry the same create; the API then returns the first answer.",
"type": "string",
"maxLength": 255
}
},
"required": [
"event_id",
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴memberrun_cancel_event_registration(registration_id)
Cancel one registration (soft: the status becomes cancelled). The next person on the waitlist moves up if there is one. API: DELETE /event_registrations/{id}.
Input Schema
{
"type": "object",
"properties": {
"registration_id": {
"type": "string",
"description": "The id, as returned by the list or create tools."
}
},
"required": [
"registration_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence