dooray-mcp-js
This server provides Dooray MCP tools for accounts, calendars, projects, posts, comments, attachments, and messenger, plus a local date/time utility.
Send Dooray messenger messages.
Find calendars and events, and create calendar events with recurrence options.
Look up account members by name/userCode or member ID.
Find or get Dooray projects.
List and filter project task posts, and get a post including its body.
Find comments/activity logs, get a specific log, and create or update comments.
List post attachments and download attachments or body files to a local temporary directory.
Get the current OS date/time.
Use read-only mode to hide write-capable tools such as messenger send, event creation, and comment create/update.
There is currently no delete tool.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dooray-mcp-js list my projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dooray-mcp-js
Dooray MCP server implemented in Node.js. It follows the tool names and API behavior of dooray-go/dooray-mcp, but does not require Go or Homebrew.
Requirements
Node.js 18 or newer
Dooray personal API token
Related MCP server: gdoc-comments
Official Documentation
Scope
This MCP server does not wrap every Dooray API. It focuses on frequently used account, calendar, project, post, attachment, and messenger APIs.
Most /admin/v1 and /admin/v2 administration APIs are intentionally not exposed by default, especially write-capable administration endpoints.
Read-only mode
Dooray personal API tokens are not issued with separate read-only and write permissions. A token that can call write APIs may still have those permissions at the Dooray API level.
For safer installations, this server provides a read-only mode at the MCP tool layer. In read-only mode, write-capable tools are not exposed in tools/list and cannot be called through tools/call.
Run
npx -y dooray-mcp-js --token "{personal-token}"You can also use an environment variable:
DOORAY_TOKEN="{personal-token}" npx -y dooray-mcp-jsRun with only read-only tools exposed:
DOORAY_TOKEN="{personal-token}" npx -y dooray-mcp-js --mode read-onlyCodex
Register the package directly with Codex:
codex mcp add dooray-mcp-js --env DOORAY_TOKEN="$DOORAY_TOKEN" -- npx -y dooray-mcp-jsIf the token is not already in DOORAY_TOKEN, pass it when registering:
codex mcp add dooray-mcp-js --env DOORAY_TOKEN="{personal-token}" -- npx -y dooray-mcp-jsThe server reads DOORAY_TOKEN when Codex starts it, so the token does not need to be included in the command arguments.
Codex read-only registration
Register a second MCP server with the same package and token, but expose only read-only tools:
codex mcp add dooray-mcp-js-read-only --env DOORAY_TOKEN="$DOORAY_TOKEN" -- npx -y dooray-mcp-js --mode read-onlyYou can also set the mode through an environment variable:
codex mcp add dooray-mcp-js-read-only --env DOORAY_TOKEN="$DOORAY_TOKEN" --env DOORAY_MCP_MODE=read-only -- npx -y dooray-mcp-jsClaude Desktop
{
"mcpServers": {
"dooray-mcp-js": {
"command": "npx",
"args": ["-y", "dooray-mcp-js"],
"env": {
"DOORAY_TOKEN": "{personal-token}"
}
}
}
}Read-only Claude Desktop configuration:
{
"mcpServers": {
"dooray-mcp-js-read-only": {
"command": "npx",
"args": ["-y", "dooray-mcp-js", "--mode", "read-only"],
"env": {
"DOORAY_TOKEN": "{personal-token}"
}
}
}
}Claude Code
claude mcp add dooray-mcp-js --env DOORAY_TOKEN="{personal-token}" -- npx -y dooray-mcp-jsRead-only registration:
claude mcp add dooray-mcp-js-read-only --env DOORAY_TOKEN="{personal-token}" -- npx -y dooray-mcp-js --mode read-onlyProject Structure
dooray-mcp-js/
├── src/
│ └── index.js # MCP server entry point
├── package.json
└── README.mdLocal development
When working from a cloned repository, run the local entry point directly:
DOORAY_TOKEN="{personal-token}" node ./src/index.jsTools
The dooray-mcp-js package exposes all currently implemented tools. The current server has no delete tool yet.
dooray_messengerdooray_calendar_calendarsdooray_calendar_eventsdooray_calendar_post_eventdooray_account_membersdooray_account_memberdooray_projectdooray_posts(lists task posts andfileIdList; list responses may omit the body)dooray_post(gets one task including its body withoperation=find_post,projectId, andpostId)dooray_post_logs(find comments and activity logs for a post)dooray_post_log(find one comment or activity log by ID)dooray_post_log_create(add a comment to a post; body is{ "mimeType": "text/x-markdown", "content": "..." })dooray_post_log_update(update a comment or activity log with the same body format)dooray_post_files(lists regular attachments; an empty result orAUTH_FORBIDDEN_ERRORdoes not determine whetherfileIdListitems can be downloaded)dooray_post_file_download(downloads IDs fromdooray_posts.fileIdList, including inline body images, or regular attachment file IDs withmedia=raw; authorization is limited to the configured API origin and HTTPSfile-api.dooray.com)os
Get one task including its body
Call the MCP tool with:
{
"name": "dooray_post",
"arguments": {
"operation": "find_post",
"projectId": "4271874883715387917",
"postId": "4406115298695798602"
}
}The server calls GET /project/v1/projects/{projectId}/posts/{postId} and returns the Dooray JSON response unchanged. Attachments are returned in result.files (IDs, names, and sizes); list responses can instead contain fileIdList. The title is result.subject; the body text is result.body.content, interpreted according to result.body.mimeType (for example, HTML or Markdown). API errors use the existing MCP error handling. This tool is available in read-only mode. Restart the MCP server and refresh the client tool list after updating the local source; an installation running a published package needs that updated package version.
Reading task URLs and body files
Use this workflow when a request asks for a Dooray task body, an image embedded in the body, or a file referenced by the body. Comments and activity logs are a separate resource and are not required for this workflow.
Parse the task URL.
/task/{projectId}/{postId}provides both IDs directly. The legacy/project/tasks/{postId}form provides onlypostId, so its trailing number must not be used asprojectId.Resolve the project only for the legacy URL form. Call
dooray_projectwithoperation=find_projectsand the requiredtype,scope, andstatefilters. Repeat the relevant filter combinations and continue throughpagevalues withsizeup to100until every result page has been checked.For the new URL form, call
dooray_postdirectly using both IDs. For a legacy URL, search for the matching post: calldooray_postswith the project ID from the new URL form or the candidate project IDs discovered for a legacy URL. Usesizeup to100, continue throughpagevalues as needed, and match the returned post ID to the URL'spostId. A lookup under one incorrect project ID or only the first result page is not evidence that the task or its files are unavailable.For a legacy URL, call
dooray_postwith the matching project and post IDs. Readresult.body.contentand its format fromresult.body.mimeTypein the detail response. List responses may omit the body. Do not calldooray_post_logsunless the user explicitly asks for comments or activity history.Collect file IDs from the detail response
result.files[].idand anyfileIdListin the list response, removing duplicates. Calldooray_post_file_downloadonce for each ID using the same verifiedprojectIdandpostId. These IDs commonly represent images embedded in the task body, but can represent other body files as well.Inspect the returned local
filePathwith an image viewer or an appropriate document parser. The download result also includesfileName,mimeType,size, andtemporary.
dooray_post_files is exposed for listing regular attachments, but it is separate from the fileIdList path used by body files. It can return an empty list or AUTH_FORBIDDEN_ERROR even when direct downloads from dooray_posts.fileIdList work. Therefore, neither outcome should be reported as proof that a body image or file is inaccessible. A fetch failed error or timeout from dooray_post_file_download is also a transport failure, not a permission result, and should be retried or reported separately. Report a file as forbidden or missing only when the direct download returns a terminal Dooray response such as 403 or 404 with the verified projectId, postId, and fileId.
Read-only mode tools
When --mode read-only or DOORAY_MCP_MODE=read-only is set, write-capable Dooray tools are not exposed in tools/list and cannot be called through tools/call.
Exposed in read-only mode:
dooray_calendar_calendarsdooray_calendar_eventsdooray_account_membersdooray_account_memberdooray_projectdooray_postsdooray_postdooray_post_logsdooray_post_logdooray_post_filesdooray_post_file_downloados
Hidden in read-only mode:
dooray_messengerdooray_calendar_post_eventdooray_post_log_createdooray_post_log_update
Options
--token: Dooray personal API token. Defaults toDOORAY_TOKEN.--endpoint: Dooray API endpoint. Defaults tohttps://api.dooray.com.--mode: tool exposure mode. Usefullorread-only. Defaults toDOORAY_MCP_MODEorfull.
Available Tools
15 toolsdooray_account_memberC
find dooray account members by id
Inputs: member_id (required), operation (required).
dooray_account_membersA
find dooray account members by name or userCode
Inputs: operation (required), member_name (required), user_code.
dooray_calendar_calendarsC
find dooray calendars
Inputs: operation (required).
dooray_calendar_eventsC
find dooray events of calendars
Inputs: timeMax (required), timeMin (required), operation (required), calendars.
dooray_calendar_post_eventC
register dooray events on a calendar
Inputs: content (required), endedAt (required), subject (required), operation (required), +10 more.
dooray_messengerB
send message to dooray messenger
Inputs: to (required), message (required), operation (required).
dooray_post_file_downloadA
download raw content of a Dooray post attachment through authenticated redirects to a local temporary directory
Inputs: fileId (required), postId (required), operation (required), projectId (required), +1 more.
dooray_post_filesA
find attachments of a Dooray post
Inputs: postId (required), operation (required), projectId (required).
dooray_post_logB
find a specific comment or activity log of a Dooray post
Inputs: logId (required), postId (required), operation (required), projectId (required).
dooray_post_log_createB
add a comment to a Dooray post
Inputs: body (required), postId (required), operation (required), projectId (required).
dooray_post_logsC
find comments and activity logs of a Dooray post
Inputs: postId (required), operation (required), projectId (required), page, +2 more.
dooray_post_log_updateC
update a comment or activity log of a Dooray post
Inputs: body (required), logId (required), postId (required), operation (required), +1 more.
dooray_postsC
find dooray posts in projects
Inputs: operation (required), projectId (required), page, size, +16 more.
dooray_projectB
find Dooray projects or get a project by id
Inputs: operation (required), type, scope, state, +1 more.
osB
get os time date
Inputs: operation (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Most tools have clear resource-action boundaries (e.g., account member lookup vs. calendar events), but a few pairs like dooray_post_logs and dooray_post_log could confuse agents without careful reading. The plural/singular distinction helps, and the 'os' tool is clearly separate.
The naming is mostly consistent with a dooray_<domain>_<resource> pattern for queries and dooray_<domain>_<resource>_<verb> for actions. However, 'dooray_messenger' (a send action without a verb) and the standalone 'os' tool break the pattern, along with redundant 'dooray_calendar_calendars'.
15 tools is within a reasonable range for a multi-domain integration (account, messenger, calendar, posts, logs, files). The inclusion of an unrelated 'os' tool slightly detracts from the overall scope, but the count is not excessive.
Critical CRUD operations are missing across resources: no way to create or update posts, no update/delete for calendar events, no read for messenger, and no upload for files. While some actions exist (create calendar event, add comment, download file), the surface is incomplete for full lifecycle management, leading to dead ends.
Maintenance
Related MCP Connectors
Discover MCP servers and A2A agents; verify, message, post, follow, react, and receive webhooks.
PandaDoc MCP server for creating, sending, signing, and tracking PandaDoc documents.
MCP server for Appcircle mobile CI/CD platform.
The official Planning Center MCP server for interacting with your ministry's data.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceMCP Server for public disclosure information of Korean companies, powered by the dartpoint.ai API.3Apache 2.0- AlicenseNot gradedqualityDmaintenanceAn MCP server for reading/editing Google Docs content and managing comments, including listing, creating, replying, resolving, and reopening comments via the Docs API and Drive API.GPL 3.0
- AlicenseNot gradedqualityFmaintenanceMCP server for managing social media posts across multiple platforms using the Postiz API. Supports creating, updating, deleting posts, and generating videos.38 npm3MIT
- AlicenseBqualityCmaintenanceUnofficial MCP server for NAVER WORKS Drive admin tasks, enabling shared-drive governance, permission management, and file operations via service-account delegation.16MIT