paymo
Browse Paymo projects, tasks, timesheets and invoices, and create tasks, log time or run timers.
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`claude_desktop_config.json` 파일에 다음을 추가하세요:
{
"mcpServers": {
"paymo": {
"url": "https://paymo.usefulapi.io/mcp"
}
}
}원격 엔드포인트
https://paymo.usefulapi.io/mcpstreamable-http할 수 있는 일
도구 목록
도구 (21)
🟢paymo_get_me
Fetch the Paymo user the API key belongs to (id, name, type, timezone). Use the id as user_id for 'my' time entries and timers. A cheap way to confirm the key works. Paymo: GET /api/me.
입력 스키마
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_get_company
Fetch the company (account) info and settings: name, default currency, timezone, working days, invoice numbering. Paymo: GET /api/company.
입력 스키마
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_users(active, type, where, limit)
List users in the company (id, name, email, type, hourly rate, assigned/managed projects). Paymo: GET /api/users.
입력 스키마
{
"type": "object",
"properties": {
"active": {
"description": "true = active users only, false = retired users only.",
"type": "boolean"
},
"type": {
"description": "Only users of this type.",
"type": "string",
"enum": [
"Admin",
"Employee",
"Guest"
]
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_clients(active, include, where, limit)
List clients (id, name, contact details, active flag). Paymo: GET /api/clients.
입력 스키마
{
"type": "object",
"properties": {
"active": {
"description": "true = active clients only, false = archived only.",
"type": "boolean"
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_projects(active, client_id, user_id, manager_id, billable, ...)
List projects (id, name, code, client_id, active, billable, budget_hours, users, managers), optionally filtered. Paymo: GET /api/projects.
입력 스키마
{
"type": "object",
"properties": {
"active": {
"description": "true = active projects, false = archived.",
"type": "boolean"
},
"client_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only projects for this client."
},
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only projects this user is assigned to."
},
"manager_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only projects this user manages."
},
"billable": {
"description": "Only billable (true) or non-billable (false) projects.",
"type": "boolean"
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_get_project(project_id, include)
Fetch one project, optionally with related objects inline, e.g. include=tasklists.tasks for the whole task tree or include=client. Paymo: GET /api/projects/{id}.
입력 스키마
{
"type": "object",
"properties": {
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The project id."
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
}
},
"required": [
"project_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_tasklists(project_id, include, limit)
List task lists (id, name, project_id, milestone_id), e.g. to pick a tasklist_id when creating a task. Paymo: GET /api/tasklists.
입력 스키마
{
"type": "object",
"properties": {
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only task lists from this project."
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_tasks(project_id, tasklist_id, user_id, complete, my_tasks, ...)
List tasks (id, name, code, project_id, tasklist_id, complete, due_date, users, priority), filtered by project, task list, assignee or completion. my_tasks=true returns the caller's 'My Tasks'. Paymo: GET /api/tasks.
입력 스키마
{
"type": "object",
"properties": {
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only tasks from this project."
},
"tasklist_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only tasks from this task list."
},
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only tasks assigned to this user."
},
"complete": {
"description": "true = completed tasks, false = open tasks.",
"type": "boolean"
},
"my_tasks": {
"description": "true = tasks assigned to the calling user or to nobody, in their projects.",
"type": "boolean"
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_get_task(task_id, include)
Fetch one task, optionally with related objects: include=thread.comments for its comments, subtasks, entries (time logged), files, project. Paymo: GET /api/tasks/{id}.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The task id."
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
}
},
"required": [
"task_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_time_entries(project_id, task_id, user_id, client_id, from, ...)
List time entries (id, task_id, user_id, project_id, start_time/end_time or date, duration in seconds, description, billed). At least one filter is required. from/to filter by the entry's time interval; running_only=true returns running timers. Paymo: GET /api/entries.
입력 스키마
{
"type": "object",
"properties": {
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only entries from this project."
},
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only entries for this task."
},
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only entries for this user."
},
"client_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only entries for this client."
},
"from": {
"type": "string",
"description": "Interval start (YYYY-MM-DD = start of that day UTC). Requires `to`."
},
"to": {
"type": "string",
"description": "Interval end (YYYY-MM-DD = end of that day UTC). Requires `from`."
},
"billed": {
"description": "true = already invoiced, false = unbilled.",
"type": "boolean"
},
"running_only": {
"description": "true = only running timers (no end_time yet).",
"type": "boolean"
},
"include": {
"description": "Related objects to embed (Paymo `include`), comma-separated, e.g. client or tasklists.tasks.",
"type": "string",
"maxLength": 300,
"pattern": "^[a-z_]+(\\.[a-z_]+)*(,[a-z_]+(\\.[a-z_]+)*)*$"
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_invoices(client_id, status, where, limit)
List invoices (id, number, client_id, status, currency, date, due_date, subtotal, total). Paymo: GET /api/invoices.
입력 스키마
{
"type": "object",
"properties": {
"client_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only invoices for this client."
},
"status": {
"description": "Only invoices with this status.",
"type": "string",
"enum": [
"draft",
"sent",
"viewed",
"paid",
"void"
]
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_get_invoice(invoice_id, include_items)
Fetch one invoice with totals, and (by default) its line items and payments. Paymo: GET /api/invoices/{id}?include=invoiceitems,invoicepayments.
입력 스키마
{
"type": "object",
"properties": {
"invoice_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The invoice id."
},
"include_items": {
"description": "Include line items and payments (default true).",
"type": "boolean"
}
},
"required": [
"invoice_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢paymo_list_expenses(client_id, project_id, invoiced, date_from, date_to, ...)
List expenses (id, client_id, project_id, user_id, amount, currency, date, notes, invoiced, tags). Paymo: GET /api/expenses.
입력 스키마
{
"type": "object",
"properties": {
"client_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only expenses for this client."
},
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Only expenses for this project."
},
"invoiced": {
"description": "true = already invoiced, false = not yet invoiced.",
"type": "boolean"
},
"date_from": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Only expenses dated on/after this day."
},
"date_to": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Only expenses dated on/before this day."
},
"where": {
"description": "Extra raw Paymo filter ANDed onto the typed ones, e.g. `billable=true` or `name like Website`. Operators: = > >= < <= != like, not like, in (a,b), not in (a,b).",
"type": "string",
"maxLength": 500
},
"limit": {
"description": "Max items to return (default 100, max 500). Paymo has no pagination; results beyond this are truncated.",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_create_project(name, description, client_id, billable, price_per_hour, ...)
Create a project. Note: if client_id is omitted Paymo auto-creates a 'Sample Client'. Free plans have an active-projects limit (403). Paymo: POST /api/projects.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Project name."
},
"description": {
"description": "Project description.",
"type": "string"
},
"client_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Client the project is for."
},
"billable": {
"description": "Whether the project is billable.",
"type": "boolean"
},
"price_per_hour": {
"description": "Hourly rate for time & materials projects.",
"type": "number",
"minimum": 0
},
"budget_hours": {
"description": "Budget in hours.",
"type": "number",
"minimum": 0
},
"users": {
"description": "User ids to assign.",
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"managers": {
"description": "User ids of managers (subset of users).",
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_create_task(name, tasklist_id, project_id, description, users, ...)
Create a task in a task list (tasklist_id) or a project (project_id — goes to its 'Default Task List'). Paymo: POST /api/tasks.
입력 스키마
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Task name."
},
"tasklist_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Task list to add the task to."
},
"project_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Project to add the task to (used when tasklist_id is not given)."
},
"description": {
"description": "Task description / notes.",
"type": "string"
},
"users": {
"description": "Assignee user ids.",
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"due_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Due date."
},
"billable": {
"description": "Whether the task is billable.",
"type": "boolean"
},
"budget_hours": {
"description": "Budget hours for the task.",
"type": "number",
"minimum": 0
},
"priority": {
"description": "Priority: 25 low, 50 normal, 75 high, 100 critical.",
"anyOf": [
{
"type": "number",
"const": 25
},
{
"type": "number",
"const": 50
},
{
"type": "number",
"const": 75
},
{
"type": "number",
"const": 100
}
]
}
},
"required": [
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_update_task(task_id, name, description, complete, users, ...)
Update a task — rename, re-describe, reassign (users replaces the whole list), set due date or priority, mark complete/incomplete, move to another task list or workflow status. Only the fields given are changed. Paymo: PUT /api/tasks/{id}.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The task id."
},
"name": {
"description": "New name.",
"type": "string",
"minLength": 1
},
"description": {
"description": "New description.",
"type": "string"
},
"complete": {
"description": "true = mark complete, false = reopen.",
"type": "boolean"
},
"users": {
"description": "New FULL list of assignee user ids.",
"type": "array",
"items": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"due_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "New due date."
},
"priority": {
"description": "Priority: 25 low, 50 normal, 75 high, 100 critical.",
"anyOf": [
{
"type": "number",
"const": 25
},
{
"type": "number",
"const": 50
},
{
"type": "number",
"const": 75
},
{
"type": "number",
"const": 100
}
]
},
"tasklist_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Move to this task list."
},
"status_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Workflow status id."
},
"budget_hours": {
"description": "New budget hours.",
"type": "number",
"minimum": 0
}
},
"required": [
"task_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_create_time_entry(task_id, date, duration_seconds, start_time, end_time, ...)
Log a completed time entry on a task, EITHER as date + duration_seconds OR as start_time + end_time (min 1 minute). To start a live timer use paymo_start_timer. Paymo: POST /api/entries.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Task the time is for."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Day of the entry (with duration_seconds)."
},
"duration_seconds": {
"description": "Length in seconds (with date), e.g. 3600 = 1h.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"start_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})$",
"description": "Start (with end_time)."
},
"end_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})$",
"description": "End (with start_time)."
},
"description": {
"description": "What was done.",
"type": "string"
},
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "User to log the time for (default: the API key's user)."
}
},
"required": [
"task_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_update_time_entry(entry_id, description, task_id, duration_seconds, start_time, ...)
Edit a time entry: description, task, or its length. duration_seconds only applies to date+duration entries; for start/end entries change end_time instead. Paymo: PUT /api/entries/{id}.
입력 스키마
{
"type": "object",
"properties": {
"entry_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The time entry id."
},
"description": {
"description": "New description.",
"type": "string"
},
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Move the entry to this task."
},
"duration_seconds": {
"description": "New length in seconds (date+duration entries only).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"start_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})$",
"description": "New start (start/end entries only)."
},
"end_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})$",
"description": "New end (start/end entries only)."
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "New day (date+duration entries only)."
}
},
"required": [
"entry_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_start_timer(task_id, start_time, description, user_id)
Start a running timer on a task (a time entry with a start_time and no end_time). A user can have only one running timer; if one is running Paymo returns 409. Paymo: POST /api/entries.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Task to time."
},
"start_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})$",
"description": "When the timer started (default: now)."
},
"description": {
"description": "What is being worked on.",
"type": "string"
},
"user_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "User to start the timer for (default: the API key's user)."
}
},
"required": [
"task_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_stop_timer(entry_id, end_time, description)
Stop a running timer by setting its end_time (default: now). The final duration must be at least 1 minute. Find running timers with paymo_list_time_entries running_only=true. Paymo: PUT /api/entries/{id}.
입력 스키마
{
"type": "object",
"properties": {
"entry_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "The running timer's time-entry id."
},
"end_time": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(Z|[+-]\\d{2}:\\d{2})$",
"description": "When the timer stopped (default: now)."
},
"description": {
"description": "Final description.",
"type": "string"
}
},
"required": [
"entry_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴paymo_add_task_comment(task_id, content)
Add a comment to a task's discussion thread (content may contain basic HTML). Read existing comments with paymo_get_task include=thread.comments. Paymo: POST /api/comments.
입력 스키마
{
"type": "object",
"properties": {
"task_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Task to comment on."
},
"content": {
"type": "string",
"minLength": 1,
"description": "Comment text."
}
},
"required": [
"task_id",
"content"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}커뮤니티
증거