Dooray MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DOORAY_API_TOKEN | Yes | Your Dooray API token (can be generated from Dooray personal settings > API > Personal authentication token menu) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
| prompts | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get-my-member-infoA | Get information about the authenticated user. This tool retrieves your Dooray member profile using your API token. Most importantly, it returns your member ID which is needed for other operations like filtering tasks by assignee. No parameters needed - it automatically uses your authentication token. Examples:
Returns your complete member profile including:
This is often the first tool to call to get your member ID for use in other tools like list-tasks. |
| get-member-listA | Search members across the whole Dooray organization (조직 전체 멤버 검색). Unlike get-project-member-list, this is not limited to one project. Use it to find the organizationMemberId of someone outside the project (e.g. to add them as CC by email or member ID). Search Conditions (combine as needed):
Examples:
Returns: totalCount and members with id (organizationMemberId), name, userCode, externalEmailAddress. Use get-member for full details. |
| get-memberA | Get details of a Dooray organization member (멤버 상세). Use the organizationMemberId found in task assignees, comment creators, calendar attendees, or get-member-list results. Examples:
Returns: id, name, userCode, externalEmailAddress, englishName, nickname, locale, timezoneName and more. |
| get-project-listA | Get list of active projects that you belong to. This tool retrieves only active projects where you are a member. Archived projects are excluded. Note: Returns compact response with essential fields only. For complete project details, use get-project. IMPORTANT: When the user provides a specific Dooray URL (e.g., "https://nhnent.dooray.com/task/PROJECT_ID"), do NOT use this tool. Instead, extract the PROJECT_ID from the URL and call get-project directly to get information about that specific project. This tool is for browsing your active projects when no specific project URL or ID is provided. Examples:
Returns a paginated list with project id and name (project code) for each project. |
| get-projectA | Get detailed information about a specific Dooray project. This tool retrieves complete details of a single project including its configuration, scope, organization, and category information. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID" or "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. IMPORTANT: When a specific project URL is provided, use this tool directly instead of calling get-project-list first. Examples:
Returns project information including:
Use this to get full details about a specific project when you have its project ID or URL. |
| get-task-listA | Get list of tasks in a Dooray project with powerful filtering and sorting. IMPORTANT: projectId is REQUIRED. This tool fetches tasks from a specific project. Note: Returns compact response with essential fields only. For complete task details, use get-task. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID" or "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. When a URL is provided, use get-project for project info instead of get-project-list. Member ID Filters (use organizationMemberId from get-my-member-info):
Workflow Filters:
Date Filters (flexible patterns):
Examples:
Sorting:
Returns paginated task list with id, number, subject, status, priority, dueDate, assignees, tags, and milestone. |
| get-taskA | Get detailed information about a specific task. This tool retrieves complete details of a task including its full body content, attachments, workflow status, assignees, and all metadata. URL Pattern Recognition - Two formats supported:
IMPORTANT:
Examples:
Returns complete task information including:
|
| create-taskA | Create a new task (업무) in a Dooray project. Required: projectId, subject. DRAFT vs REGULAR: ASK USER which type to create:
INTERACTIVE WORKFLOW:
Key Points:
Examples:
Returns: Task object (regular) or {id, url, message} (draft). |
| update-taskA | Update an existing task in a Dooray project. RECOMMENDED WORKFLOW (guide for AI assistants):
IMPORTANT NOTES:
URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID":
Examples:
Returns: Updated task with all current details. |
| update-task-bodyA | Replace part of a task body (업무 본문 일부 치환). Use this instead of update-task when only a few spots in a long body change. It reads the current body, replaces oldText with newText, and saves it with the same mimeType. The rest of the body (including inline images and file links) stays as it is. Rules:
Examples:
Returns: replacedCount and the body mimeType. |
| create-task-commentA | Add a comment (댓글) to an existing Dooray task. This tool creates a comment on a task, separate from editing the task body itself. Use this for:
When to Use:
URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID":
File Attachments:
Content Format:
Examples:
Returns: Created comment with ID. |
| get-task-comment-listA | Get list of comments (댓글) on a specific Dooray task. This tool fetches all comments that have been added to a task. Comments are discussions, updates, or notes added by team members. URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID" or "https://nhnent.dooray.com/project/tasks/TASK_ID":
IMPORTANT: Both projectId and taskId are REQUIRED. Pagination:
Sorting:
Note: Returns filtered response with essential fields only (id, creator, body). Examples:
Returns a paginated response with totalCount and array of comments containing:
Use this tool to view discussion history, progress updates, or notes on a task. |
| update-task-commentA | Update an existing comment (댓글) on a Dooray task. This tool modifies the content or attachments of an existing task comment. IMPORTANT LIMITATION: Comments created from incoming emails CANNOT be modified. Only regular comments can be updated. URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID" or "https://nhnent.dooray.com/project/tasks/TASK_ID":
REQUIRED: projectId, taskId, and commentId are all required. Optional Parameters: You can provide either body, attachFileIds, or both. If you only want to update the text, just provide body. If you only want to update attachments, just provide attachFileIds. File Attachments:
Workflow:
Content Format:
Examples:
Returns: Success message upon completion. |
| get-task-commentA | Get a single comment (댓글) on a Dooray task with its full body. Use the comment ID from get-task-comment-list. Call this before update-task-comment to get the current body. Examples:
Returns: comment with id, type, subtype, createdAt, creator, body {mimeType, content}, files. |
| delete-task-commentA | Delete a comment (댓글) on a Dooray task. This cannot be undone. Confirm the target with get-task-comment before deleting. Examples:
Returns: success message. |
| get-milestone-listA | Get list of milestones for a project. Milestones are used to organize and track tasks by release or sprint. This tool retrieves all milestones in a project. Note: Returns compact response with essential fields only. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. Examples:
Returns an array of milestones with id, name, description, dates, and status. Use milestone IDs when creating or updating tasks. |
| get-tag-listA | Get list of tags for a project, grouped by tag groups. Tags are used to categorize and label tasks. This tool retrieves all available tags organized by their tag groups for better clarity. Response Format: Returns tags grouped by their tagGroup: CRITICAL - Mandatory Tag Groups: When creating/updating tasks, you MUST include tags from all mandatory tag groups:
Failing to provide required tags will result in a 500 error. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. Pagination:
Examples:
Use tag IDs when creating or updating tasks with create-task or update-task tools. |
| get-tagA | Get details of a specific tag in a Dooray project. Response Format: Response Fields:
Examples:
Use Cases:
|
| create-tagA | Create a new tag in a Dooray project. Tag Types:
Color Format:
Response: Returns the created tag's ID: Tag Groups: After creating group tags, you can configure the group's behavior (mandatory, selectOne) using the update-tag-group tool. Examples:
|
| update-tag-groupA | Update tag group settings in a Dooray project. Tag Group Settings:
Common Configurations:
Finding Tag Group ID: Use get-tag-list to find tags and their tagGroup information: Examples:
Note: Only provide the settings you want to change. Omitted settings will not be modified. |
| get-project-template-listA | Get list of project task templates. Templates are pre-created task structures with predefined title and body content. This tool retrieves all available templates in a project. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. Note: Returns compact response with essential fields only (id and templateName). Pagination:
Examples:
Returns a paginated response with totalCount and an array of templates containing id and templateName. Templates help users quickly create tasks with predefined structure and content, useful for common task types like bug reports, feature requests, or documentation tasks. |
| get-project-templateA | Get detailed information about a specific project template. This tool retrieves complete template details including body, guide, subject, users, tags, and milestone. The returned data is intended for creating new tasks from templates. IMPORTANT - Full Details Returned: This tool returns ALL template fields (not filtered) because:
Template Macros: Template macros like ${year}, ${month}, etc. are returned as-is (not interpolated). These can be processed when creating tasks if needed. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. How to get template IDs:
Use the Examples:
Returns complete template information including:
Use this tool to get full template details before creating a new task from the template. |
| create-project-templateA | Create a new task template in a Dooray project. Templates are pre-created task structures that help users quickly create tasks with predefined content. Required Field:
Optional Fields:
Due Date Flags:
Examples:
Returns the created template ID. |
| update-project-templateA | Update an existing task template in a Dooray project. Required Fields:
Optional Fields:
How to get template IDs:
Use the Examples:
Returns success status. |
| delete-project-templateA | Delete an existing task template from a Dooray project. CAUTION: This action cannot be undone. Make sure you want to permanently delete the template. Required Fields:
How to get template IDs:
Use the Example:
Returns success status. |
| get-project-member-listA | Get list of members in a project with their details. This tool fetches project members and enriches each member with detailed information including name and email address. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. Role Filtering:
Pagination:
Note: Returns compact response with essential fields only (id, name, externalEmailAddress). Examples:
Returns a paginated response with totalCount and array of members containing:
Use this tool to find project members for assigning tasks or understanding team composition. |
| get-project-member-group-listA | Get list of member groups in a project. Member groups are collections of members that can be assigned to tasks as a group. This tool retrieves all member groups configured in a project. URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the first numeric ID after "/task/") and use it as the projectId parameter. Pagination:
Note: Returns compact response with essential fields only (id and code). Examples:
Returns a paginated response with totalCount and array of member groups containing:
Use this tool to find member groups for assigning tasks to groups of members. |
| get-project-workflow-listA | Get list of workflow statuses (업무 상태) for a project. Workflows represent the task statuses available in a project. There are four workflow classes:
Each project may have custom workflows within these classes. Use workflow IDs when creating or updating tasks (e.g., in create-task or update-task tools). URL Pattern Recognition: When given a Dooray URL like "https://nhnent.dooray.com/task/PROJECT_ID", extract the PROJECT_ID (the numeric ID after "/task/") and use it as the projectId parameter. Examples:
Returns: Array of workflows with id, name, order, and class. |
| upload-attachmentA | Upload a file attachment to a Dooray task. Required Parameters:
Example: { "projectId": "123456", "taskId": "789012", "filePath": "/Users/nhn/Downloads/report.pdf" } Returns: File ID of the uploaded attachment. Note: The file must exist at the specified path. Maximum file size depends on Dooray's server limits. |
| get-attachment-listB | Get list of file attachments for a Dooray task. Required Parameters:
Note: This API returns only "general" type files attached to the task. Example: { "projectId": "123456", "taskId": "789012" } Returns: List of attachments with id, name, size, mimeType, createdAt, and creator info. Response Fields:
|
| get-attachment-metadataA | Get metadata of a specific file attachment in a Dooray task. Required Parameters:
Example: { "projectId": "123456", "taskId": "789012", "fileId": "abc123" } Returns: File metadata including id, name, size, mimeType, createdAt, and creator info. Response Fields:
Note: This returns metadata only, not the file content. Use download-attachment to get the actual file. |
| download-attachmentA | Download a file attachment from a Dooray task. Required Parameters:
Optional:
Examples:
Response Fields:
|
| delete-attachmentA | Delete a file attachment from a Dooray task. Required Parameters:
Example: { "projectId": "123456", "taskId": "789012", "fileId": "abc123" } Returns: Success message confirming deletion. Note: This action is irreversible. The file will be permanently removed from the task. |
| download-all-attachmentsA | Download every file attached to a Dooray task into a local directory (첨부 일괄 다운로드). Files are saved with their original names. Existing files are not overwritten unless overwrite is true. If some files fail, the others are still downloaded and the result lists both succeeded and failed files. Examples:
Returns: count, succeeded [{fileId, savedTo, size}], failed [{fileId, name, error}]. |
| get-drive-listA | Get list of accessible Dooray drives. Drive Types:
Examples:
Returns: drive ID, name, type, and associated project info. |
| get-drive-file-listA | Get list of files and folders in a Dooray drive. Required: driveId Optional: parentId (use "root" for top-level), type filter, pagination Examples:
Returns: file/folder ID, name, type, size, dates, creator info. |
| get-drive-file-metaA | Get file metadata by file ID (without needing drive ID). Required: fileId Returns: file ID, driveId, name, version, type, subType, mimeType, size, creator, parent info. Note: Use the returned driveId for download or other operations that require it. |
| create-drive-folderA | Create a new folder in a Dooray drive. Required:
Example: { "driveId": "123", "folderId": "456", "name": "New Folder" } Returns: ID of the created folder. |
| rename-drive-fileC | Rename a file or folder in a Dooray drive. Required:
Example: { "driveId": "123", "fileId": "456", "name": "new-name.txt" } |
| move-drive-fileA | Move a file or folder in a Dooray drive. Required:
Examples:
Note: To permanently delete, first move to trash, then use delete-drive-file. |
| copy-drive-fileB | Copy a file in a Dooray drive to another location. Required:
Example: { "driveId": "123", "fileId": "456", "destinationDriveId": "123", "destinationFileId": "789" } |
| delete-drive-fileA | Permanently delete a file from a Dooray drive trash. Important: The file must already be in the trash folder. To move a file to trash first, use move-drive-file with destinationFileId="trash". Required:
Example: { "driveId": "123", "fileId": "456" } |
| upload-drive-fileA | Upload a file to a Dooray drive folder. Required:
Example: { "driveId": "123", "parentId": "456", "filePath": "/Users/name/document.pdf" } Returns: File ID of the uploaded file. Note: The file must exist at the specified path. |
| download-drive-fileA | Download a file from a Dooray drive. Required:
Optional:
Examples:
Tip: If you only have a file ID, use get-drive-file-meta first to get the driveId. |
| update-drive-fileA | Upload a new version of an existing file in a Dooray drive. Required:
Example: { "driveId": "123", "fileId": "456", "filePath": "/Users/name/updated-document.pdf" } Returns: File ID and new version number. Note: This replaces the file content with a new version. The file must exist at the specified path. |
| get-wiki-listA | Get list of accessible wikis. Wiki vs WikiPage:
Returns: wiki ID, name, project, type, scope, and home page ID. |
| get-wiki-page-listA | Get wiki pages at one depth level (siblings). Use parentPageId to get child pages, omit for root pages. |
| get-wiki-pageA | Get wiki page details including body content. Two API endpoints supported:
Returns: id, wikiId, version, subject, body (mimeType, content), creator, referrers, files, images. |
| create-wiki-pageA | Create a new wiki page. Required: wikiId, subject, content Optional: attachFileIds, referrers IMPORTANT - parentPageId:
Workflow:
Content is in markdown format. Returns: id, wikiId, parentPageId, version. |
| update-wiki-pageA | Update wiki page title and/or content. Required: wikiId, pageId, subject Optional: content, referrers IMPORTANT - subject is required:
Workflow for content-only update:
Set referrers to null to clear all referrers. |
| update-wiki-page-bodyA | Replace part of a wiki page body (위키 본문 일부 치환). Use this instead of update-wiki-page when only a few spots in a long page change. The title and the rest of the body stay as they are. Rules:
Examples:
|
| move-wiki-pageA | Move a wiki page (위키 페이지 이동). Moves the page under another parent page, into another wiki (targetWikiId), or changes its order among siblings (beforePageId). Child pages move together by default. Set withChildren=false to move only this page. Examples:
|
| delete-wiki-pageA | Delete a wiki page (위키 페이지 삭제). Confirm the target with get-wiki-page before deleting, and check child pages with get-wiki-page-tree. |
| get-wiki-page-treeA | Get the wiki page hierarchy as a tree (위키 페이지 트리). get-wiki-page-list returns only one level. This tool walks down the levels and returns nested {id, subject, children}. Each level costs one API call per page, so keep depth small for large wikis. The walk stops at 500 pages (truncated=true). Examples:
|
| get-wiki-page-comment-listA | Get comments on a wiki page. Returns newest first. Each comment has: id, page, createdAt, modifiedAt, creator, body. |
| get-wiki-page-commentA | Get a specific comment on a wiki page. Returns: id, page, createdAt, modifiedAt, creator, body. |
| create-wiki-page-commentB | Create a comment on a wiki page. Content is in markdown format. Returns: id. |
| update-wiki-page-commentC | Update a comment on a wiki page. |
| delete-wiki-page-commentC | Delete a comment on a wiki page. |
| upload-wiki-page-fileA | Upload a file to an existing Dooray wiki page. Required Parameters:
Example: { "wikiId": "123456", "pageId": "789012", "filePath": "/Users/nhn/Downloads/report.pdf" } Returns: File ID and attach file ID of the uploaded file. Note: The file must exist at the specified path. The type is set to "general" automatically. |
| download-wiki-page-fileA | Download a file attached to a Dooray wiki page. Required Parameters:
Optional:
Examples:
Response Fields:
|
| delete-wiki-page-fileA | Delete a file attached to a Dooray wiki page. Required Parameters:
Example: { "wikiId": "123456", "pageId": "789012", "fileId": "abc123" } Returns: Success message confirming deletion. Note: This action is irreversible. The file will be permanently removed from the wiki page. |
| upload-wiki-fileA | Upload a file to a Dooray wiki (not page-specific). This is useful for pre-uploading files before creating a wiki page. The returned attachFileId can be used in create-wiki-page's attachFileIds parameter. Required Parameters:
Example: { "wikiId": "123456", "filePath": "/Users/nhn/Downloads/report.pdf" } Workflow:
Returns: File ID and attach file ID of the uploaded file. |
| download-wiki-attach-fileA | Download a file from a Dooray wiki using attach file ID. Required Parameters:
Optional:
Examples:
Note: The attachFileId is different from fileId. Use this endpoint when you have an attachFileId from the page detail API's $.result.files.attachFileId or $.result.images.attachFileId field. |
| get-calendar-listA | Get the list of Dooray calendars (캘린더 목록) the user can access. Subscription calendars are not included. The calendar marked default=true is the user's own default calendar. Use the returned calendar id for create-calendar-event, or to filter get-calendar-event-list. Examples:
Returns: totalCount and calendars with id, name, type (private, project), default, role. |
| get-calendar-event-listA | Get Dooray calendar events (일정 목록) in a time range. Required: timeMin (inclusive) and timeMax (exclusive). The range must be 1 year or less. The list does not include event body or attendees. Use get-calendar-event for details. Subscription calendars are not included. Filters:
Examples:
Returns: events with id, calendar {id, name}, subject, startedAt, endedAt, wholeDayFlag, location, category, recurrenceType. |
| get-calendar-eventA | Get details of a Dooray calendar event (일정 상세). Both calendarId and eventId are required. Take them from get-calendar-event-list (calendar.id and id). Examples:
Returns: event with body, users (from = organizer, to = attendees, cc) and each attendee status (accepted, declined, tentative, not_confirmed), recurrenceRule and files. |
| create-calendar-eventA | Create an event (일정 등록) in a Dooray calendar. Required: calendarId, subject, startedAt, endedAt. Get calendarId from get-calendar-list (default=true is the user's own calendar). Time Format:
Attendees: {id, type} where type is "member" (organizationMemberId) or "email" (email address). Use get-my-member-info, get-project-member-list, get-member-list to find member IDs. Examples:
Returns: {id} of the created event. |
| update-calendar-eventA | Update a Dooray calendar event (일정 수정). Only the fields you provide are changed. Unprovided fields keep their current values. IMPORTANT:
Examples:
Returns: success message. |
| delete-calendar-eventA | Delete a Dooray calendar event (일정 삭제). Recurring Events (deleteType):
For a recurring event, use the occurrence event ID from get-calendar-event-list. Examples:
Returns: success message. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| create-task-with-template | Create a new task using a structured template with all necessary fields |
| weekly-task-summary | Generate a summary of tasks assigned to you for the current week |
| project-status-report | Generate a project status report including task counts by workflow status |
| task-review-checklist | Create a review checklist for a specific task |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Dooray API Information | Information about the Dooray API and available endpoints |
| Workflow Status Reference | Reference guide for Dooray workflow statuses (backlog, registered, working, closed) |
| Priority Reference | Reference guide for Dooray task priorities |
TDQS
Scored across 70 tools
Most tools are scoped to distinct resources and actions, but there are several near-duplicate file tools across task attachments, drive files, and wiki pages that can cause misselection. In particular, upload-wiki-file vs upload-wiki-page-file and download-wiki-page-file vs download-wiki-attach-file require careful reading to distinguish.
Almost all tools follow a consistent kebab-case verb_noun pattern (get-, create-, update-, delete-, upload-, download-, move-). Minor deviations like get-drive-file-meta versus get-attachment-metadata and get-wiki-list versus get-wiki-page-list are noticeable but still readable.
Seventy tools is very heavy, even for a broad collaboration suite spanning tasks, wiki, drive, and calendar. Many niche operations and overlapping file variants could be consolidated to reduce the surface area.
Core workflows are well covered: tasks, comments, templates, drive files, wiki pages, calendar events, projects, and members all have substantial CRUD support. However, there is no delete-task tool, milestones are list-only, and tags lack update/delete operations, leaving notable lifecycle gaps.