Robly MCP by usefulapi
Find Robly contacts and lists; subscribe, update and move contacts between lists.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"robly": {
"url": "https://robly.usefulapi.io/mcp"
}
}
}원격 엔드포인트
https://robly.usefulapi.io/mcpstreamable-http할 수 있는 일
도구 목록
도구 (13)
🟢robly_list_contacts(status, list_id, updated_since, include_sub_lists, include_fields, ...)
List contacts (members) of the Robly account, newest first as Robly orders them: id, email, subscribed/deleted flags, subscription date, sign-up source, timestamps. Filter by status, by list, or by last-updated time; optionally include each contact's lists and data fields. Pages with limit (max 100) and offset: pass next_offset from the previous reply. Robly does not return a total. GET /api/v1/contacts/show.
입력 스키마
{
"type": "object",
"properties": {
"status": {
"description": "Only contacts with this status (default all).",
"type": "string",
"enum": [
"all",
"subscribed",
"unsubscribed",
"deleted"
]
},
"list_id": {
"description": "Only contacts on this list (sub list id from robly_list_sub_lists).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"updated_since": {
"description": "Only contacts changed since this ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z.",
"type": "string"
},
"include_sub_lists": {
"description": "Include the lists each contact is on.",
"type": "boolean"
},
"include_fields": {
"description": "Include each contact's data fields (name, custom fields).",
"type": "boolean"
},
"limit": {
"description": "Contacts per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"offset": {
"description": "Contacts to skip (default 0).",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢robly_find_contact(member_id, email, include_sub_lists, include_fields)
Look up one contact by email address or member id: status, subscription date, sign-up source and, on request, the lists and data fields. Returns found: false when Robly has no such contact. GET /api/v1/contacts/search.
입력 스키마
{
"type": "object",
"properties": {
"member_id": {
"description": "Robly contact (member) id. Give this OR email.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"email": {
"description": "The contact's email address. Give this OR member_id.",
"type": "string",
"minLength": 3,
"maxLength": 254,
"pattern": "^[^\\s@<>\",;:]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
},
"include_sub_lists": {
"description": "Include the lists the contact is on.",
"type": "boolean"
},
"include_fields": {
"description": "Include the contact's data fields.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢robly_check_list_membership(member_id, email, sub_list_id)
Whether one contact (by email or member id) is on one list. GET /api/v1/contacts/exists_in_sub_list.
입력 스키마
{
"type": "object",
"properties": {
"member_id": {
"description": "Robly contact (member) id. Give this OR email.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"email": {
"description": "The contact's email address. Give this OR member_id.",
"type": "string",
"minLength": 3,
"maxLength": 254,
"pattern": "^[^\\s@<>\",;:]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
},
"sub_list_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sub list id from robly_list_sub_lists."
}
},
"required": [
"sub_list_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢robly_list_sub_lists(include_all)
List the account's sub lists (the lists contacts belong to): id, name, position, timestamps. Public lists only unless include_all is true. Use the ids for list filters and for adding contacts. GET /api/v1/sub_lists/show.
입력 스키마
{
"type": "object",
"properties": {
"include_all": {
"description": "Also include non-public lists.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢robly_list_fields(include_all)
List the contact data fields (First Name, Last Name, custom fields): id, label, type, required flag and the user_tag that robly_subscribe_contact and robly_update_contact use as the field key. GET /api/v1/fields/show.
입력 스키마
{
"type": "object",
"properties": {
"include_all": {
"description": "Also include fields hidden from public sign-up forms.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢robly_get_signup_form(include_all)
The data fields and sub lists a new subscriber can be given through the sign-up API (public ones unless include_all is true). GET /api/v1/sign_up/show.
입력 스키마
{
"type": "object",
"properties": {
"include_all": {
"description": "Also include non-public fields and lists.",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_subscribe_contact(email, fields, sub_list_ids, double_opt_in, welcome_email, ...)
WRITE: add a new subscribed contact (or re-submit an existing one through the sign-up form). With double_opt_in Robly EMAILS the contact a confirmation link first; with welcome_email it EMAILS the welcome message right away; with include_autoresponder it triggers matching autoresponders, which email the contact. Only subscribe people who agreed to receive email. Field values go in `fields`, keyed by the user_tag from robly_list_fields (for example fname, lname). POST /api/v1/sign_up/generate.
입력 스키마
{
"type": "object",
"properties": {
"email": {
"type": "string",
"minLength": 3,
"maxLength": 254,
"pattern": "^[^\\s@<>\",;:]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$",
"description": "The new contact's email address."
},
"fields": {
"description": "Data field values keyed by user_tag, e.g. {\"fname\": \"Ada\", \"lname\": \"Lovelace\"}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 1000
}
},
"sub_list_ids": {
"description": "Lists to put the contact on (ids from robly_list_sub_lists).",
"maxItems": 50,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"double_opt_in": {
"description": "Send a confirmation email; the contact is subscribed only after clicking it, then gets the welcome email.",
"type": "boolean"
},
"welcome_email": {
"description": "Skip confirmation and send the welcome email now.",
"type": "boolean"
},
"include_autoresponder": {
"description": "Trigger matching autoresponders (they email the contact).",
"type": "boolean"
},
"return_contact": {
"description": "Return the created contact.",
"type": "boolean"
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_add_contact_to_list(member_id, email, sub_list_id, include_autoresponder)
WRITE: put an existing contact on a list. With include_autoresponder Robly triggers autoresponders matching the newly listed contact, which EMAIL the contact. POST /api/v1/contacts/add_sub_list.
입력 스키마
{
"type": "object",
"properties": {
"member_id": {
"description": "Robly contact (member) id. Give this OR email.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"email": {
"description": "The contact's email address. Give this OR member_id.",
"type": "string",
"minLength": 3,
"maxLength": 254,
"pattern": "^[^\\s@<>\",;:]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
},
"sub_list_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sub list id from robly_list_sub_lists."
},
"include_autoresponder": {
"description": "Trigger matching autoresponders (they email the contact).",
"type": "boolean"
}
},
"required": [
"sub_list_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_remove_contact_from_list(member_id, email, sub_list_id)
WRITE: take a contact off one list (the contact itself is kept). POST /api/v1/contacts/remove_sub_list.
입력 스키마
{
"type": "object",
"properties": {
"member_id": {
"description": "Robly contact (member) id. Give this OR email.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"email": {
"description": "The contact's email address. Give this OR member_id.",
"type": "string",
"minLength": 3,
"maxLength": 254,
"pattern": "^[^\\s@<>\",;:]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
},
"sub_list_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sub list id from robly_list_sub_lists."
}
},
"required": [
"sub_list_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_update_contact(member_id, fields, add_to_list_ids, remove_from_list_ids, remove_from_all_other_lists, ...)
WRITE: change an existing contact's data fields and/or list memberships in one call. Name the contact by member_id (look it up with robly_find_contact). `fields` are keyed by user_tag (robly_list_fields); the email address cannot be changed here. add_to_list_ids puts the contact on those lists, remove_from_list_ids takes it off them. remove_from_all_other_lists also removes the contact from every list NOT named in add_to_list_ids (requires add_to_list_ids). include_autoresponder triggers autoresponders that EMAIL the contact. POST /api/v1/contacts/update_full_contact.
입력 스키마
{
"type": "object",
"properties": {
"member_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Robly contact (member) id."
},
"fields": {
"description": "Data field values keyed by user_tag, e.g. {\"fname\": \"Ada\"}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"maxLength": 1000
}
},
"add_to_list_ids": {
"description": "Lists to put the contact on.",
"maxItems": 50,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"remove_from_list_ids": {
"description": "Lists to take the contact off.",
"maxItems": 50,
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"remove_from_all_other_lists": {
"description": "Also remove the contact from every list not in add_to_list_ids.",
"type": "boolean"
},
"include_autoresponder": {
"description": "Trigger matching autoresponders (they email the contact).",
"type": "boolean"
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_unsubscribe_contact(member_id, email)
WRITE: unsubscribe a contact so Robly stops emailing it. Robly's API cannot undo this: an unsubscribed contact can only come back through a sign-up form. Use it for a contact that asked to stop. POST /api/v1/contacts/unsubscribe.
입력 스키마
{
"type": "object",
"properties": {
"member_id": {
"description": "Robly contact (member) id. Give this OR email.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"email": {
"description": "The contact's email address. Give this OR member_id.",
"type": "string",
"minLength": 3,
"maxLength": 254,
"pattern": "^[^\\s@<>\",;:]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_create_sub_list(name)
WRITE: create a new, empty sub list. Robly does not say whether a list with the same name already exists, so check robly_list_sub_lists first. POST /api/v1/sub_lists/add_sub_list.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Name of the new list."
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴robly_rename_sub_list(sub_list_id, name)
WRITE: rename a sub list. POST /api/v1/sub_lists/rename_sub_list.
입력 스키마
{
"type": "object",
"properties": {
"sub_list_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Sub list id from robly_list_sub_lists."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "The new name."
}
},
"required": [
"sub_list_id",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}커뮤니티
증거