Dooray MCP Server
A Dooray! integration server that lets an AI assistant read and modify your projects, tasks, comments, and related metadata.
User info: Get your own member profile/ID via
get-my-member-info.Projects: List active projects, fetch project details (by ID or Dooray URL), and view workflow statuses, members, and member groups.
Tasks: Search and filter tasks by assignee, CC, creator, workflow class, dates, tags, milestone, or parent task; get full task details; create tasks (including subtasks); and update tasks (title, body, priority, due date, assignees, CC, tags, workflow, milestone).
Comments: List, create, and update task comments (email-originated comments can't be edited).
Tags: List project tags with mandatory tag-group rules to follow when creating/updating tasks.
Milestones: List open/closed milestones.
Templates: Browse and retrieve task templates to use as defaults for new tasks.
Beyond this schema (per README): calendar events, wikis and wiki pages/files, drives, and attachment upload/download/delete.
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 Servershow me all open tasks in the marketing project"
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 Server
Dooray! 의 프로젝트, 업무, 위키, 드라이브, 캘린더를 AI assistant 에서 다루게 하는 MCP 서버.
설치
Node.js 18 이상이 필요합니다. MCP 등록 시 npx 로 실행되므로 별도 설치 없이 사용 가능합니다.
전역 설치가 필요하면:
npm install -g @jhl8041/dooray-mcpRelated MCP server: Dooray MCP Server
설정
1. API 토큰 발급
두레이 개인설정 > API > 개인 인증 토큰 메뉴에서 생성합니다. 가이드
2. 환경변수
변수 | 필수 | 설명 |
| O | 발급받은 API 토큰 |
| API 주소 (기본값 | |
|
|
실행 위치에 .env 파일이 있으면 그 값도 적용됩니다.
MCP 등록
Claude Code
claude mcp add -s user dooray-mcp -e DOORAY_API_TOKEN=<발급받은 토큰> -- npx -y @jhl8041/dooray-mcp@latestClaude Desktop
설정 파일 위치: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"dooray": {
"command": "npx",
"args": ["-y", "@jhl8041/dooray-mcp@latest"],
"env": { "DOORAY_API_TOKEN": "<발급받은 토큰>" }
}
}
}Tool 목록
공통
get-my-member-info- 사용자 정보 조회get-member-list- 조직 전체 멤버 검색 (이름, 사용자 ID, 이메일, SSO ID)get-member- 멤버 상세정보
캘린더
get-calendar-list- 캘린더 목록get-calendar-event-list- 기간 일정 목록 (최대 1년)get-calendar-event- 일정 상세정보 (본문, 참석자)create-calendar-event- 일정 생성 (종일, 반복 일정 지원)update-calendar-event- 일정 수정 (준 항목만 변경)delete-calendar-event- 일정 삭제 (반복 일정 범위 지정)
프로젝트
get-project-list- 프로젝트 목록get-project- 프로젝트 상세정보get-project-workflow-list- 업무 상태 목록get-task-list- 업무 검색/필터링get-task- 업무 상세정보create-task- 업무 생성update-task- 업무 수정 (담당자, 참조자, 태그 추가, 제거 옵션 포함)update-task-body- 업무 본문 일부 치환create-task-comment- 댓글 작성get-task-comment-list- 댓글 목록get-task-comment- 댓글 단건 조회update-task-comment- 댓글 수정 (이메일 댓글 수정 불가)delete-task-comment- 댓글 삭제get-milestone-list- 마일스톤 목록get-tag-list- 태그 목록get-tag- 태그 상세정보create-tag- 태그 생성 (개별/그룹 태그)update-tag-group- 태그 그룹 설정 수정get-project-template-list- 템플릿 목록get-project-template- 템플릿 상세정보create-project-template- 템플릿 생성update-project-template- 템플릿 수정delete-project-template- 템플릿 삭제get-project-member-list- 프로젝트 멤버 목록get-project-member-group-list- 멤버 그룹 목록
첨부파일
upload-attachment- 파일 업로드get-attachment-list- 첨부파일 목록get-attachment-metadata- 첨부파일 메타데이터download-attachment- 파일 다운로드 (savePath 옵션으로 로컬 저장 지원)delete-attachment- 첨부파일 삭제download-all-attachments- 첨부파일 일괄 다운로드 (디렉토리 저장)
드라이브
get-drive-list- 드라이브 목록 (개인/프로젝트)get-drive-file-list- 파일/폴더 목록 조회get-drive-file-meta- 파일 메타정보 조회 (file ID만으로)create-drive-folder- 폴더 생성rename-drive-file- 파일/폴더 이름 변경move-drive-file- 파일/폴더 이동 (휴지통 이동 포함)copy-drive-file- 파일 복사delete-drive-file- 휴지통 파일 영구삭제upload-drive-file- 파일 업로드download-drive-file- 파일 다운로드 (savePath 옵션으로 로컬 저장 지원)update-drive-file- 파일 새버전 업로드
위키
get-wiki-list- 위키 목록get-wiki-page-list- 위키 페이지 목록get-wiki-page-tree- 위키 페이지 트리 (깊이 지정)get-wiki-page- 위키 페이지 상세정보create-wiki-page- 위키 페이지 생성update-wiki-page- 위키 페이지 수정update-wiki-page-body- 위키 본문 일부 치환move-wiki-page- 위키 페이지 이동 (부모, 순서, 다른 위키)delete-wiki-page- 위키 페이지 삭제get-wiki-page-comment-list- 위키 페이지 댓글 목록get-wiki-page-comment- 위키 페이지 댓글 상세정보create-wiki-page-comment- 위키 페이지 댓글 작성update-wiki-page-comment- 위키 페이지 댓글 수정delete-wiki-page-comment- 위키 페이지 댓글 삭제
위키 파일
upload-wiki-file- 위키에 파일 업로드 (페이지 생성 전 pre-upload용, attachFileId 반환)upload-wiki-page-file- 기존 위키 페이지에 파일 업로드download-wiki-page-file- 위키 페이지 첨부파일 다운로드 (fileId 사용, savePath 옵션으로 로컬 저장 지원)download-wiki-attach-file- 위키 첨부파일 다운로드 (attachFileId 사용, savePath 옵션으로 로컬 저장 지원)delete-wiki-page-file- 위키 페이지 첨부파일 삭제
Available Tools
70 toolscopy-drive-fileB
Copy a file in a Dooray drive to another location.
Required:
driveId: Source drive ID
fileId: File ID to copy
destinationDriveId: Target drive ID (can be same or different drive)
destinationFileId: Target folder ID
Example: { "driveId": "123", "fileId": "456", "destinationDriveId": "123", "destinationFileId": "789" }
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID to copy | |
| driveId | Yes | Source drive ID | |
| destinationFileId | Yes | Destination folder ID | |
| destinationDriveId | Yes | Destination drive ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds the useful cross-drive capability note but omits key behavioral facts for a copy operation: whether an existing destination file is overwritten, what the response contains (e.g., the new file ID), and any permission/auth requirements implied by openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The leading sentence is front-loaded and clear, and the compact example is genuinely useful for a tool with four ID parameters. The 'Required' bullet list largely duplicates the schema, costing some efficiency but not much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description should say something about the result (e.g., the copied file's new ID) and about overwrite behavior at the destination. The cross-drive note and example help, but these two gaps keep it at minimum-viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters; the baseline is 3. The description repeats the schema text nearly verbatim, adding only the clarification that destinationDriveId may equal driveId, which is a marginal but genuine addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (copy a file) and names the domain (Dooray drive) plus the destination concept. It does not explicitly differentiate itself from sibling 'move-drive-file', which is the closest alternative, but the verb 'copy' is distinct enough that an agent can infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the word 'copy' — no explicit statement of when to pick this over move-drive-file, update-drive-file, or upload-drive-file. The note that the destination drive can be the same or different adds a useful scoping hint but is not real when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
Timed event: "2026-10-22T10:00:00+09:00"
Whole day event: set wholeDayFlag=true and use date format "2026-10-22+09:00". endedAt is the next day ("2026-10-23+09:00" for a one day event)
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:
Meeting: {"calendarId": "123", "subject": "주간 회의", "startedAt": "2026-10-22T10:00:00+09:00", "endedAt": "2026-10-22T11:00:00+09:00", "location": "4-5 회의실", "attendees": [{"id": "456", "type": "member"}]}
Whole day: {"calendarId": "123", "subject": "휴가", "startedAt": "2026-10-22+09:00", "endedAt": "2026-10-23+09:00", "wholeDayFlag": true}
Weekly: add "recurrenceRule": {"frequency": "weekly", "byday": "MO", "timezoneName": "Asia/Seoul"}
Returns: {id} of the created event.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC (참조) | |
| body | No | Event description | |
| busy | No | true: busy (바쁨), false: free (한가함) | |
| alarms | No | Alarms | |
| endedAt | Yes | End time (ISO 8601). Whole day: next day, e.g. 2026-10-23+09:00 | |
| subject | Yes | Event title | |
| location | No | Location | |
| attendees | No | Attendees (참석자). Use get-my-member-info, get-member-list to find member IDs | |
| startedAt | Yes | Start time (ISO 8601, e.g. 2026-10-22T10:00:00+09:00). Whole day: 2026-10-22+09:00 | |
| calendarId | Yes | Calendar ID to create the event in | |
| visibility | No | public (공개) or private (비공개) | |
| wholeDayFlag | No | true for a whole day event | |
| recurrenceRule | No | Recurrence rule for a recurring event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, so the safety profile is covered; the description adds genuinely non-obvious behavior: the whole-day endedAt must be the *next* calendar day, the date-plus-offset format for all-day times versus full ISO-8601 for timed events, and that the call returns {id}. It lacks any note on permissions/scopes or rate limits, which is the main remaining gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Headers and labeled examples make it skimmable, and it front-loads the required fields plus the calendarId source before diving into formats. There is some duplication — the whole-day date format appears in the Time Format block, again in the examples, and again in the schema descriptions — but the redundancy is defensible for an error-prone field.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter nested tool with no output schema, the description covers the highest-risk areas an agent would otherwise get wrong: time encoding, all-day end-date semantics, attendee ID sourcing, and the {id} return. It stops short of explaining the optional blocks (cc, alarms with RFC 2445 triggers, visibility, busy), relying entirely on the schema for those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description earns above that by explaining the interaction between wholeDayFlag and the two timestamp formats, the {id,type} attendee shape with 'member' vs 'email' resolution paths, and by supplying a concrete recurrenceRule payload. Optional fields like cc, alarms, visibility, busy and body carry no added narrative beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Create an event in a Dooray calendar") with the localized term 일정 등록, so there's no ambiguity about the operation. The create/update/delete distinction from siblings like update-calendar-event and delete-calendar-event is implied by the verb but never made explicit, which keeps it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the prerequisite flow — get calendarId from get-calendar-list (with the default=true shortcut) and resolve attendee IDs via get-my-member-info, get-project-member-list, get-member-list. It gives clear context for how to use the tool but never states when to prefer update-calendar-event over creating a new event, so no true exclusions are offered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-drive-folderA
Create a new folder in a Dooray drive.
Required:
driveId: The drive ID
folderId: Parent folder ID (where the new folder will be created)
name: Folder name
Example: { "driveId": "123", "folderId": "456", "name": "New Folder" }
Returns: ID of the created folder.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Folder name | |
| driveId | Yes | Drive ID | |
| folderId | Yes | Parent folder ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the agent knows this is a non-destructive write operation. The description adds that a parent folder is required and that the created folder ID is returned, but it does not mention permissions, naming conflicts, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, then lists required parameters, gives an example, and states the return value. The required-parameter list is somewhat redundant with the schema, but overall it is efficient and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter creation tool with annotations covering safety and no output schema, the description provides enough context: purpose, required inputs, an example, and the return value. It could be slightly more complete with error or permission behavior, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description repeats those definitions and adds a concrete example, which is mildly useful, but it does not add semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a new folder in a Dooray drive.' This clearly distinguishes it from sibling tools like create-task or upload-drive-file, which operate on different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description lists required parameters and gives an example, but never states when to use this tool versus alternatives or any preconditions. There is no explicit usage context or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
templateName: The name of the template
Optional Fields:
users: Default assignees (to) and CC recipients
body: Default task body content (markdown or HTML)
guide: Instructions shown when creating tasks from this template
subject: Default task subject/title
dueDate: Default due date (ISO 8601 format)
dueDateFlag: Whether due date is enabled
milestoneId: Default milestone
tagIds: Default tags
priority: Default priority (highest, high, normal, low, lowest, none)
isDefault: Set as default template (auto-fills when creating new tasks)
Due Date Flags:
dueDateFlag: false → No schedule
dueDateFlag: true, dueDate: null → Schedule exists but date is TBD
dueDateFlag: true, dueDate: "2024-01-15T12:00:00+09:00" → Schedule with specific date
Examples:
Simple template: {"projectId": "123", "templateName": "Bug Report"}
With body: {"projectId": "123", "templateName": "Feature Request", "body": {"mimeType": "text/x-markdown", "content": "## Description\n\n## Expected Behavior\n\n## Steps to Reproduce"}}
With defaults: {"projectId": "123", "templateName": "Sprint Task", "priority": "normal", "tagIds": ["tag1"], "isDefault": true}
Returns the created template ID.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Default task body content | |
| guide | No | Guide content shown when creating tasks | |
| users | No | Default users for tasks created from this template | |
| tagIds | No | Default tag IDs | |
| dueDate | No | Default due date (ISO 8601 format) | |
| subject | No | Default task subject | |
| priority | No | Default priority | |
| isDefault | No | Set as default template for this project | |
| projectId | Yes | Project ID where the template will be created | |
| dueDateFlag | No | Enable due date | |
| milestoneId | No | Default milestone ID | |
| templateName | Yes | Template name (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/non-destructive/open-world behavior. The description adds meaningful behavior beyond that: dueDateFlag state combinations, defaulting semantics, and that the created template ID is returned. It omits permission/auth requirements and uniqueness constraints, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then organized into required fields, optional fields, due-date flag rules, and examples. Some bullets repeat schema field descriptions, but the structure is appropriate for a 12-parameter tool with nested objects.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description usefully states that the created template ID is returned. It covers required and optional fields, due-date edge cases, and examples. It does not cover permission requirements, possible errors, or template-name uniqueness, but is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real semantics beyond the schema, especially the dueDateFlag combinations, priority values, body/guide mime types, and usage examples. Nested users object details are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Create a new task template in a Dooray project.' The word 'new' distinguishes it from update/delete/list template siblings, and the template definition adds useful context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains what templates are and gives examples, implying when the tool is useful. However, it does not explicitly say when to use this versus update-project-template or get-project-template, nor does it state when-not conditions, so usage guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-tagA
Create a new tag in a Dooray project.
Tag Types:
Individual Tag: A standalone tag without a group
Example:
{"name": "urgent", "color": "ff0000"}
Group Tag: A tag belonging to a tag group (using "groupName:tagName" format)
Example:
{"name": "Priority:High", "color": "ff0000"}Example:
{"name": "Priority:Medium", "color": "ffff00"}Tags with the same group name prefix will be grouped together
Color Format:
6-character hex color code without the # symbol
Examples: "ffffff" (white), "ff0000" (red), "c6eab3" (light green)
If not specified, a default color will be assigned
Response: Returns the created tag's ID:
{
"id": "12345"
}Tag Groups: After creating group tags, you can configure the group's behavior (mandatory, selectOne) using the update-tag-group tool.
Examples:
Individual tag:
{"projectId": "123", "name": "Bug", "color": "ff0000"}Group tag:
{"projectId": "123", "name": "Type:Feature", "color": "00ff00"}
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Tag name. Use "groupName:tagName" format for group tags, or just "tagName" for individual tags | |
| color | No | Tag color in hex format without # (e.g., "ffffff"). Optional. | |
| projectId | Yes | Project ID to create the tag in |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the bar is lower, yet the description adds real value: the default-color fallback behavior, the hex color format constraint, the fact that identical group prefixes auto-group, and the exact response shape ({id}). That is behavioral context the agent could not get from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core statement and organized under bold headings, so scanning is cheap. The examples section partially duplicates the JSON already given inline under Tag Types and the schema, which is mild redundancy but not damaging.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter creation tool with no output schema, the description covers purpose, both input modes, color constraints, the default-color behavior, the return value, and the natural next step (update-tag-group). Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics beyond the schema: the grouping side effect of the 'groupName:tagName' prefix and the concrete color-format rules with worked examples. Only 'projectId' gets no extra explanation, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new tag in a Dooray project') and immediately disambiguates the two modes of the operation (individual vs. group tag). An agent can distinguish this from get-tag, get-tag-list, and update-tag-group without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the two usage modes clearly: plain 'tagName' for standalone tags, 'groupName:tagName' when the tag should be grouped, and points to update-tag-group for configuring group behavior afterward. It stops short of stating prerequisites or when *not* to create a tag (e.g., duplicate handling), so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-taskA
Create a new task (업무) in a Dooray project. Required: projectId, subject.
DRAFT vs REGULAR: ASK USER which type to create:
Draft (isDraft: true): Returns URL to continue editing in browser. Use for complex tasks or when user wants to review.
Regular (isDraft: false, default): Saves immediately. Use when all info is available.
INTERACTIVE WORKFLOW:
Templates: Ask about get-project-template-list. If yes, use get-project-template for defaults.
Content: Get subject and body. If no template and no body, ask user for details.
Assignees/CC: Use get-my-member-info, get-project-member-list, or get-project-member-group-list. Format: {id, type: "member|group|email"}
Tags: Call get-tag-list. CRITICAL: Check mandatory tag groups - must select or creation fails (500 error). selectOne=true requires exactly ONE tag from group.
Key Points:
Priority defaults to "none"
Set parentPostId for subtasks (하위업무)
Extract PROJECT_ID from URLs like "https://nhnent.dooray.com/task/PROJECT_ID"
Examples:
Draft: {"projectId": "123", "subject": "Bug fix", "isDraft": true}
Regular: {"projectId": "123", "subject": "Deploy", "assignees": [{"id": "user1", "type": "member"}], "tagIds": ["tag1"], "priority": "high"}
Returns: Task object (regular) or {id, url, message} (draft).
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | List of CC recipients (참조). To get CC options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each CC object has {id: string, type: "member"|"group"|"email"}. | |
| body | No | Task body with formatted content. IMPORTANT: If user has not provided body content and no template is selected, ask the user for task details/description before creating the task. | |
| tagIds | No | Array of tag IDs to apply to this task. IMPORTANT: Check for mandatory tag groups using get-tag-list tool. Projects may require specific tags from mandatory tag groups. | |
| dueDate | No | Due date in ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ) | |
| isDraft | No | Set to true to create a draft task (임시 업무) that can be continued in the browser. Returns a URL for further editing. Default: false (creates regular task). | |
| subject | Yes | Task subject/title (required) | |
| priority | No | Task priority level (highest, high, normal, low, lowest, none). Default: "none" if not specified by user. | |
| assignees | No | List of assignees (담당자). To get assignee options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each assignee object has {id: string, type: "member"|"group"|"email"}. | |
| projectId | Yes | Project ID where the task will be created | |
| milestoneId | No | Milestone ID to associate with this task | |
| parentPostId | No | Parent task ID to create this as a subtask (하위업무). Omit to create a regular task. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: draft creation returns a URL instead of persisting, mandatory tag groups cause a 500 error if unsatisfied, and selectOne groups require exactly one tag. This is high-value failure-mode disclosure, though permission/auth requirements and whether creation is reversible are not addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and required params, then uses bolded sections and numbered steps so structure is easy to scan. It is somewhat long and repeats the assignee/tag guidance that also lives in the schema, but every block is functional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, nested-object creation tool with no output schema, the description supplies the draft/regular return shapes and the critical tag-prerequisite rule. Remaining gaps (auth, error handling beyond the 500 note) are minor given the rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter including the assignee/CC object shape and enum values. The description adds only a marginal detail (extracting projectId from a Dooray URL) plus priority defaulting, which is already in the schema — baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Create a new task (업무) in a Dooray project') and immediately names the two required parameters. It is trivially distinguishable from siblings like update-task, create-task-comment, and get-task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to ask the user whether to create a draft vs. regular task and gives the conditions for each. It also enumerates a step-by-step interactive workflow with named prerequisite tools (get-project-template, get-tag-list, get-my-member-info), so when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
Adding progress updates or status notes
Responding to questions or discussions
Logging information related to the task
Attaching files with context
When to Use:
create-task-comment: For adding discussion, updates, or notes (댓글)
update-task: For modifying the task description, title, or metadata
URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID":
Extract the first numeric ID after "/task/" as projectId
Extract the second numeric ID as taskId
File Attachments:
To attach files, first upload them using the file upload API
Then provide the returned file IDs in the attachFileIds parameter
See: https://helpdesk.dooray.com/share/pages/9wWo-xwiR66BO5LGshgVTg/2939987647631384419
Content Format:
Use "text/x-markdown" for markdown formatting (recommended)
Use "text/html" for rich HTML content
Body format: {"mimeType": "text/x-markdown", "content": "..."}
Examples:
Simple comment: { "projectId": "123456", "taskId": "789012", "body": {"mimeType": "text/x-markdown", "content": "Progress update: Completed initial implementation"} }
With markdown: { "projectId": "123456", "taskId": "789012", "body": { "mimeType": "text/x-markdown", "content": "## Test Results\n\n- ✅ All unit tests passing\n- ✅ Integration tests passed\n- ⏳ Performance testing in progress" } }
With file attachments: { "projectId": "123456", "taskId": "789012", "body": {"mimeType": "text/x-markdown", "content": "See attached screenshots"}, "attachFileIds": ["file123", "file456"] }
Returns: Created comment with ID.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Comment content with format | |
| taskId | Yes | Task ID to add comment to | |
| projectId | Yes | Project ID where the task belongs | |
| attachFileIds | No | Array of file IDs to attach (optional). Files must be uploaded first using the file upload API. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the mutation/safety profile is known. The description adds real behavioral context beyond that: the attachment workflow requires uploading files first via the file upload API and then passing returned IDs, and it states the return shape ("Created comment with ID"). It does not cover permission requirements or failure modes, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well structured and front-loaded: purpose, then routing decision, then URL parsing, then attachments, then format, then examples. The main cost is length — three example payloads where the first two differ only in content strings, which could be collapsed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Handles the tool's real complexity: a nested body object, a required format enum, an optional file-attachment path with a prerequisite step, and ID extraction from a URL. It also states the return value even though no output schema exists, so an agent has everything needed to invoke it correctly on the first try.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline would be 3; the description earns above baseline by explaining how to derive projectId and taskId from a Dooray URL, and by spelling out the body envelope shape with mimeType/content examples. The attachFileIds ordering constraint is also restated with operational meaning rather than just a type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Add a comment to an existing Dooray task") and immediately separates it from the nearest alternative by noting it is "separate from editing the task body itself." An agent can distinguish this from update-task, update-task-body, and update-task-comment without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Includes an explicit "When to Use" block contrasting create-task-comment (discussion, updates, notes) against update-task (description, title, metadata). It also enumerates concrete use cases (progress updates, answering questions, logging info, attaching files with context), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-wiki-pageA
Create a new wiki page.
Required: wikiId, subject, content Optional: attachFileIds, referrers
IMPORTANT - parentPageId:
parentPageId is practically required for creating new pages
Without parentPageId, API returns 400 error ("입력한 내용에 오류가 있습니다")
To create a page, first use get-wiki-page-list to find the parent page (e.g., Home page)
Then provide that page's ID as parentPageId
Workflow:
Call get-wiki-list to get wikiId
Call get-wiki-page-list with wikiId to find parent page (usually "Home")
Call create-wiki-page with parentPageId set to the Home page ID
Content is in markdown format. Returns: id, wikiId, parentPageId, version.
| Name | Required | Description | Default |
|---|---|---|---|
| wikiId | Yes | Wiki ID (required) | |
| content | Yes | Page content in markdown (required) | |
| subject | Yes | Page title (required) | |
| referrers | No | Referrers (watchers) | |
| parentPageId | No | Parent page ID (practically required - without this, API returns 400 error) | |
| attachFileIds | No | Attachment IDs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, open-world mutation; the description adds the critical failure mode (400 error without parentPageId), the exact error text, the markdown content format, and the returned fields (id, wikiId, parentPageId, version). That is substantial behavioral context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then bolded sections for required/optional, the parentPageId pitfall, and the workflow, which makes it scannable. There is mild redundancy: the required/optional lists duplicate the schema, and parentPageId appears in neither list before being discussed separately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation with no output schema, the description covers prerequisites, ordering, the main failure mode, content format, and return values. Nothing an agent needs to invoke it successfully is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds real meaning by flagging parentPageId as effectively mandatory and by naming the fields of the referrers/attachment inputs. The required/optional lists largely restate the schema, which caps the score below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new wiki page') and clearly differs from siblings like update-wiki-page, move-wiki-page, and create-wiki-page-comment. An agent can identify it immediately without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit three-step workflow naming the prerequisite tools (get-wiki-list, get-wiki-page-list) and the condition under which each is needed. It also warns that parentPageId is 'practically required' despite not being in the required array, which is precisely the kind of when-to-use guidance that prevents failed calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create-wiki-page-commentB
Create a comment on a wiki page. Content is in markdown format. Returns: id.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) | |
| content | Yes | Comment content in markdown (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it is a non-destructive write (readOnlyHint=false, destructiveHint=false, openWorldHint=true). The description adds that content must be markdown and that an id is returned, but says nothing about permissions, whether the page must be open for comments, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste, front-loaded with the action and resource. The return value is stated inline rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only three fully-documented required parameters, no output schema, and annotations covering the safety profile, the description supplies what an agent needs to invoke it correctly. It is slightly thin on preconditions for commenting on a page, but no major gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema. The description's 'Content is in markdown format' restates the schema's own parameter description rather than adding new semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: create a comment on a wiki page, which is clearly distinct from sibling create-wiki-page and update-wiki-page-comment. It omits explicit sibling differentiation but the verb+resource pair is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no mention of alternatives such as create-task-comment or update-wiki-page-comment. Usage is only implied by the verb 'Create'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-attachmentADestructive
Delete a file attachment from a Dooray task.
Required Parameters:
projectId: The project ID
taskId: The task ID (post ID)
fileId: The file ID to delete (get from get-attachment-list)
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID to delete | |
| taskId | Yes | Task ID (post ID) | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, and the description adds useful context: the deletion is irreversible, the file is permanently removed from the task, and the return is a success message. It does not cover permissions or error behavior, but it adds meaningful destructive-operation context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, followed by organized parameter, example, return, and warning sections. Some parameter text duplicates the schema, but the overall length remains appropriate for a destructive tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema destructive tool, the description covers the required inputs, an example call, the return message, and the irreversibility warning. Minor gaps around authorization or failure modes remain, but the core invocation context is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by identifying where fileId comes from (get-attachment-list) and provides a concrete example payload with all three IDs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Delete a file attachment from a Dooray task.' This clearly distinguishes it from sibling tools such as delete-drive-file, delete-wiki-page-file, and delete-task-comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear prerequisite by telling the agent to get the fileId from get-attachment-list. It does not explicitly compare when to use this versus similar deletion tools, but the task-attachment scope is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-calendar-eventADestructive
Delete a Dooray calendar event (일정 삭제).
Recurring Events (deleteType):
this: Only this occurrence (default)
wholeFromThis: This and following occurrences
whole: All occurrences
For a recurring event, use the occurrence event ID from get-calendar-event-list.
Examples:
{"calendarId": "123", "eventId": "456"}
{"calendarId": "123", "eventId": "456", "deleteType": "whole"}
Returns: success message.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Event ID | |
| calendarId | Yes | Calendar ID | |
| deleteType | No | Range for recurring events (default: this) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is covered. The description adds real behavioral context the annotations don't carry: the three deletion scopes for recurring events and the prerequisite of using the occurrence event ID. It could go further on irreversibility or permission requirements, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with purpose, then groups recurring-event semantics under a bolded heading and ends with concrete examples. Every section earns its place; the parenthetical Korean gloss is minor noise but harmless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter destructive tool with no output schema, the description covers purpose, mode semantics, prerequisite lookup, and even the return value ('success message'). The only remaining gap is the absence of an explicit irreversibility warning, though destructiveHint already signals this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns extra credit by expanding deleteType far beyond the schema's one-line description, enumerating each enum value and stating the default ('this'), which is exactly the semantics an agent needs to choose correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Delete a Dooray calendar event') and scopes it against siblings like update-calendar-event and create-calendar-event. The recurring-event subsection further refines what "delete" means in this context, so an agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete conditions for the deleteType modes and explicitly directs the agent to get-calendar-event-list to obtain the correct occurrence event ID for recurring events. It stops short of explicitly stating when not to use it (e.g., to cancel a single instance the agent should use update instead), so it is clear guidance without full exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-drive-fileADestructive
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:
driveId: The drive ID
fileId: File ID to permanently delete
Example: { "driveId": "123", "fileId": "456" }
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID (must be in trash) | |
| driveId | Yes | Drive ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the operation as destructive and non-read-only. The description adds meaningful behavioral context by emphasizing that deletion is permanent and that the file must already be in the trash, although it does not discuss permissions, error cases, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the permanent-delete scope, and then immediately gives the critical prerequisite. The required-parameters list and compact example are easy to scan without wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive two-parameter tool with full schema coverage and annotations covering safety traits, the description supplies the essential prerequisite and alternative action. No output schema exists, but the return behavior is not necessary for correct invocation here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description repeats the required parameters and gives an example, but adds little semantic detail beyond the schema, which already notes that fileId must be in trash.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: permanently delete a file from a Dooray drive trash. It distinguishes this operation from moving a file to trash by explicitly naming move-drive-file as the prerequisite alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the key precondition that the file must already be in the trash folder, and it names the exact alternative tool and parameter needed to get the file there first. This gives an agent explicit when-to-use and how-to-prepare guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-project-templateADestructive
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:
projectId: Project ID where the template belongs
templateId: Template ID to delete
How to get template IDs:
Use the get-project-template-list tool to list all templates and get their IDs.
Example:
Delete template: {"projectId": "123456", "templateId": "789012"}
Returns success status.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID where the template belongs | |
| templateId | Yes | Template ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds meaningful behavioral context by emphasizing that the deletion cannot be undone and by stating that it returns a success status.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The warning is front-loaded and the sections are easy to scan. The Required Fields section largely duplicates the schema and the example is somewhat redundant, but the overall structure remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive template-deletion tool with no output schema, the description covers the irreversible nature of the action, both required IDs, how to obtain the template ID, and the success response. The annotations carry the rest of the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented. The description adds value by explaining where to obtain templateId via get-project-template-list and includes a concrete example payload, going beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: delete an existing task template from a Dooray project. It clearly distinguishes this from sibling operations such as get-project-template, create-project-template, and update-project-template by naming the template resource and deletion action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by warning that the action is permanent and by directing the agent to get-project-template-list to obtain template IDs. It does not explicitly state when not to use it or contrast it with update-project-template, but the destructive purpose is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-task-commentADestructive
Delete a comment (댓글) on a Dooray task. This cannot be undone.
Confirm the target with get-task-comment before deleting.
Examples:
{"projectId": "123", "taskId": "456", "commentId": "789"}
Returns: success message.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID | |
| commentId | Yes | Comment ID | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the irreversibility is known; the description echoes it ('This cannot be undone') rather than adding new behavioral detail. The confirm-first step is the only genuine addition, and it doesn't discuss permissions or what happens to replies/linked data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the irreversibility warning and confirmation step, then an example. The format is efficient for a destructive tool, though the 'Returns: success message' line and Korean gloss are minor extras.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param destructive tool with no output schema, the description covers purpose, irreversibility, a pre-check step, an example call, and the return shape. Missing only permission/authorization requirements and scope of what gets removed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so projectId, taskId, and commentId are all documented in the schema. The worked example shows plausible value shapes but adds no semantics beyond the structured fields, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a comment on a Dooray task) and the Korean gloss disambiguates the resource. Siblings like update-task-comment and delete-wiki-page-comment are clearly differentiated by the 'task' qualifier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to confirm the target with get-task-comment before deleting, which gives an agent a concrete prerequisite workflow. It doesn't state when the operation should be avoided entirely or name alternatives beyond the read counterpart, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-wiki-pageADestructive
Delete a wiki page (위키 페이지 삭제).
Confirm the target with get-wiki-page before deleting, and check child pages with get-wiki-page-tree.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the risk profile is known. The description adds useful nuance by implying child pages are affected and must be checked first, but it never states whether the delete is permanent, what happens to children/attachments/comments, or whether confirmation is enforced server-side.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and followed by the safety workflow. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive tool with full schema coverage and clear safety annotations, this covers the essentials plus a verification workflow. The remaining gap is the consequence model (irreversibility, child-page fate) that an agent would want before committing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with only two required parameters (wikiId, pageId), both fully documented in the schema. The description adds no format, sourcing, or scoping guidance for either ID, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a wiki page'), which cleanly separates it from the many sibling delete tools (delete-wiki-page-comment, delete-wiki-page-file, delete-drive-file). The Korean gloss adds nothing but costs nothing. It does not explicitly name a sibling alternative, so it falls just short of 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions: confirm the target with get-wiki-page and inspect children with get-wiki-page-tree. That is real, actionable routing advice tied to named sibling tools. It stops short of saying when NOT to delete or what to do if children exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-wiki-page-commentCDestructive
Delete a comment on a wiki page.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) | |
| commentId | Yes | Comment ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and readOnlyHint=false, so the safety profile is covered by structured data. The description adds nothing beyond that – no note that the operation is irreversible, what permissions are needed, or what happens on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is efficient, though the brevity comes at the cost of omitting any warning an agent would want for a destructive call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, required-3-param tool with no output schema, the description should at minimum flag irreversibility or confirmation expectations. Those are absent, leaving an agent with a mutation that has no behavioral framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with all three IDs documented and required, so the schema does the heavy lifting. The description adds no meaning about the identifiers or their relationships.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Delete a comment on a wiki page') that clearly distinguishes it from create/update/get-wiki-page-comment siblings. It never names those alternatives, but the operation type alone is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus update-wiki-page-comment or delete-task-comment, and no mention of prerequisites or that the deletion is permanent. The agent must infer all of this from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete-wiki-page-fileADestructive
Delete a file attached to a Dooray wiki page.
Required Parameters:
wikiId: The wiki ID
pageId: The wiki page ID
fileId: The file ID to delete (get from wiki page detail API: $.result.files.id or $.result.images.id)
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID to delete | |
| pageId | Yes | Wiki page ID | |
| wikiId | Yes | Wiki ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, and the description reinforces this with concrete consequences: the action is irreversible and the file is permanently removed from the page. It also states the response is a success confirmation, adding detail beyond the structured fields, though permission/ownership requirements stay unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-sentence purpose, then organized into required params, example, returns, and note. Slightly padded by a JSON example that merely restates the schema, but no section is misleading or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive three-param tool with no output schema, the definition covers the operation semantics, how to obtain the key identifier, the irreversibility warning, and the return shape. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three IDs are documented by the schema itself, establishing a baseline of 3. The description adds real value by explaining where to source fileId ($.result.files.id or $.result.images.id), but says nothing extra about wikiId or pageId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: delete a file attached to a Dooray wiki page. The compound scope (wiki page file, not the page or a drive file) is clear enough to separate it from delete-wiki-page, delete-attachment, and delete-drive-file, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the resource boundary rather than stated: an agent can infer this deletes page attachments only. There is no explicit when-to-use/when-not guidance pointing to delete-wiki-page or delete-attachment for adjacent operations, though the note on where to obtain fileId is a practical aid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
{"projectId": "123", "taskId": "456", "saveDir": "/tmp/task-456/"}
Returns: count, succeeded [{fileId, savedTo, size}], failed [{fileId, name, error}].
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID (post ID) | |
| saveDir | Yes | Local directory to save the files into (created if missing) | |
| overwrite | No | Overwrite files that already exist (default: false) | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false, openWorldHint=true, destructiveHint=false, so write-side effects need description coverage. The description supplies real substance: original filenames preserved, non-overwriting default, and partial-failure semantics where successful downloads survive and the result lists both sets. It stops short of stating filesystem permission or auth requirements, which is the main remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-sentence purpose, then behavior, then a compact example, then the return shape. Every sentence adds information; nothing restates the tool name or wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by naming the return fields (count, succeeded[fileId, savedTo, size], failed[fileId, name, error]). Combined with the overwrite and partial-failure rules, an agent has enough to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the consequence of overwrite=true (existing files are not overwritten unless set) and by giving a concrete example populating projectId, taskId, and saveDir. It also notes saveDir is created if missing, which is behavioral meaning beyond the raw field type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope: 'Download every file attached to a Dooray task into a local directory.' The word 'every' distinguishes it from the single-file sibling download-attachment, so an agent can route correctly without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Bulk-vs-single usage is only implied by 'every file attached to a task' against siblings like download-attachment and get-attachment-list. There is no explicit 'use this when... instead of download-attachment/upload-attachment' statement or exclusion, so selection still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download-attachmentA
Download a file attachment from a Dooray task.
Required Parameters:
projectId: The project ID
taskId: The task ID (post ID)
fileId: The file ID (get from get-attachment-list)
Optional:
savePath: Local path to save the file. Can be a directory (filename auto-detected) or full file path. Recommended for large files.
Examples:
Save to file: { "projectId": "123", "taskId": "456", "fileId": "789", "savePath": "/tmp/downloads/" }
Base64 (small files): { "projectId": "123", "taskId": "456", "fileId": "789" }
Response Fields:
success: Whether download succeeded
fileId: The file ID
filename: Original filename
contentType: MIME type of the file
contentLength: File size in bytes
savedTo: (when savePath used) Local path where file was saved
base64Data: (when savePath omitted) Base64 encoded file content
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID | |
| taskId | Yes | Task ID (post ID) | |
| savePath | No | Local path to save (directory or full path). Recommended for large files. | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag readOnlyHint=false and openWorldHint=true, and the description adds real value on top: it explains the two output modes (base64 in-memory vs on-disk savePath), filename auto-detection for directories, and documents the full response field set. It omits overwrite semantics for savePath and permission/error behavior, which matters for a tool writing to local disk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by grouped required/optional/response sections and two tight examples. The response-field block is long but earns its place since no output schema exists; a little redundancy between the parameter list and the examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape (success, filename, contentType, contentLength, savedTo, base64Data) and the mode-selection logic, which is what an agent needs to call and interpret it. Missing only failure/overwrite behavior and any size limit guidance beyond 'small files' vs 'large files'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so semantics are already documented; the description nevertheless adds 'Can be a directory (filename auto-detected) or full file path' for savePath and its large-file recommendation, plus concrete example payloads for both modes. Genuine value beyond the schema, though no format constraints or error cases are given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a file attachment from a Dooray task'), which cleanly distinguishes it from the drive/wiki download siblings in the tool list. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'fileId: get from get-attachment-list' gives an explicit prerequisite and routes the agent to the sibling that produces the ID, and 'Recommended for large files' clarifies when to use savePath. It stops short of naming when to prefer download-all-attachments or the drive/wiki download variants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download-drive-fileA
Download a file from a Dooray drive.
Required:
driveId: The drive ID
fileId: The file ID to download
Optional:
savePath: Local path to save the file. Can be a directory (filename auto-detected) or full file path. Recommended for large files.
Examples:
Save to file: { "driveId": "123", "fileId": "456", "savePath": "/tmp/downloads/" }
Save with name: { "driveId": "123", "fileId": "456", "savePath": "/tmp/myfile.pdf" }
Base64 (small files): { "driveId": "123", "fileId": "456" }
Tip: If you only have a file ID, use get-drive-file-meta first to get the driveId.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID to download | |
| driveId | Yes | Drive ID | |
| savePath | No | Local path to save (directory or full path). Recommended for large files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false and openWorldHint=true, and the description adds genuinely new behavioral detail: without savePath the content comes back as base64 suited to small files, while savePath writes to local disk (which explains the readOnlyHint=false despite being a 'download'). It doesn't cover error behavior for invalid IDs or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Required/optional split and front-loaded first sentence make it easy to scan, and the examples are illustrative. It is slightly longer than needed since the three examples largely restate the savePath semantics already described in prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by explaining the two return modes (saved file vs. base64) and their size implications. Combined with the prerequisite lookup tip, an agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema by clarifying that savePath accepts either a directory (filename auto-detected) or a full file path, and by disclosing the implicit third behavior — base64 return when savePath is omitted — which the schema never states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Download a file from a Dooray drive,' which distinguishes it from download-attachment, download-wiki-page-file, and download-wiki-attach-file by the drive resource. It does not explicitly name those siblings, so the differentiation is implicit rather than spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operating context: required IDs, optional savePath, and a concrete routing tip — 'If you only have a file ID, use get-drive-file-meta first to get the driveId' — which points to the prerequisite sibling tool. It lacks explicit when-not-to-use guidance versus the other download tools, keeping it at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download-wiki-attach-fileA
Download a file from a Dooray wiki using attach file ID.
Required Parameters:
wikiId: The wiki ID
attachFileId: The attach file ID (get from wiki page detail API: $.result.files.attachFileId or $.result.images.attachFileId)
Optional:
savePath: Local path to save the file. Can be a directory (filename auto-detected) or full file path. Recommended for large files.
Examples:
Save to file: { "wikiId": "123", "attachFileId": "456", "savePath": "/tmp/downloads/" }
Base64 (small files): { "wikiId": "123", "attachFileId": "456" }
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.
| Name | Required | Description | Default |
|---|---|---|---|
| wikiId | Yes | Wiki ID | |
| savePath | No | Local path to save (directory or full path). Recommended for large files. | |
| attachFileId | Yes | Attach file ID (from page detail API) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, and the description is consistent: it explains that the tool writes to a local savePath when provided, which accounts for the non-read-only hint. It adds useful behavior detail beyond the annotations (auto-detected filename, base64 fallback), though it says nothing about auth or size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded first sentence carries the core purpose, and the section headers plus examples are scannable. The 'Note' at the end partially restates the attachFileId/fileId point already made up top, which is minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the return shape implicitly through the base64 example when savePath is omitted, which is the one return detail an agent needs. Remaining gaps (error behavior on bad IDs, binary vs. text response) are modest for a three-parameter download tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by documenting where attachFileId originates (the exact JSON paths in the page-detail response) and by explaining savePath's dual semantics (directory with auto-detected filename vs. full file path).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a file from a Dooray wiki using attach file ID') and calls out the key disambiguation between attachFileId and fileId. It does not, however, differentiate itself from the nearby sibling download-wiki-page-file, which is the most likely confusion point.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit precondition for use ('use this endpoint when you have an attachFileId from the page detail API's $.result.files.attachFileId'), plus a clear rule of thumb: savePath for large files, base64 for small ones. It lacks an explicit alternative branch for when only a fileId is available, but the guidance is otherwise actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download-wiki-page-fileA
Download a file attached to a Dooray wiki page.
Required Parameters:
wikiId: The wiki ID
pageId: The wiki page ID
fileId: The file ID (get from wiki page detail API: $.result.files.id or $.result.images.id)
Optional:
savePath: Local path to save the file. Can be a directory (filename auto-detected) or full file path. Recommended for large files.
Examples:
Save to file: { "wikiId": "123", "pageId": "456", "fileId": "789", "savePath": "/tmp/downloads/" }
Base64 (small files): { "wikiId": "123", "pageId": "456", "fileId": "789" }
Response Fields:
success: Whether download succeeded
fileId: The file ID
filename: Original filename
contentType: MIME type of the file
contentLength: File size in bytes
savedTo: (when savePath used) Local path where file was saved
base64Data: (when savePath omitted) Base64 encoded file content
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID (from page detail API) | |
| pageId | Yes | Wiki page ID | |
| wikiId | Yes | Wiki ID | |
| savePath | No | Local path to save (directory or full path). Recommended for large files. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this as non-read-only and open-world; the description fills in the missing behavior — that it writes a file to a local path and returns savedTo, or falls back to base64Data when savePath is omitted. That dual-mode behavior is the key thing an agent needs and is not in the annotations. It omits auth requirements and whether an existing file at savePath is overwritten.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-line purpose, then required/optional params, two concrete examples, and response fields — a natural agent-reading order. It runs long, and the response-field list partially duplicates what the examples imply, but nothing is wasted given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the explicit Response Fields list is genuinely necessary and well supplied; param sourcing and the savePath/base64 branch are both covered. The remaining gap is contextual routing against the sibling wiki/drive download tools, which a caller must resolve on its own.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds value beyond the schema: it documents the exact JSON paths to obtain fileId from the page detail API and clarifies that savePath can be either a directory (filename auto-detected) or a full file path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Download a file attached to a Dooray wiki page') that an agent can act on immediately. It does not, however, distinguish itself from the sibling download-wiki-attach-file (or download-attachment / download-drive-file), so an agent cannot tell from the text which downloader applies to which context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real guidance on when to use savePath (large files) vs. omitting it (base64, small files), and tells the agent where fileId comes from ($.result.files.id / $.result.images.id). But it never states when to prefer this tool over the near-identical sibling download-wiki-attach-file, which is the main ambiguity facing a caller.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-attachment-listBRead-onlyIdempotent
Get list of file attachments for a Dooray task.
Required Parameters:
projectId: The project ID
taskId: The task ID (post ID)
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:
totalCount: Total number of files
data[]: Array of file objects
id: File ID
name: File name
size: File size
mimeType: MIME type
createdAt: Creation timestamp (ISO-8601)
creator: Creator info (type, member.organizationMemberId)
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID (post ID) | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and open-world, so safety is covered; the description adds real value by disclosing the filter (only 'general' type files come back) and by enumerating the response shape. It does not mention permission requirements or ordering/pagination, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the note about file types is well placed, but the required-parameters block restates the schema verbatim and the JSON example duplicates the same two fields, adding length without information. The return-fields list is long yet arguably justified since no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so thoroughly (totalCount, data[] with id, name, size, mimeType, createdAt, creator). For a simple two-param read tool this is close to complete; only error/empty behaviors and whether all files are returned in one page are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both required parameters are already documented in the schema with identical wording and identical semantics; the description merely repeats them plus a redundant example. No additional meaning (formats, where to find the IDs) is contributed, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get list of file attachments for a Dooray task') and scopes it to 'general' type files, which separates it from download-all-attachments and get-attachment-metadata in spirit. It never names a sibling to route against, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no mention of the alternatives in the sibling set (get-attachment-metadata, download-attachment, download-all-attachments). The 'general type only' note is a scoping caveat, not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-attachment-metadataARead-onlyIdempotent
Get metadata of a specific file attachment in a Dooray task.
Required Parameters:
projectId: The project ID
taskId: The task ID (post ID)
fileId: The file ID (get from get-attachment-list)
Example: { "projectId": "123456", "taskId": "789012", "fileId": "abc123" }
Returns: File metadata including id, name, size, mimeType, createdAt, and creator info.
Response Fields:
id: File ID
name: File name
size: File size
mimeType: MIME type
createdAt: Creation timestamp (ISO-8601)
creator: Creator info (type, member.organizationMemberId)
Note: This returns metadata only, not the file content. Use download-attachment to get the actual file.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID | |
| taskId | Yes | Task ID (post ID) | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is known. The description adds genuinely non-schema context: the return is metadata only, timestamps are ISO-8601, and the creator shape is described. It does not discuss failure modes (e.g., missing file/task) or permissions, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and required parameters, but the 'Returns' line and the 'Response Fields' list largely duplicate each other, and the example JSON adds little beyond the schema's required-field list. Useful, but roughly a third of the text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing return values, and it does so item by item (id, name, size, mimeType, createdAt, creator). Combined with the input sourcing hints, an agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description earns extra credit by clarifying that taskId is a post ID and that fileId must be sourced from get-attachment-list, which the schema alone does not convey. The example payload also demonstrates the three required IDs in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get metadata of a specific file attachment) scoped to a Dooray task. It explicitly distinguishes itself from siblings by noting it returns metadata only and pointing to download-attachment for content, so an agent can differentiate it from get-attachment-list without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells you where to get fileId (get-attachment-list) and names the explicit alternative for retrieving file content (download-attachment), including the condition that separates the two. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-calendar-eventARead-onlyIdempotent
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:
{"calendarId": "123", "eventId": "456"}
Returns: event with body, users (from = organizer, to = attendees, cc) and each attendee status (accepted, declined, tentative, not_confirmed), recurrenceRule and files.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Event ID | |
| calendarId | Yes | Calendar ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds genuine behavioral context by enumerating what the response contains (body, organizer/attendee mapping, per-attendee status values, recurrenceRule, files). Since no output schema exists, this return-shape disclosure carries real weight; it stops short of 5 for omitting auth or pagination notes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and the required-parameter constraint, then routing, then a minimal example, then return contents. Every element is short and earns its place; the inline example is small enough to justify itself as a format cue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-required-param read-only getter with no output schema, the description covers ID provenance and the returned fields, which is what an agent needs to call it and interpret results. The only gap is nothing about error behavior for invalid IDs, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are required, so baseline would be 3. The description adds meaning beyond the bare 'Event ID'/'Calendar ID' schema text by specifying that the values come from get-calendar-event-list's calendar.id and id fields, and the example shows the concrete wire shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get details of a Dooray calendar event') and immediately distinguishes it from the sibling get-calendar-event-list by pointing there as the source of the IDs. An agent can tell single-event retrieval apart from listing without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says both calendarId and eventId are required and where to obtain them ('Take them from get-calendar-event-list (calendar.id and id)'), which is real routing guidance. It lacks explicit when-not-to-use language, but the list-vs-detail split is effectively established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-calendar-event-listARead-onlyIdempotent
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:
calendars: Calendar IDs from get-calendar-list (default: all calendars)
postType: toMe (I am an attendee), toCcMe (attendee or CC), fromToCcMe (organizer, attendee or CC)
category: general (일반 일정), post (업무 마감일), milestone
Examples:
Today: {"timeMin": "2026-10-22T00:00:00+09:00", "timeMax": "2026-10-23T00:00:00+09:00"}
This month in one calendar: {"timeMin": "2026-10-01T00:00:00+09:00", "timeMax": "2026-11-01T00:00:00+09:00", "calendars": ["123"]}
Returns: events with id, calendar {id, name}, subject, startedAt, endedAt, wholeDayFlag, location, category, recurrenceType.
| Name | Required | Description | Default |
|---|---|---|---|
| timeMax | Yes | Range end, exclusive (ISO 8601). Range must be 1 year or less | |
| timeMin | Yes | Range start, inclusive (ISO 8601, e.g. 2026-10-22T00:00:00+09:00) | |
| category | No | Event category | |
| postType | No | Filter by my role in the event | |
| calendars | No | Calendar IDs to include (default: all) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so safety is covered. The description adds real behavioral context beyond that: the list excludes event bodies and attendees, and subscription calendars are not included — non-obvious exclusions an agent would otherwise miss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads required parameters and the range constraint, then filters, then examples. The bullet structure and inline examples each carry distinct information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by listing the returned event fields (id, calendar, subject, startedAt, endedAt, wholeDayFlag, location, category, recurrenceType), so an agent knows the shape of the result and the exclusions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema: it glosses the postType enum values in human terms (toMe = I am an attendee, etc.), explains the category enum (general/post/milestone), and clarifies calendars defaults to all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get Dooray calendar events (일정 목록) in a time range') and distinguishes itself from the sibling get-calendar-event by noting the list omits body and attendees and pointing to that tool for details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names required parameters (timeMin inclusive, timeMax exclusive), the 1-year range constraint, and the exact alternative to use for full event details. Filter semantics and two worked examples remove any ambiguity about how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-calendar-listARead-onlyIdempotent
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:
{} (first 20 calendars)
{"size": 100}
Returns: totalCount and calendars with id, name, type (private, project), default, role.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 0) | |
| size | No | Items per page (default: 20, max: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, openWorldHint), so the description's burden is lower, and it does add value: subscription-calendar exclusion, the meaning of default=true, and the fields returned. It doesn't mention ordering, pagination behavior beyond the examples, or any auth/permission requirements, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and scope, then downstream usage, then two concrete examples and a one-line return summary. Every line carries information an agent would otherwise have to infer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read tool with no output schema, the definition covers what is returned (totalCount plus id, name, type, default, role), what is excluded, and how the output feeds sibling tools. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so page and size are already documented; the description adds the default page size implicitly through the '{} (first 20 calendars)' example and shows a realistic size=100 call. It still says nothing about what 'page' does in combination with size, so the added meaning is useful but partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the list of Dooray calendars') and immediately bounds the scope: only calendars the user can access, and subscription calendars are excluded. That scope statement, plus the note that default=true marks the user's own calendar, lets an agent distinguish this from get-calendar-event-list without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes downstream use: 'Use the returned calendar id for create-calendar-event, or to filter get-calendar-event-list,' naming both siblings and the condition that selects them. It also states what is NOT returned (subscription calendars), which is a real exclusion rather than implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-drive-file-listARead-onlyIdempotent
Get list of files and folders in a Dooray drive.
Required: driveId Optional: parentId (use "root" for top-level), type filter, pagination
Examples:
Top-level: { "driveId": "123", "parentId": "root" }
Subfolder: { "driveId": "123", "parentId": "456" }
Only folders: { "driveId": "123", "parentId": "root", "type": "folder" }
With pagination: { "driveId": "123", "parentId": "root", "page": 0, "size": 20 }
Returns: file/folder ID, name, type, size, dates, creator info.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-based) | |
| size | No | Page size | |
| type | No | Filter by type | |
| driveId | Yes | Drive ID | |
| parentId | No | Parent folder ID (use "root" for top-level) | |
| subTypes | No | Filter by subTypes (e.g. "root,trash") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds useful context by summarizing the returned file/folder fields and illustrating pagination and root-folder behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then required/optional parameters, examples, and return values. It is compact and every section contributes to correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description is complete enough: it covers required inputs, common call patterns, pagination, type filtering, and the main fields returned. No critical caller information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are already documented in the schema. The description provides examples that clarify parentId and pagination, but these largely duplicate schema information and it omits any mention of subTypes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: listing files and folders in a Dooray drive. It does not explicitly distinguish this tool from siblings such as get-drive-file-meta or get-drive-list, so an agent must infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful required/optional parameter guidance and concrete examples for top-level, subfolder, type-filtered, and paginated calls. However, it does not state when to use this tool rather than sibling tools, or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-drive-file-metaARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, so the safety profile is covered. The description adds value by enumerating the returned fields (driveId, version, creator, parent info) and explaining why driveId matters, though it does not discuss permissions or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded blocks (purpose, required param, returns, note) with bold labels and zero filler. Every line conveys actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by listing the return fields and explaining the driveId hand-off for follow-up calls. Input, output, and next-step usage are all covered for this simple single-param tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema description coverage is 100%, so the schema already fully documents 'fileId'. The description merely restates that fileId is required without adding format or sourcing details, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get file metadata by file ID') and adds a differentiating scope note ('without needing drive ID'), which separates it from drive-scoped siblings like get-drive-file-list and download-drive-file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Note' tells the agent what to do next with the returned driveId for download or other drive-scoped operations, giving clear procedural context. It does not explicitly name when to prefer a sibling (e.g., get-attachment-metadata) or state exclusions, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-drive-listARead-onlyIdempotent
Get list of accessible Dooray drives.
Drive Types:
private: Personal drive (default)
project: Project drives (use scope to filter private/public projects)
Examples:
Personal drive: { "type": "private" }
Project drives: { "type": "project", "scope": "private" }
Public project drives: { "type": "project", "scope": "public" }
Returns: drive ID, name, type, and associated project info.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Drive type: private or project | |
| scope | No | Project scope (only when type=project) | |
| state | No | Project state filter (default: active) | |
| projectId | No | Filter by project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety and repeatability are covered. The description adds useful context by naming the returned fields (drive ID, name, type, project info), which substitutes for the absent output schema, but says nothing about ordering, limits, or result size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then organized under two short bold headers. The examples are somewhat repetitive with the enum descriptions in the schema, but each line is short and the structure makes scanning easy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the returned fields, and annotations cover the read-only/idempotent profile. Remaining gaps are pagination and ordering behavior, which an agent listing drives might reasonably want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by showing how 'type' and 'scope' combine in practice and by stating that 'private' is the default drive type. The conditional pairing of scope with type=project is reinforced with worked examples rather than only the schema's parenthetical note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get list of accessible Dooray drives') and scopes it to drives rather than files, which distinguishes it from the many drive-file siblings. It does not explicitly name an alternative tool, but the resource boundary is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Drive Types section plus three concrete request examples give clear context for when to use each mode (personal vs. private project vs. public project). It stops short of stating when not to use this tool or which sibling to pick instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-memberARead-onlyIdempotent
Get details of a Dooray organization member (멤버 상세).
Use the organizationMemberId found in task assignees, comment creators, calendar attendees, or get-member-list results.
Examples:
{"memberId": "1234567890123456789"}
Returns: id, name, userCode, externalEmailAddress, englishName, nickname, locale, timezoneName and more.
| Name | Required | Description | Default |
|---|---|---|---|
| memberId | Yes | Organization member ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and open-world, so the safety profile is covered. The description adds useful behavioral context by listing returned fields and indicating valid ID sources, though it does not discuss permissions or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then usage guidance, an example, and return fields. Every section is useful and compact, with no redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with annotations covering safety and no output schema, the description supplies the missing pieces: where the ID comes from and what fields are returned. An agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics by explaining that memberId is an organizationMemberId obtained from assignees, comment creators, attendees, or get-member-list. This helps the agent supply the correct identifier rather than just any string.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific verb and resource: getting details of a Dooray organization member. It distinguishes itself indirectly from get-member-list by requiring an existing member ID, but does not explicitly clarify when to use it instead of the sibling get-my-member-info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete guidance for where to obtain the required memberId, including task assignees, comment creators, calendar attendees, and get-member-list results. It lacks an explicit when-not condition or direct comparison with get-my-member-info, so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-member-listARead-onlyIdempotent
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):
name: Member name
userCode: User ID, like match
userCodeExact: User ID, exact match
externalEmailAddresses: Email addresses, exact match only (not a like search)
idProviderUserId: SSO user ID (e.g. employee number)
Examples:
By name: {"name": "홍길동"}
By email: {"externalEmailAddresses": ["user@example.com"]}
By user ID: {"userCodeExact": "gildong.hong"}
Returns: totalCount and members with id (organizationMemberId), name, userCode, externalEmailAddress. Use get-member for full details.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Member name | |
| page | No | Page number (default: 0) | |
| size | No | Items per page (default: 20, max: 100) | |
| userCode | No | User ID (like match) | |
| userCodeExact | No | User ID (exact match) | |
| idProviderUserId | No | SSO user ID (e.g. employee number) | |
| externalEmailAddresses | No | Email addresses (exact match) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering the safety profile. The description adds valuable behavioral context: it explains that some parameters are exact-match only (e.g., externalEmailAddresses) while others are like-search, and specifies the return fields (totalCount, members with id/name/userCode/externalEmailAddress). It also points to get-member for full details. This goes beyond annotations, though it could mention rate limits or auth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and sibling differentiation, followed by a clear list of search conditions, examples, and return information. Every sentence serves a purpose: no repetition, no fluff. The structure is logical and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a read-only search across organization members), the description covers purpose, usage guidelines, parameter semantics, and return values. Annotations cover safety, and the description fills in the rest. No output schema is present, but the return shape is described. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. However, the description adds examples that show how to combine parameters for common searches (by name, email, user ID), which is helpful beyond the schema. It also clarifies that externalEmailAddresses uses exact match only (though this is already in the schema), adding marginal value. The examples make it a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Search) and resource (members across the whole Dooray organization), explicitly distinguishes it from sibling tool get-project-member-list, and provides a concrete use case (finding organizationMemberId for someone outside the project). An agent can immediately tell what the tool does and when it applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Unlike get-project-member-list, this is not limited to one project' and gives the exact scenario: 'Use it to find the organizationMemberId of someone outside the project (e.g. to add them as CC by email or member ID).' This clearly routes the agent between this and related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-milestone-listARead-onlyIdempotent
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:
Get all milestones: {"projectId": "123456"}
Get only open milestones: {"projectId": "123456", "status": "open"}
Get only closed milestones: {"projectId": "123456", "status": "closed"}
Returns an array of milestones with id, name, description, dates, and status. Use milestone IDs when creating or updating tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by milestone status (open or closed) | |
| projectId | Yes | Project ID to get milestones from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the safety profile is covered; the description adds the non-obvious trait that the response is 'compact' with essential fields only, plus the field list returned. It omits pagination/size limits, which matters for a 'retrieves all milestones' operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded, and sections are short and scannable. The three examples partially restate the schema's status enum and cost a few lines, so it is slightly longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two simple parameters and no output schema, the description covers purpose, parameter derivation, filter behavior, and return fields. An agent has everything needed to invoke it correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already documented, but the description adds real value with the URL-pattern extraction rule for projectId and worked examples showing the status enum in use. This goes beyond what the schema conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get list of milestones for a project') and even defines what milestones are for, so the agent knows exactly what it returns. It does not explicitly contrast with sibling list tools like get-task-list or get-tag-list, though the milestone resource is unique among them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage scenarios via examples (all milestones, open only, closed only) and explains how to derive projectId from a Dooray URL, which is genuinely actionable context. It also notes that returned milestone IDs are consumed by create/update-task, but gives no explicit 'do not use this when...' exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-my-member-infoARead-onlyIdempotent
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:
Get my info: {} (empty parameters)
"What's my Dooray member ID?"
"Show my Dooray profile"
Returns your complete member profile including:
id: Your member ID (important for task queries)
name, email, organization
locale, timezone settings
display preferences
This is often the first tool to call to get your member ID for use in other tools like list-tasks.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so safety is covered; the description adds the non-obvious behavioral fact that it derives identity from the auth token rather than input, and enumerates the profile fields returned. Not a 5 because it doesn't say what happens on an invalid/expired token or whether any profile fields can be absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The front-loaded purpose sentence is good, but the member-ID point is made three separate times (intro, the returns bullet, and the closing line), and the examples block adds little for a zero-param tool. It's readable but noticeably padded for what is essentially one fact plus a return-field list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, no parameters, and simple annotations, yet the description fully compensates by describing the returned profile fields and the auth-derived behavior. An agent has everything needed to call it correctly and reuse the returned ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero-parameter tool, so the baseline is 4. The description still earns that baseline by explicitly stating 'No parameters needed - it automatically uses your authentication token', preempting an agent from inventing an ID argument.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get information about the authenticated user') and immediately scopes it to the caller's own profile via API token, which separates it from the sibling get-member / get-member-list tools that target arbitrary members. It also names the key payload (the member ID), so an agent understands the tool's real purpose, not just its surface action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing guidance ('This is often the first tool to call to get your member ID for use in other tools like list-tasks') plus concrete example utterances. It stops short of naming the sibling alternatives (get-member, get-member-list) that an agent might otherwise pick, so it lacks the explicit exclusion that would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-projectARead-onlyIdempotent
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:
From URL: Extract "1769381697328002548" from "https://nhnent.dooray.com/task/1769381697328002548" → {"projectId": "1769381697328002548"}
From URL with task: Extract "1769381697328002548" from "https://nhnent.dooray.com/task/1769381697328002548/4143841687558152504" → {"projectId": "1769381697328002548"}
Direct ID: {"projectId": "123456"}
"Show me details of project 123456"
Returns project information including:
id, code, name: Basic project identifiers
description: Project description
scope: private or public
organizationId: Organization this project belongs to
projectCategoryId: Category ID (null if no category)
projectType: default, task, or issue
state: active or archived
Use this to get full details about a specific project when you have its project ID or URL.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID to retrieve details for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, so the safety profile is covered. The description adds genuinely new behavioral content by enumerating the returned fields (scope, projectType, state, organizationId), which matters because there is no output schema. It stops short of describing failure behavior for an invalid or archived project ID, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The response-field list and the URL guidance both earn their place given the absence of an output schema. However, the two URL examples (with and without task ID) and the separate 'From URL with task' line restate the same extraction rule, and the final 'Use this to get full details...' sentence duplicates the opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description supplies both the input-derivation rule and the shape of the return value. Nothing an agent needs in order to call it correctly and interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented, but the description goes well beyond it by specifying exactly how to extract projectId from Dooray URLs, including the case with a trailing TASK_ID. That extraction rule is real semantic value the schema cannot express.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line states a specific verb and resource ('Get detailed information about a specific Dooray project'), and the closing line reinforces scope. The explicit contrast with get-project-list ('use this tool directly instead of calling get-project-list') lets an agent separate it from the closest sibling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool (a specific project URL or ID is known) and when not to (do not call get-project-list first). The URL examples convert that rule into concrete invocation guidance rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-project-listARead-onlyIdempotent
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:
Get all your active projects: {} (empty parameters)
Get second page with 50 items: {"page": 1, "size": 50}
Returns a paginated list with project id and name (project code) for each project.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 0) | |
| size | No | Number of items per page (default: 20, max: 100) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, so safety is covered; the description adds genuinely new behavior: archived projects are excluded, and the response is a compact field set rather than full project detail. Only minor gaps remain, such as default ordering or what happens past the last page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then scope, then routing rule, then examples — a sensible order. It is somewhat longer than strictly needed for two optional params, with bold markers and a redundant return-shape sentence, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-optional-param read tool with no output schema, the description covers scope, exclusions, response shape, pagination examples, and sibling disambiguation. An agent has everything needed to choose and call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are already documented with defaults and bounds. The examples add real meaning the schema does not: page 1 returning 'second page' confirms zero-based paging, and the empty-object example shows both params are optional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get list of active projects') and immediately scopes it to projects the caller belongs to. It is clearly distinguishable from the sibling get-project, which is named as the detail-oriented counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes between two sibling tools: use get-project when a Dooray URL or PROJECT_ID is present, use this tool for browsing when no specific project is identified. The exclusion rule is stated with a concrete URL example, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-project-member-group-listARead-onlyIdempotent
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:
Default page size is 20 (maximum: 100)
Use page parameter to get additional pages if totalCount > size
Note: Returns compact response with essential fields only (id and code).
Examples:
Get all member groups: {"projectId": "123456"}
Get with pagination: {"projectId": "123456", "page": 0, "size": 50}
Returns a paginated response with totalCount and array of member groups containing:
id: Member group ID
code: Member group name/code
Use this tool to find member groups for assigning tasks to groups of members.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 0) | |
| size | No | Number of items per page (default: 20, max: 100) | |
| projectId | Yes | Project ID to get member groups from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered. The description adds behavior the annotations cannot: default page size 20, max 100, the totalCount > size paging trigger, and a warning that the response is compact (id and code only) — that last point is genuinely useful because it signals a truncated payload.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence and the blocks are scannable, but the member-groups explanation and the closing usage sentence restate each other, and the two examples add little for a 3-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by listing id and code plus totalCount. Pagination, URL parsing and intended use are all covered; only error/no-results behavior is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description earns extra by explaining how to obtain the projectId from a URL and by pairing pagination parameters with worked examples. It adds extraction and default-value context beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get list of member groups in a project') and defines what a member group is, which implicitly separates it from get-project-member-list and get-member. It never names those siblings directly, so the differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The closing line gives a concrete use case ('to find member groups for assigning tasks to groups of members'), and the URL Pattern Recognition block tells the agent how to derive projectId from a Dooray task URL. No explicit when-not-to-use or named alternatives, so short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-project-member-listARead-onlyIdempotent
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:
Optionally filter by roles: ["admin"], ["member"], or ["admin", "member"]
If not specified, returns all members regardless of role
Pagination:
Default page size is 20 (maximum: 100)
Use page parameter to get additional pages if totalCount > size
Note: Returns compact response with essential fields only (id, name, externalEmailAddress).
Examples:
Get all members: {"projectId": "123456"}
Get only admins: {"projectId": "123456", "roles": ["admin"]}
Get with pagination: {"projectId": "123456", "page": 0, "size": 50}
Returns a paginated response with totalCount and array of members containing:
id: Member ID (organizationMemberId)
name: Member's display name
externalEmailAddress: Member's email address
Use this tool to find project members for assigning tasks or understanding team composition.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 0) | |
| size | No | Number of items per page (default: 20, max: 100) | |
| roles | No | Filter by roles (optional) | |
| projectId | Yes | Project ID to get members from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and openWorld, so safety is covered; the description adds real behavioral context beyond that — optional role filtering semantics, default page size 20 with a hard max of 100, and a deliberately compact response shape. It doesn't say what happens on invalid projectId or whether members are deduplicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then clearly headed sections for URL recognition, role filtering, pagination and return shape, with examples at the end. Slightly redundant: the 'compact response' note and the 'Returns a paginated response' list restate the same field set twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description documents the returned fields (id, name, externalEmailAddress) and that the payload is paginated with totalCount. Combined with the paging and filtering guidance, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description earns above that by explaining the non-obvious projectId derivation rule from a Dooray task URL and by spelling out role filter combinations and pagination limits in prose. This meaning is not present in the schema's terse parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get list of members in a project with their details', plus an enrichment note (name, email). It never distinguishes itself from the closely-named siblings get-member-list, get-member, get-my-member-info, or get-project-member-group-list, so an agent must infer the project-scoped difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('find project members for assigning tasks or understanding team composition') and three worked examples covering the main invocation variants. It stops short of explicit when-not-to-use guidance or naming the sibling to use for org-wide member lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-project-templateARead-onlyIdempotent
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 data will be used for creating new tasks
Need body, guide, subject, users, tags, milestone for task creation
This is a detail view, not a list view
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 get-project-template-list tool to list all templates in a project and get their IDs.
Examples:
Get template details: {"projectId": "123456", "templateId": "789012"}
"Show me details of template 789012 in project 123456"
Returns complete template information including:
id: Template ID
templateName: Template name
project: Project info (id, code)
body: Template body with mimeType and content (markdown or HTML)
guide: Template guide/instructions with mimeType and content
subject: Default task subject
users: Default assignees (to) and CC
tags: Default tag IDs
milestone: Default milestone (id, name)
priority: Default priority level
dueDate, dueDateFlag: Default due date settings
isDefault: Whether this is the default template
Use this tool to get full template details before creating a new task from the template.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID where the template belongs | |
| templateId | Yes | Template ID to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring read-only and idempotent behavior, the description adds critical context: it returns ALL template fields (not filtered) and that macros are returned as-is (not interpolated). For a read-only detail tool with no output schema, these details help the agent understand the response shape and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose and uses clear headings for behavioral notes, URL handling, and return fields. While it is somewhat verbose (listing every return field and including examples), the structure makes it scannable; minor trimming could improve conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of an output schema and the need to understand return fields and macro handling, the description provides comprehensive coverage: it lists all returned fields, explains the rationale for returning all fields, and gives URL guidance. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters documented, so the baseline is 3. The description adds meaningful guidance by explaining how to extract the projectId from a Dooray URL and directing users to `get-project-template-list` for template IDs, which goes beyond the schema's brief parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb ('Get') and resource ('detailed information about a specific project template'), and later explicitly distinguishes it from the list view ('This is a detail view, not a list view'). An agent can identify the tool's scope without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool 'to get full template details before creating a new task' and names the alternative `get-project-template-list` for obtaining template IDs. This provides clear when-to-use guidance and directs to the correct sibling for a different step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-project-template-listARead-onlyIdempotent
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:
Default page size is 20 (maximum: 100)
Use page parameter to get additional pages if totalCount > size
Set size parameter to control items per page (max: 100)
Examples:
Get all templates (first page): {"projectId": "123456"}
Get second page: {"projectId": "123456", "page": 1, "size": 20}
Get with custom page size: {"projectId": "123456", "page": 0, "size": 50}
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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 0) | |
| size | No | Number of items per page (default: 20, max: 100) | |
| projectId | Yes | Project ID to get templates from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, so the description focuses on adding value: it discloses the compact response shape (id and templateName only) and the pagination contract including totalCount. This is useful beyond what the annotations convey, though it doesn't mention rate limits or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then structured sections for URL recognition and pagination. The pagination rules are restated in the closing paragraph and the final sentence about template usefulness is mild filler, but overall it remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fully describes the return payload (totalCount plus array of id/templateName). For a simple three-parameter read tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining how to extract projectId from a Dooray URL and by clarifying page/size behavior with worked examples beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get list of project task templates', and clarifies it retrieves all templates in a project. It does not explicitly distinguish itself from the singular sibling get-project-template, leaving the list-vs-single choice to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains what templates are and gives a clear URL-pattern recipe for deriving projectId, plus concrete pagination guidance. It stops short of naming when to use the sibling get-project-template instead, so no explicit exclusion is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-project-workflow-listARead-onlyIdempotent
Get list of workflow statuses (업무 상태) for a project.
Workflows represent the task statuses available in a project. There are four workflow classes:
backlog: 대기 (waiting/backlog)
registered: 등록/할 일 (registered/to-do)
working: 진행 중 (in progress)
closed: 완료 (completed/done)
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:
Get all workflows: {"projectId": "1769381697328002548"}
Returns: Array of workflows with id, name, order, and class.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project ID to get workflow statuses from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and openWorld, so the safety profile is known. The description adds real context beyond that: the four workflow classes with bilingual labels, the fact that projects may have custom workflows, and the return shape (id, name, order, class). Missing only notes on pagination or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the class taxonomy, then actionable URL guidance and return shape. The taxonomy list is long but earns its place because class semantics matter for interpreting results; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description's 'Returns: Array of workflows with id, name, order, and class' is necessary and present. The tool is simple (one parameter), and the description covers purpose, input derivation, and output shape adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the single projectId parameter is documented, giving a baseline of 3. The description goes further by explaining how to extract projectId from a Dooray URL ('/task/PROJECT_ID') and giving a concrete example value, which the schema does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get list of workflow statuses for a project') plus the domain meaning of workflows. No sibling tool retrieves workflows, so the agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use the returned workflow IDs when calling create-task or update-task, naming the alternative tools and the downstream context. The URL pattern section additionally tells the agent how to obtain the required projectId from a Dooray URL.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-tagARead-onlyIdempotent
Get details of a specific tag in a Dooray project.
Response Format:
{
"id": "12345",
"name": "Priority:High",
"color": "ff0000",
"tagGroup": {
"id": "group123",
"name": "Priority",
"mandatory": true,
"selectOne": true
}
}Response Fields:
id: Tag ID
name: Tag name (includes group prefix if it's a group tag)
color: Hex color code without #
tagGroup: Tag group information (null for individual tags)
id: Group ID
name: Group name
mandatory: If true, at least one tag from this group is required when creating tasks
selectOne: If true, exactly one tag must be selected; if false, multiple tags can be selected
Examples:
Get tag:
{"projectId": "123", "tagId": "456"}
Use Cases:
Check tag details before assigning to a task
Verify tag group settings (mandatory, selectOne)
Get tag color and group information
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | Yes | Tag ID to get details for | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and openWorld, so the safety profile is covered; the description goes further by disclosing the exact return shape and the meaning of tagGroup.mandatory/selectOne, which an agent cannot infer elsewhere since there is no output schema. It omits what happens when the tag or project is not found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, then structured into response format, field semantics, example and use cases. The JSON sample and the field list partially duplicate each other, but each block contributes (structure vs. semantic meaning of mandatory/selectOne).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only two-parameter lookup with no output schema, the description supplies the response shape and interprets the non-obvious group flags, which is what an agent needs to act on the result. Missing only error/not-found behavior and permission prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are already 100% described in the schema, and the description only adds a bare example ({"projectId": "123", "tagId": "456"}) without explaining ID formats or sourcing (e.g., where tagId comes from, whether the project prefix is needed). Baseline 3 applies since the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Get details of a specific tag in a Dooray project"), which clearly separates it from the plural sibling get-tag-list. It never explicitly names get-tag-list as the alternative for listing, so distinguishability is implied by 'specific' rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Use Cases block gives concrete situations (checking details before assigning to a task, verifying group settings, reading color/group info), which is real guidance beyond restating the purpose. It lacks any when-not-to-use or explicit routing to get-tag-list, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-tag-listARead-onlyIdempotent
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:
{
"tagGroups": [
{
"id": "group1",
"name": "Type",
"mandatory": true,
"selectOne": true,
"tags": [
{ "id": "tag1", "name": "Bug" },
{ "id": "tag2", "name": "Feature" }
]
}
]
}CRITICAL - Mandatory Tag Groups: When creating/updating tasks, you MUST include tags from all mandatory tag groups:
mandatory: true - At least one tag from this group is required
selectOne: true - Exactly ONE tag must be selected from this group
selectOne: false - One OR MORE tags must be selected from this group
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:
Default page size is 100 (maximum) to retrieve all tags
Use page parameter to get additional pages if totalCount > 100
Examples:
Get all tags: {"projectId": "123456"}
Get second page: {"projectId": "123456", "page": 1, "size": 100}
Use tag IDs when creating or updating tasks with create-task or update-task tools.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number for pagination (default: 0) | |
| size | No | Number of items per page (default: 100, max: 100) | |
| projectId | Yes | Project ID to get tags from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the bar is lower, and the description still adds real behavior: the mandatory/selectOne semantics of tag groups and the concrete consequence of ignoring them ('will result in a 500 error'). Pagination defaults (100 max) are also disclosed. It stops short of saying whether the list is scoped to the caller's permissions or how it behaves for a project with no tag groups.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and well-sectioned under bold headers, so an agent can skim to the mandatory-group rules or pagination notes. It is on the long side, and the JSON response sample plus the CRITICAL block spend more words than strictly necessary, but none of it is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by showing the exact return envelope (tagGroups with id/name/mandatory/selectOne/tags). Combined with URL derivation, pagination and the write-path warning, everything needed to call this correctly and use the result is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description earns above that by giving the projectId format derivation from a URL pattern and by pairing page/size with a worked second-page example. It does not clarify whether page is 0- or 1-indexed beyond the schema default of 0.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific verb and resource ('Get list of tags for a project') plus the organizing structure ('grouped by tag groups'), and the sibling set contains get-tag (singular), so the plural/list distinction is implied by scope. The response-format snippet makes the shape of what is returned unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent forward: 'Use tag IDs when creating or updating tasks with create-task or update-task tools,' naming the exact siblings. It also explains when the returned data matters (mandatory groups must be satisfied on writes) and how to derive projectId from a Dooray URL, so both the call and its downstream use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-taskARead-onlyIdempotent
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:
Project-scoped URL: "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID"
Extract the first numeric ID after "/task/" as projectId (optional)
Extract the second numeric ID as taskId (required)
Example: "https://nhnent.dooray.com/task/1769381697328002548/4206132384174602537" → {"taskId": "4206132384174602537", "projectId": "1769381697328002548"}
Task-only URL: "https://nhnent.dooray.com/project/tasks/TASK_ID"
Extract the numeric ID after "/tasks/" as taskId
Example: "https://nhnent.dooray.com/project/tasks/4206132384174602537" → {"taskId": "4206132384174602537"}
Same for "https://nhnent.dooray.com/task/to/TASK_ID"
IMPORTANT:
taskId is REQUIRED, projectId is OPTIONAL
The taskId is the unique identifier (ID) from the URL, NOT the sequential task number shown in the UI
You can fetch task details with just the taskId without knowing the projectId
When a specific task URL is provided, use this tool directly instead of calling get-project-list first
To find taskId from task descriptions, use get-task-list to search and get task IDs
Examples:
From URL pattern 1: {"taskId": "4206132384174602537", "projectId": "1769381697328002548"}
From URL pattern 2: {"taskId": "4206132384174602537"}
Just taskId: {"taskId": "789012345"}
With both IDs: {"taskId": "789012345", "projectId": "123456"}
Returns complete task information including:
Basic info: id, number, subject, taskNumber (PROJECT-CODE/NUMBER format)
Project: project object with id and code
Status: workflowClass (registered/working/closed), workflow (id and name), closed flag, priority
Dates: createdAt, updatedAt, dueDate, dueDateFlag
Content: body with mimeType (text/x-markdown or text/html) and content
Hierarchy: parent task information (id, number, subject) if this is a subtask
People: users object with from (creator), to (assignees), cc (watchers)
Organization: milestone (id, name), tags array (id, name)
Files: files array with attachments (id, name, size)
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID (unique identifier, REQUIRED) | |
| projectId | No | Project ID (optional, can be omitted) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, so the safety profile is covered; the description adds substantial behavioral value by detailing the full returned payload (workflow status, dates, body mimeType, hierarchy, people, tags, files). It does not describe failure behavior for an invalid or missing taskId, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and sectioned with headers, but it is long and repetitive: the taskId-required and projectId-optional facts appear three times, and the trailing 'Just taskId' / 'With both IDs' examples duplicate the URL examples already given. Several sentences could be cut without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return value and does so thoroughly. The remaining gap is error/edge behavior (what happens when the taskId does not exist or the caller lacks access), which is minor for a read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds critical meaning beyond it: taskId is the URL's unique identifier, NOT the sequential task number shown in the UI, and it gives concrete URL-to-parameter extraction rules for both URL formats. This prevents a very likely misuse of passing the visible task number.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get detailed information about a specific task') and then enumerates exactly what is retrieved. It also distinguishes itself from siblings by name, telling the agent to use get-task-list to find task IDs and to skip get-project-list when a task URL is available.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the selection condition ('When a specific task URL is provided, use this tool directly instead of calling get-project-list first') and routes the alternative case to get-task-list. It also clarifies that taskId alone is sufficient and projectId is optional, so there is no ambiguity about prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-task-commentARead-onlyIdempotent
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:
{"projectId": "123", "taskId": "456", "commentId": "789"}
Returns: comment with id, type, subtype, createdAt, creator, body {mimeType, content}, files.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID | |
| commentId | Yes | Comment ID | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds value that annotations can't provide: the exact return shape (id, type, subtype, createdAt, creator, body with mimeType/content, files), which matters because no output schema exists. It stops short of stating error behavior, e.g. what happens for an invalid or deleted comment ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-sentence purpose, then workflow guidance, then a compact example and a return summary. Every section earns its place, though the bolded 'Examples' and 'Returns' blocks are slightly verbose for a three-parameter read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read tool with no output schema, the description supplies the purpose, the source of the ID, the read-before-update workflow, and the return fields. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three IDs are already documented in the schema, and the baseline is 3. The example object shows the three parameters used together, but adds no format or constraint detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Get a single comment on a Dooray task with its full body.' The word 'single' and 'full body' explicitly distinguish it from get-task-comment-list, which is also named in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says where the comment ID comes from ('from get-task-comment-list') and gives a concrete workflow instruction: 'Call this before update-task-comment to get the current body.' This names the alternative and the precondition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-task-comment-listARead-onlyIdempotent
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":
Extract the first numeric ID after "/task/" as projectId (if present)
Extract the second numeric ID (or the ID after "/tasks/") as taskId
IMPORTANT: Both projectId and taskId are REQUIRED.
Pagination:
Default page size is 20 (maximum: 100)
Use page parameter to get additional pages if totalCount > size
Sorting:
Default: createdAt (oldest comments first)
Use "-createdAt" to get newest comments first
Note: Returns filtered response with essential fields only (id, creator, body).
Examples:
Get all comments (first page): {"projectId": "123456", "taskId": "789012"}
Get newest comments first: {"projectId": "123456", "taskId": "789012", "order": "-createdAt"}
Get second page: {"projectId": "123456", "taskId": "789012", "page": 1, "size": 20}
Returns a paginated response with totalCount and array of comments containing:
id: Comment ID
creator: Who wrote the comment (member or emailUser)
For members: {"type": "member", "member": {"organizationMemberId": "..."}}
For email users: {"type": "emailUser", "emailUser": {"emailAddress": "...", "name": "..."}}
body: Comment content with mimeType and content
Use this tool to view discussion history, progress updates, or notes on a task.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 0) | |
| size | No | Items per page (default: 20, max: 100) | |
| order | No | Sort order: createdAt (oldest first, default), -createdAt (newest first) | |
| taskId | Yes | Task ID to get comments from | |
| projectId | Yes | Project ID where the task belongs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, so the safety profile is free; the description adds real value by disclosing that the response is filtered to essential fields only and by spelling out default page size and the 100-item cap. It omits rate limits, auth requirements, and whether all comments or only visible ones are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the sectioned layout is scannable, but the Pagination and Sorting blocks duplicate the schema's enum and default/max values almost verbatim, and the three examples largely repeat the same shape. For a simple paginated list call this is longer than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract itself: totalCount plus id, creator (member vs emailUser shapes), and body with mimeType/content. Combined with pagination, sorting, URL parsing, and required-param emphasis, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; however the description adds genuine meaning by explaining how to derive projectId and taskId from Dooray URLs and by reinforcing that both are REQUIRED. Pagination and order details merely restate schema descriptions, so it doesn't reach 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Get list of comments (댓글) on a specific Dooray task") with scope ("all comments that have been added to a task"). The plural 'list/all comments' framing plainly separates it from the singular get-task-comment sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Closes with "Use this tool to view discussion history, progress updates, or notes on a task," giving clear situational context. It never states when NOT to use it or points to get-task-comment / create-task-comment as alternatives, so it stops short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-task-listARead-onlyIdempotent
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):
toMemberIds: Tasks assigned to specific members
ccMemberIds: Tasks where members are in CC
fromMemberIds: Tasks created by specific members
Workflow Filters:
postWorkflowClasses: ["backlog", "registered", "working", "closed"]
postWorkflowIds: Project-specific workflow IDs
Date Filters (flexible patterns):
"today" - Today's tasks
"thisweek" - This week's tasks
"prev-7d" - Last 7 days
"next-7d" - Next 7 days
ISO8601 range: "2021-01-01T00:00:00+09:00~2021-01-10T00:00:00+09:00"
Examples:
All tasks in project: {"projectId": "123456"}
Tasks assigned to me: {"projectId": "123456", "toMemberIds": ["my-org-member-id"]}
Tasks in "working" status: {"projectId": "123456", "postWorkflowClasses": ["working"]}
Tasks due today: {"projectId": "123456", "dueAt": "today"}
Recent tasks (sorted by update time): {"projectId": "123456", "updatedAt": "prev-7d", "order": "-postUpdatedAt"}
Tasks with specific milestone and tags: {"projectId": "123456", "milestoneIds": ["milestone123"], "tagIds": ["tag456"]}
Sorting:
Default: Tasks are sorted by most recently updated first (-postUpdatedAt)
Custom: Use order parameter with: postDueAt, postUpdatedAt, createdAt
Prefix with - for descending (e.g., "-createdAt")
Returns paginated task list with id, number, subject, status, priority, dueDate, assignees, tags, and milestone.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (default: 0) | |
| size | No | Items per page (default: 20, max: 100) | |
| dueAt | No | Filter by due date (today, thisweek, prev-7d, next-7d, or ISO8601 range) | |
| order | No | Sort order: postDueAt, postUpdatedAt, createdAt (prefix with - for descending) | |
| tagIds | No | Filter by tag IDs | |
| subjects | No | Filter by task subject | |
| createdAt | No | Filter by creation date (today, thisweek, prev-7d, next-7d, or ISO8601 range) | |
| projectId | Yes | Project ID (REQUIRED) | |
| updatedAt | No | Filter by update date (today, thisweek, prev-7d, next-7d, or ISO8601 range) | |
| postNumber | No | Filter by specific task number | |
| ccMemberIds | No | Filter by CC member IDs | |
| toMemberIds | No | Filter by assignee member IDs (organizationMemberId) | |
| milestoneIds | No | Filter by milestone IDs | |
| parentPostId | No | Filter by parent post ID (get subtasks) | |
| fromMemberIds | No | Filter by creator member IDs | |
| postWorkflowIds | No | Filter by workflow IDs | |
| fromEmailAddress | No | Filter by creator email address | |
| postWorkflowClasses | No | Filter by workflow classes: backlog, registered, working, closed |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety with readOnlyHint, idempotentHint, and openWorldHint. The description adds useful behavioral context: a compact response with essential fields, pagination, default sort order, and the fact that full details require get-task. It does not discuss auth or rate limits, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with front-loaded purpose, required-parameter warning, filter groups, examples, sorting, and return info. It is longer than ideal but reasonably sized for an 18-parameter tool; some example and URL-pattern detail overlaps with schema or could be compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the compact return fields and pagination. It also covers the critical usage constraints, filtering patterns, sorting behavior, and alternatives, which is enough for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 18 parameters. The description still adds meaningful semantics beyond the schema: how to extract projectId from Dooray URLs, where to source organizationMemberId values, workflow class values, flexible date patterns, sorting defaults, and concrete examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: fetching a list of tasks in a Dooray project with filtering and sorting. It also explicitly distinguishes itself from get-task by noting that it returns compact fields while get-task is for complete task details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative for full details (get-task) and gives URL routing guidance, including using get-project instead of get-project-list when a URL is provided. The required projectId constraint and numerous examples make clear exactly when and how to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-wiki-listARead-onlyIdempotent
Get list of accessible wikis.
Wiki vs WikiPage:
Wiki is a container that groups related wiki pages together (similar to how Project groups Tasks)
Each wiki has a home page and can contain multiple wiki pages in a tree structure
Use get-wiki-page-list to get pages within a specific wiki
Returns: wiki ID, name, project, type, scope, and home page ID.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-based, default: 0) | |
| size | No | Page size (default: 20) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered; the description adds genuine value beyond that by disclosing the semantic model (container with home page and tree of pages) and enumerating the returned fields. Pagination behavior is left to the schema, which keeps this just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then a labeled 'Wiki vs WikiPage' block and a one-line Returns. Every line carries information an agent would otherwise have to infer from the sibling list; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly supplies the return shape (wiki ID, name, project, type, scope, home page ID) plus the conceptual model needed to interpret those fields. Nothing required to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two optional paging params, both already documented in the schema. The description adds no paging or ordering detail, so the baseline of 3 applies – nothing is lost, but nothing is gained either.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (get list of accessible wikis) and immediately disambiguates the domain object from WikiPage using an analogy (Wiki groups pages like Project groups Tasks). An agent can distinguish this from get-wiki-page-list, get-project-list, and get-wiki-page without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use get-wiki-page-list to get pages within a specific wiki,' which is the single most likely confusion point given the sibling set. It lacks an explicit 'when not to use this' beyond that one exclusion, but the scope word 'accessible' sets the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-wiki-pageARead-onlyIdempotent
Get wiki page details including body content.
Two API endpoints supported:
With pageId only: GET /wiki/v1/pages/{page-id}
With wikiId + pageId: GET /wiki/v1/wikis/{wiki-id}/pages/{page-id}
Returns: id, wikiId, version, subject, body (mimeType, content), creator, referrers, files, images.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | No | Wiki ID (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, so safety is covered. The description adds real value by enumerating the returned fields (version, subject, body mimeType/content, referrers, files, images), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then a two-item endpoint list, then a compact return summary. No wasted sentences and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing return fields, and the endpoint variants clarify calling conventions. Minor gaps remain around permissions or error behavior, but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: wikiId is not merely "optional" — supplying it switches the request to the /wikis/{wiki-id}/pages/{page-id} path. That scoping semantics is a genuine addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Get wiki page details including body content") plus the exact endpoints used. It's clearly distinct from get-wiki-page-list, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two enumerated endpoint variants tell the agent how parameter combinations change behavior, which is genuinely useful. However, there is no explicit when-to-use/when-not guidance relative to siblings like get-wiki-page-tree or get-wiki-page-list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-wiki-page-commentARead-onlyIdempotent
Get a specific comment on a wiki page. Returns: id, page, createdAt, modifiedAt, creator, body.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) | |
| commentId | Yes | Comment ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description adds useful return-field information (id, page, createdAt, modifiedAt, creator, body) that is not covered by annotations, since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the purpose and followed by the return fields. Every sentence earns its place with no unnecessary wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with three required parameters, full schema coverage, and relevant annotations, the description is largely complete. It covers purpose and return values, though it could mention error behavior when a comment ID is invalid.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (wikiId, pageId, commentId) are documented in the schema. The description does not add any parameter-specific meaning beyond what the schema provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get a specific comment on a wiki page.' This clearly distinguishes it from the list-oriented sibling get-wiki-page-comment-list, though it does not explicitly name that alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'specific comment' and the required commentId, suggesting retrieval by known ID. However, there is no explicit guidance on when to use this versus get-wiki-page-comment-list or other comment tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-wiki-page-comment-listARead-onlyIdempotent
Get comments on a wiki page. Returns newest first. Each comment has: id, page, createdAt, modifiedAt, creator, body.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (0-based, default: 0) | |
| size | No | Page size (default: 20, max: 100) | |
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world behavior. The description adds useful behavioral context beyond annotations by stating the return ordering (newest first) and the fields included in each comment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no wasted text. The purpose and ordering are front-loaded, followed by the return shape.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and schema covering all parameters, the description supplies the missing return-field context. It does not discuss pagination behavior, but the schema already documents page and size controls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, size, pageId, and wikiId are already documented in the schema. The description adds no parameter-level meaning, which is acceptable given full schema coverage, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: getting comments on a wiki page. The plural "comments" signals a list operation and implicitly distinguishes it from the sibling single-comment tool, but it does not explicitly name or differentiate against alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what the tool does but provides no guidance on when to use it versus alternatives such as get-wiki-page-comment or other comment-list tools. Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-wiki-page-listARead-onlyIdempotent
Get wiki pages at one depth level (siblings). Use parentPageId to get child pages, omit for root pages.
| Name | Required | Description | Default |
|---|---|---|---|
| wikiId | Yes | Wiki ID (required) | |
| parentPageId | No | Parent page ID (optional, omit for root pages) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so safety behavior is covered. The description adds the important structural behavior that results are limited to one depth level, but it does not mention pagination, ordering, or result size, which are relevant for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no wasted words, and the key scope constraint is front-loaded before the parameter guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only list tool with no output schema, the description is largely sufficient: it explains scope and parameter behavior. The only notable omission is return or pagination behavior, which would help an agent understand what a list result looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains that wikiId is required and parentPageId should be omitted for root pages. The description reinforces those semantics but adds little beyond what the schema already documents, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get wiki pages') and clearly defines the scope as one depth level (siblings), which distinguishes it from the hierarchy-wide get-wiki-page-tree sibling. An agent can select this tool without needing to inspect the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives direct usage guidance: use parentPageId for child pages, omit it for root pages. It does not explicitly name get-wiki-page-tree as the alternative for retrieving a full hierarchy, but the depth-level condition makes the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-wiki-page-treeARead-onlyIdempotent
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:
Top 3 levels: {"wikiId": "123"}
Under a page, 2 levels: {"wikiId": "123", "parentPageId": "456", "depth": 2}
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | How many levels to walk (default: 3, max: 10) | |
| wikiId | Yes | Wiki ID (required) | |
| parentPageId | No | Start from this page (default: wiki top level) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, openWorld), and the description goes well beyond them: it discloses that each level costs one API call per page and that the walk truncates at 500 pages with truncated=true. Those are non-obvious cost and failure traits an agent needs before choosing a depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then sibling disambiguation, then cost constraints, then examples. Every sentence carries distinct information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return shape (nested {id, subject, children}) and the truncation signal, which is exactly what is missing from structured data. Nothing an agent needs to call this correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value by demonstrating how depth and parentPageId combine ('Under a page, 2 levels') and implicitly confirming the default depth of 3 via the first example, plus tying depth to API cost.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the wiki page hierarchy as a tree') and immediately contrasts it with the sibling get-wiki-page-list, noting that tool returns only one level. An agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it ('get-wiki-page-list returns only one level. This tool walks down the levels'). Adds cost guidance ('keep depth small for large wikis') and two concrete invocation examples covering the default and the scoped/depth variants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move-drive-fileADestructive
Move a file or folder in a Dooray drive.
Required:
driveId: The drive ID
fileId: File or folder ID to move
destinationFileId: Target folder ID, or "trash" to move to trash
Examples:
Move to folder: { "driveId": "123", "fileId": "456", "destinationFileId": "789" }
Move to trash: { "driveId": "123", "fileId": "456", "destinationFileId": "trash" }
Note: To permanently delete, first move to trash, then use delete-drive-file.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File or folder ID to move | |
| driveId | Yes | Drive ID | |
| destinationFileId | Yes | Destination folder ID or "trash" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, so the description does not need to re-establish the safety profile. It adds real context the annotations don't carry: that moving to 'trash' is a reversible staging step rather than permanent deletion, and that permanent deletion requires a separate call. It omits collision/overwrite behavior when the destination folder already contains an item of that name, which is the remaining gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb+resource in the first line, then required params, then examples, then a caveat. The structure is scannable and every section maps to a decision the agent makes; the param bullet list is somewhat redundant with the schema but is not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-required-param mutation with no output schema, the description covers the special parameter value, the trash workflow, and the follow-up tool. Missing is any statement of the return value (e.g., new path or IDs after the move) and behavior on name collision, which an agent would want before calling on a populated folder.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the description restates the same three parameter meanings nearly verbatim, so it adds little semantic content. The concrete JSON examples and the emphasis on the 'trash' sentinel value give modest extra value but do not go beyond what the schema docstrings already say.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move a file or folder in a Dooray drive') and clarifies that the object can be either a file or folder. The trash-target special case and the pointer to delete-drive-file make it distinguishable from sibling mutation tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Note' explicitly routes the agent to delete-drive-file for permanent removal and frames move-to-trash as a prerequisite step, which is genuinely useful routing. It does not, however, contrast with copy-drive-file or rename-drive-file, so the alternative-selection guidance is only partial.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move-wiki-pageADestructive
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:
Change parent: {"wikiId": "123", "pageId": "456", "targetParentPageId": "789"}
Move only this page: {"wikiId": "123", "pageId": "456", "targetParentPageId": "789", "withChildren": false}
Move to the top of siblings: {"wikiId": "123", "pageId": "456", "targetParentPageId": "789", "beforePageId": "0"}
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID to move (required) | |
| wikiId | Yes | Wiki ID the page belongs to (required) | |
| beforePageId | No | Place right after this sibling page. "0" moves it to the top | |
| targetWikiId | No | Target wiki ID when moving to another wiki | |
| withChildren | No | Move child pages together (default: true) | |
| targetParentPageId | Yes | New parent page ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the key side effect that child pages move together by default and can be excluded via withChildren=false — an important cascading behavior for a destructiveHint=true operation. It stops short of stating permissions requirements, reversibility/undo, or what the response contains, but the annotation already flags the destructive profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb and the three modes, then lists examples compactly. Minor waste: the parenthetical Korean translation duplicates the English title and adds no information for an agent already reading the English description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter mutation tool with no output schema, the description covers all three move modes, the default child-move behavior, and worked examples for each. That is enough for an agent to select and invoke it correctly; missing return format is not required since none is documented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, and the description adds real value by showing parameter combinations (reparent, move-only, move-to-top with beforePageId '0') rather than just restating field meanings. The examples make the interplay between targetParentPageId and beforePageId concrete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Move a wiki page') and enumerates the three distinct move semantics: reparenting, cross-wiki relocation (targetWikiId), and sibling reordering (beforePageId). This clearly separates it from update-wiki-page and move-drive-file in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the three supported move modes and gives concrete invocation examples, which makes the when-to-use case clear. It does not explicitly contrast with update-wiki-page (rename/content edits) or warn about when not to use it, so routing to alternatives is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename-drive-fileCDestructive
Rename a file or folder in a Dooray drive.
Required:
driveId: The drive ID
fileId: File or folder ID to rename
name: New name
Example: { "driveId": "123", "fileId": "456", "name": "new-name.txt" }
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name | |
| fileId | Yes | File or folder ID | |
| driveId | Yes | Drive ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds no behavioral context at all — it doesn't say whether an existing same-named file is overwritten, whether the old name is recoverable, or what permissions are needed. For a destructive mutation, the only added content is an example payload, which is parameter illustration rather than behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is correctly front-loaded, but the bulleted "Required" list duplicates the schema with zero added information and could be dropped entirely. The example earns its place; the parameter recap does not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with no output schema, the definition covers inputs adequately, but it omits the consequences of a destructive rename (collision handling, reversibility) and says nothing about what is returned. Adequate but with clear gaps given destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description's "Required" block merely restates the schema descriptions verbatim ("driveId: The drive ID"). The JSON example adds marginal value by showing concrete string formats, but no new semantic detail such as name length limits or invalid-character rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Rename a file or folder in a Dooray drive"), which is unambiguous. However, it never distinguishes itself from the sibling `update-drive-file`, which plausibly could also alter a name, so an agent cannot confidently choose between the two from the text alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool rather than `update-drive-file`, `move-drive-file`, or `copy-drive-file`, and no prerequisites or permission context. The reader is left to infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-calendar-eventADestructive
Update a Dooray calendar event (일정 수정).
Only the fields you provide are changed. Unprovided fields keep their current values.
IMPORTANT:
attendees and cc REPLACE the current lists. Call get-calendar-event first and include existing attendees you want to keep
When changing time, provide both startedAt and endedAt
Examples:
Change time: {"calendarId": "123", "eventId": "456", "startedAt": "2026-10-22T14:00:00+09:00", "endedAt": "2026-10-22T15:00:00+09:00"}
Change location: {"calendarId": "123", "eventId": "456", "location": "7층 회의실"}
Returns: success message.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC (참조) | |
| body | No | Event description | |
| busy | No | true: busy (바쁨), false: free (한가함) | |
| alarms | No | Alarms | |
| endedAt | No | End time (ISO 8601). Whole day: next day, e.g. 2026-10-23+09:00 | |
| eventId | Yes | Event ID | |
| subject | No | Event title | |
| location | No | Location | |
| attendees | No | Attendees (참석자). Use get-my-member-info, get-member-list to find member IDs | |
| startedAt | No | Start time (ISO 8601, e.g. 2026-10-22T10:00:00+09:00). Whole day: 2026-10-22+09:00 | |
| calendarId | Yes | Calendar ID | |
| visibility | No | public (공개) or private (비공개) | |
| wholeDayFlag | No | true for a whole day event | |
| recurrenceRule | No | Recurrence rule for a recurring event |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations indicating a destructive mutation, the description adds crucial behavioral context beyond them: partial-update semantics, the fact that attendees and cc lists are replaced rather than merged, and the need to call get-calendar-event first to preserve existing attendees. It also discloses the return value as a success message.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and partial-update semantics, then uses a clearly marked IMPORTANT section and concise examples. Every sentence adds useful information for a complex 14-parameter mutation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive mutation with no output schema, the description covers the main operational pitfalls: partial updates, list replacement, prerequisite event retrieval, and time-field pairing. It does not address permissions, recurrence-series behavior, or timezone edge cases, so it is strong but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents individual parameters. The description adds meaningful semantics beyond the schema, especially for attendees/cc replacement and the requirement to provide both startedAt and endedAt when changing time, though it does not explain several other parameters such as recurrenceRule or alarms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: update a Dooray calendar event. It is clearly distinguishable from sibling tools such as create-calendar-event, delete-calendar-event, and get-calendar-event without needing to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage conditions: only provided fields change, attendees/cc require fetching the event first, and time changes require both startedAt and endedAt. It does not explicitly state when not to use this tool versus create/delete, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-drive-fileADestructive
Upload a new version of an existing file in a Dooray drive.
Required:
driveId: The drive ID
fileId: The file ID to update
filePath: Absolute path to the new version of the file
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.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID to update | |
| driveId | Yes | Drive ID | |
| filePath | Yes | Absolute path to the new file version |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description earns credit for specifying what is destroyed (existing file content replaced by a new version) and the local-path precondition. It also states the return shape (file ID and new version number). It stops short of covering version-history retention or conflict behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action in the first line, then organized into Required/Example/Returns/Note sections. Slight redundancy in re-listing parameters already documented in the schema, but nothing is padded or wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly discloses the return value, and it covers the formatting of filePath via the example plus the existence precondition. Missing only edge-case behavior such as what happens on version conflicts or whether prior versions remain accessible.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters; the description's parameter list largely restates it. The worked example with a realistic absolute filePath adds modest value beyond the schema's one-line field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Upload a new version of an existing file in a Dooray drive") and the word "existing" implicitly separates it from upload-drive-file. It never names that sibling, though, so an agent must infer the boundary between creating a new file and versioning an existing one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Note establishes a precondition ("The file must exist at the specified path") and says the content is replaced, which implies when to use it. There is no explicit when-not guidance or pointer to upload-drive-file for new files, so the routing to alternatives is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-project-templateADestructive
Update an existing task template in a Dooray project.
Required Fields:
projectId: Project ID where the template belongs
templateId: Template ID to update
templateName: Template name (required even for updates)
Optional Fields:
users: Default assignees (to) and CC recipients
body: Default task body content (markdown or HTML)
guide: Instructions shown when creating tasks from this template
subject: Default task subject/title
dueDate: Default due date (ISO 8601 format)
dueDateFlag: Whether due date is enabled
milestoneId: Default milestone
tagIds: Default tags
priority: Default priority (highest, high, normal, low, lowest, none)
isDefault: Set as default template (auto-fills when creating new tasks)
How to get template IDs:
Use the get-project-template-list tool to list all templates and get their IDs.
Examples:
Update name: {"projectId": "123", "templateId": "456", "templateName": "Updated Bug Report"}
Update body: {"projectId": "123", "templateId": "456", "templateName": "Bug Report", "body": {"mimeType": "text/x-markdown", "content": "## New Format"}}
Set as default: {"projectId": "123", "templateId": "456", "templateName": "Main Template", "isDefault": true}
Returns success status.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Default task body content | |
| guide | No | Guide content shown when creating tasks | |
| users | No | Default users for tasks created from this template | |
| tagIds | No | Default tag IDs | |
| dueDate | No | Default due date (ISO 8601 format) | |
| subject | No | Default task subject | |
| priority | No | Default priority | |
| isDefault | No | Set as default template for this project | |
| projectId | Yes | Project ID where the template belongs | |
| templateId | Yes | Template ID to update | |
| dueDateFlag | No | Enable due date | |
| milestoneId | No | Default milestone ID | |
| templateName | Yes | Template name (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as not read-only, destructive, and open-world, so the description does not need to establish the safety profile. It adds some useful detail, such as templateName being required even for updates and a minimal return note, but it never explains what a destructive update replaces or whether omitted fields are preserved.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then organized into required fields, optional fields, ID discovery, and examples. It is somewhat redundant with the schema's own field descriptions, but the structure and examples earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, nested-object, destructive update tool with no output schema, the description covers required fields, optional fields, examples, and a basic return note. The critical missing piece is update semantics: it does not say whether omitted fields are preserved or cleared, which matters for correctly invoking a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters and the nested body/guide structure. The description mostly restates those field descriptions and enum values; its only real additions are that templateName is required even on update and that isDefault auto-fills new tasks, which is not enough to move clearly beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Update an existing task template in a Dooray project.' The word 'existing' distinguishes it from create-project-template, and the template-list reference connects it to the correct sibling for discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for use, separates required from optional fields, and points to `get-project-template-list` for obtaining template IDs. It lacks an explicit statement of when to prefer create-project-template or delete-project-template instead, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-tag-groupADestructive
Update tag group settings in a Dooray project.
Tag Group Settings:
mandatory: When true, at least one tag from this group must be assigned when creating/updating tasks
selectOne: When true, exactly ONE tag from this group can be selected. When false, multiple tags can be selected
Common Configurations:
Required single selection (e.g., Priority, Status):
{"mandatory": true, "selectOne": true}User MUST select exactly one tag
Required multiple selection (e.g., Categories, Skills):
{"mandatory": true, "selectOne": false}User MUST select at least one tag, can select multiple
Optional single selection:
{"mandatory": false, "selectOne": true}User can optionally select one tag
Optional multiple selection (default):
{"mandatory": false, "selectOne": false}User can optionally select multiple tags
Finding Tag Group ID: Use get-tag-list to find tags and their tagGroup information:
{
"tagGroup": {
"id": "group123", // Use this as tagGroupId
"name": "Priority",
"mandatory": false,
"selectOne": false
}
}Examples:
Make group required with single selection:
{"projectId": "123", "tagGroupId": "group456", "mandatory": true, "selectOne": true}Allow multiple selections:
{"projectId": "123", "tagGroupId": "group456", "selectOne": false}
Note: Only provide the settings you want to change. Omitted settings will not be modified.
| Name | Required | Description | Default |
|---|---|---|---|
| mandatory | No | If true, at least one tag from this group is required when creating tasks | |
| projectId | Yes | Project ID | |
| selectOne | No | If true, exactly one tag must be selected. If false, multiple tags can be selected | |
| tagGroupId | Yes | Tag group ID (found in tagGroup.id from get-tag-list or get-tag response) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a destructive, open-world mutation, so the description does not need to re-establish that. It does add real value beyond them: the downstream effect that a group's setting changes what is required when creating/updating tasks, and the important contract that omitted settings are left untouched (partial update, not full replace). It stops short of noting that flipping mandatory can affect existing tasks or that changes are not trivially reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well organized with headers and examples, but over half the text is a combinatorial restatement of two booleans plus examples that repeat the same combinations a third time. The scenario table and the two examples are largely redundant with each other and with the parameter descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter mutation with no output schema and full destructive annotations, this covers everything needed to invoke it correctly: the settings' meaning, the partial-update rule, and how to find the ID. Only the side effects on already-existing tasks are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes further by explaining the joint semantics of mandatory+selectOne and by telling the agent exactly where to obtain tagGroupId (tagGroup.id from get-tag-list). The repetition between the scenario list and the examples keeps it from being maximally efficient, but the added meaning is genuine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Update tag group settings in a Dooray project') and immediately enumerates the two mutable settings. An agent can tell this apart from create-tag and get-tag-list, the latter of which is explicitly named as the source of the required ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The four configuration scenarios and the worked examples make clear which combinations of mandatory/selectOne correspond to real-world setups, and the closing note states the partial-update contract. It lacks explicit 'do not use this for X, use Y instead' guidance (e.g., vs. create-tag or a tag-deletion tool), but the context is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-taskADestructive
Update an existing task in a Dooray project.
RECOMMENDED WORKFLOW (guide for AI assistants):
Fetch Current Task: Call get-task to retrieve current values before updating
Preserves existing data when only updating specific fields
Shows current assignees, tags, milestone, workflow status
Use returned data to know what values to preserve
Determine Changes: Identify what needs updating
If changing assignees/cc: Get options from get-my-member-info, get-project-member-list, get-project-member-group-list
Member types: {"id": "...", "type": "member|group|email"}
"member": organizationMemberId, "group": group id, "email": email address
Handle Tags: Call get-tag-list if updating tags
CRITICAL: Check tagGroup.mandatory=true - MUST include tags from all mandatory groups or update fails (500 error)
tagGroup.selectOne=true: Select exactly ONE tag from group
tagGroup.selectOne=false: Select one or MORE tags from group
IMPORTANT: tagIds is a COMPLETE replacement, not additive
Handle Workflow: Use get-project-workflow-list to see available statuses
Provide workflowId to change task status
Workflow classes: backlog (대기), registered (등록/할 일), working (진행 중), closed (완료)
Handle Parent Post (상위 업무): Provide parentPostId to set a parent task
Nested hierarchy is NOT allowed: a task that already has sub-tasks cannot be set as a parent
IMPORTANT NOTES:
Complete Replacement: assignees, cc, and tagIds completely REPLACE existing values (not merged)
Add / Remove: addAssignees, removeAssignees, addCc, removeCc, addTagIds, removeTagIds change only what you list and keep the rest. The tool reads the current task itself, so get-task is not needed first. Do not combine them with the replacement option of the same field
Preserve Data: Only provide fields you want to change; unprovided fields remain unchanged
Korean Terms: "to" = 담당자 (assignee), "cc" = 참조 (reference)
Priority: Use "none" to remove priority
URL Pattern Recognition: When given a Dooray task URL like "https://nhnent.dooray.com/task/PROJECT_ID/TASK_ID":
Extract the first numeric ID after "/task/" as projectId
Extract the second numeric ID as taskId
Examples:
Change priority: {"projectId": "123", "taskId": "42", "priority": "high"}
Update assignees: {"projectId": "123", "taskId": "42", "assignees": [{"id": "user123", "type": "member"}]}
Change status: {"projectId": "123", "taskId": "42", "workflowId": "working"}
Update tags: {"projectId": "123", "taskId": "42", "tagIds": ["tag1", "tag2"]}
Clear milestone: {"projectId": "123", "taskId": "42", "milestoneId": null}
Set parent task: {"projectId": "123", "taskId": "42", "parentPostId": "99"}
Add a CC, keep others: {"projectId": "123", "taskId": "42", "addCc": [{"id": "user456", "type": "member"}]}
Add and remove tags: {"projectId": "123", "taskId": "42", "addTagIds": ["tag3"], "removeTagIds": ["tag1"]}
Returns: Updated task with all current details.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | New complete list of CC recipients (참조). REPLACES all existing CC recipients. To get options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each CC object has {id: string, type: "member"|"group"|"email"}. | |
| body | No | New task body content | |
| addCc | No | CC recipients to add, keeping current ones. Cannot be combined with assignees or cc. | |
| tagIds | No | New complete array of tag IDs. REPLACES all existing tags. IMPORTANT: Check for mandatory tag groups using get-tag-list tool. Projects may require specific tags from mandatory tag groups, or update will fail with 500 error. | |
| taskId | Yes | Task ID to update | |
| dueDate | No | New due date in ISO 8601 format | |
| subject | No | New task subject/title | |
| priority | No | Task priority level (highest, high, normal, low, lowest, none) | |
| removeCc | No | CC recipients to remove. Cannot be combined with assignees or cc. | |
| addTagIds | No | Tag IDs to add, keeping current tags. Cannot be combined with tagIds. | |
| assignees | No | New complete list of assignees (담당자). REPLACES all existing assignees. To get options: (1) use get-my-member-info for current user, (2) use get-project-member-list for project members, (3) use get-project-member-group-list for member groups. Each assignee object has {id: string, type: "member"|"group"|"email"}. | |
| projectId | Yes | Project ID where the task belongs | |
| workflowId | No | New workflow ID (status). Use get-project-workflow-list to see available workflow statuses for this project. Workflow classes: backlog (대기), registered (등록/할 일), working (진행 중), closed (완료). | |
| milestoneId | No | New milestone ID, or null to remove milestone | |
| addAssignees | No | Assignees to add, keeping current ones. Cannot be combined with assignees or cc. | |
| parentPostId | No | Parent task ID to set as parent (상위 업무 설정). Nested hierarchy is NOT allowed: a task that already has sub-tasks cannot be set as a parent. | |
| removeTagIds | No | Tag IDs to remove. Cannot be combined with tagIds. | |
| removeAssignees | No | Assignees to remove. Cannot be combined with assignees or cc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining replacement-vs-add/remove semantics, mandatory tag-group failure conditions, and parent-task hierarchy restrictions. It also clarifies that unprovided fields remain unchanged and that the response returns the updated task.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but appropriately structured for an 18-parameter destructive update tool, with the purpose and workflow front-loaded. There is some repetition between the workflow notes, schema descriptions, and examples, but it remains usable and well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex destructive update tool with no output schema, the description covers prerequisites, parameter interactions, failure modes, preservation behavior, URL parsing, examples, and the return value. An agent has enough information to invoke it correctly without first inspecting sibling schemas.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds cross-parameter meaning and invocation examples for priority, assignees, tags, workflow, milestone clearing, parentPostId, and add/remove combinations. It also explains member object types and mandatory tag-group constraints in context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Update an existing task in a Dooray project.' It is clearly distinguishable from siblings like create-task, update-task-body, and task-comment tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit recommended workflow, including when to call get-task first and when add/remove helpers avoid that need. It also names specific sibling tools for member, tag, and workflow lookups, and explains when each applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-task-bodyADestructive
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:
oldText must match the current body exactly (copy it from get-task)
Fails if oldText is not found
Fails if oldText appears more than once, unless replaceAll is true. Add surrounding text to make it unique
Examples:
{"projectId": "123", "taskId": "456", "oldText": "2. 배포", "newText": "2. 카나리 배포"}
{"projectId": "123", "taskId": "456", "oldText": "TODO", "newText": "완료", "replaceAll": true}
Returns: replacedCount and the body mimeType.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID | |
| newText | Yes | Replacement text | |
| oldText | Yes | Exact text to replace in the current body | |
| projectId | Yes | Project ID | |
| replaceAll | No | Replace every occurrence (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true and openWorldHint=true, and the description adds important behavioral context: it reads the current body, preserves the rest including inline images and file links, keeps the same mimeType, and returns replacedCount and mimeType. It also discloses failure conditions for missing or duplicate oldText, which is valuable detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and alternative are front-loaded, followed by concise rules and useful examples. The structure is easy to scan, and every section contributes to correct invocation without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the mutation complexity, full parameter coverage, annotations, and absence of an output schema, the description is complete. It explains the replacement behavior, constraints, failure cases, and return values, so an agent has enough information to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful semantics for oldText and replaceAll: exact matching, duplicate handling, and the need to add surrounding text for uniqueness. It does not add much for projectId or taskId, but those are straightforward identifiers already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: replace part of a task body. It also explicitly distinguishes the tool from update-task by naming the scenario where this tool is preferred, so an agent can select it without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use rule: use this instead of update-task when only a few spots in a long body change. It also documents failure conditions and the uniqueness requirement, leaving little ambiguity about when and how to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-task-commentADestructive
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":
Extract the first numeric ID after "/task/" as projectId (if present)
Extract the second numeric ID (or the ID after "/tasks/") as taskId
Use get-task-comment-list to find the comment ID you want to update
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:
To attach files, first upload them using the file upload API
Then provide the returned file IDs in the attachFileIds parameter
See: https://helpdesk.dooray.com/share/pages/9wWo-xwiR66BO5LGshgVTg/2939987647631384419
Workflow:
Use get-task-comment-list to find the comment you want to update and get its ID
Call update-task-comment with the comment ID and new content/attachments
The comment will be modified immediately
Content Format:
Use "text/x-markdown" for markdown formatting (recommended)
Use "text/html" for rich HTML content
Body format: {"mimeType": "text/x-markdown", "content": "..."}
Examples:
Update comment text only: { "projectId": "123456", "taskId": "789012", "commentId": "4219415732999317024", "body": { "mimeType": "text/x-markdown", "content": "## Updated Comment\n\nThis comment has been revised" } }
Update with new attachments: { "projectId": "123456", "taskId": "789012", "commentId": "4219415732999317024", "body": { "mimeType": "text/x-markdown", "content": "See updated files" }, "attachFileIds": ["file123", "file456"] }
Returns: Success message upon completion.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | New comment content | |
| taskId | Yes | Task ID where the comment exists | |
| commentId | Yes | Comment ID to update | |
| projectId | Yes | Project ID where the task belongs | |
| attachFileIds | No | Array of file IDs to attach (optional) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this as a destructive, non-read-only operation, and the description adds meaningful context such as immediate modification, the email-comment limitation, and the attachment upload prerequisite. It does not explicitly state that existing comment content or attachments are overwritten, but the overall behavioral context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, limitation, and required IDs, and the workflow is easy to follow. It is somewhat verbose and includes examples that partially repeat schema-defined structures, but the extra detail is mostly justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a mutation tool with no output schema, the description covers the workflow, required and optional parameters, URL parsing, attachment handling, content format, limitations, and the success return message. An agent has enough information to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented structurally. The description adds substantial semantic value beyond the schema by explaining URL parsing for projectId and taskId, how to obtain commentId, that body and attachFileIds are optional but at least one should be provided, and the expected body format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: updating an existing comment on a Dooray task. It also distinguishes this from related operations by pointing to get-task-comment-list for finding the comment and by stating that email-created comments cannot be modified.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage conditions and exclusions, including the important limitation that comments created from incoming emails cannot be modified. It also provides a clear workflow and names get-task-comment-list as the way to find the comment ID before calling this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-wiki-pageADestructive
Update wiki page title and/or content.
Required: wikiId, pageId, subject Optional: content, referrers
IMPORTANT - subject is required:
Even when only updating content, subject MUST be provided
Without subject, API returns 400 error ("Requested subject can not be null")
If you want to keep the existing title, first call get-wiki-page to get the current subject, then include it in the update
Workflow for content-only update:
Call get-wiki-page with wikiId and pageId to get current page info
Call update-wiki-page with the existing subject and new content
Set referrers to null to clear all referrers.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Page ID (required) | |
| wikiId | Yes | Wiki ID (required) | |
| content | No | New page content in markdown (optional) | |
| subject | No | Page title (required by API even for content-only updates) | |
| referrers | No | Referrers (watchers). Set to null to clear all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, openWorldHint=true, and readOnlyHint=false. The description adds useful operational details beyond annotations, including the API requirement for subject, the 400 error behavior, the content-only workflow, and the referrers-clearing behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then organized into required/optional and workflow sections. It is mostly efficient, though the required/optional list partly repeats the schema and adds some redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, full schema coverage, and lack of an output schema, the description is substantially complete for calling the tool correctly. The main remaining gap is that it does not distinguish this tool from the sibling update-wiki-page-body tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds meaningful semantics beyond the schema, especially the non-obvious requirement that subject must be supplied even for content-only updates and that null referrers clears all referrers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: updating a wiki page's title and/or content. It is understandable on its own, but it does not explicitly distinguish this tool from the sibling update-wiki-page-body tool, so an agent may need to infer which update tool to use.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for required and optional fields and provides a specific workflow for content-only updates. However, it does not name or compare against the closely related update-wiki-page-body sibling, leaving that alternative unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-wiki-page-bodyADestructive
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:
oldText must match the current body exactly (copy it from get-wiki-page)
Fails if oldText is not found
Fails if oldText appears more than once, unless replaceAll is true
Examples:
{"wikiId": "123", "pageId": "456", "oldText": "v1.2", "newText": "v1.3"}
{"wikiId": "123", "pageId": "456", "oldText": "TODO", "newText": "완료", "replaceAll": true}
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) | |
| newText | Yes | Replacement text | |
| oldText | Yes | Exact text to replace in the current body | |
| replaceAll | No | Replace every occurrence (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=true, but the description goes further by disclosing concrete failure conditions: error if oldText is absent, error if it occurs multiple times unless replaceAll is set. That is precisely the behavioral context an agent needs before attempting a destructive write.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what it does and when to use it, then Rules and Examples as scannable blocks. Every line carries information: no restatement of the name, no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, five-parameter mutation tool with no output schema, the definition covers selection, prerequisites, failure modes, and worked payloads. Nothing an agent needs in order to call it correctly is missing, and the sibling routing is handled.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: oldText must match the current body exactly and should be copied from get-wiki-page, and replaceAll governs the multi-occurrence case. The worked examples show the parameters in realistic combination, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the specific verb and resource ('Replace part of a wiki page body') and states the scope ('part of'), with a Korean gloss reinforcing intent. It also explicitly contrasts with the sibling update-wiki-page, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to prefer this tool ('Use this instead of update-wiki-page when only a few spots in a long page change') and what stays untouched (title and rest of body). It also points the agent at get-wiki-page as the source for oldText, which is an actionable prerequisite rather than implied guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update-wiki-page-commentCDestructive
Update a comment on a wiki page.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID (required) | |
| wikiId | Yes | Wiki ID (required) | |
| content | Yes | New comment content in markdown (required) | |
| commentId | Yes | Comment ID (required) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, so an agent already knows this mutates remote state. The description adds nothing about that: it does not say that 'content' replaces the existing comment wholesale, whether prior content is recoverable, or what permissions are needed. Given the destructive warning, the omission of overwrite semantics is a meaningful gap, though nothing in the text contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, so nothing is wasted. However, its brevity comes from under-specification rather than editorial discipline; there is no front-loaded scoping or constraint to justify the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive, open-world mutation with four required identifiers and no output schema, so the description carries most of the explanatory burden. It supplies none of the needed context: no clarification of overwrite behavior, no mention of failure modes for wrong wikiId/pageId/commentId, no indication of what is returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents all four required parameters, including that content is markdown. The description contributes no additional parameter meaning, so the baseline of 3 for high-coverage schemas applies. It could have clarified replace-vs-append for 'content' but does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description decodes the tool name into a sentence: 'Update a comment on a wiki page.' It states a verb and resource, but adds no differentiating detail against siblings like create-wiki-page-comment, delete-wiki-page-comment, or update-wiki-page-body. This is effectively a restatement of the name, which is the textbook tautology case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus create-wiki-page-comment, delete-wiki-page-comment, or get-wiki-page-comment. The agent must infer from the name alone that this edits an existing comment rather than adding one. No prerequisites, no exclusions, no alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-attachmentA
Upload a file attachment to a Dooray task.
Required Parameters:
projectId: The project ID
taskId: The task ID (post ID) to attach the file to
filePath: Absolute path to the file to upload (e.g., "/Users/name/document.pdf")
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.
| Name | Required | Description | Default |
|---|---|---|---|
| taskId | Yes | Task ID (post ID) to attach the file to | |
| filePath | Yes | Absolute path to the file to upload | |
| projectId | Yes | Project ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation is not read-only, not destructive, and open-world. The description adds useful behavior context: the file must exist at the given path, the server imposes a size limit, and the call returns a file ID. It does not cover overwrite behavior or permission requirements, but it adds meaningful detail beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, bulleted required parameters, an example, a return note, and a caveat. It is slightly repetitive with the schema but remains efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter upload tool with full schema coverage and safety annotations, the description covers purpose, parameter examples, return value, and key preconditions. Edge cases such as overwrite behavior or error handling are omitted, but the core information an agent needs is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines all three parameters. The description repeats those definitions and supplies an example with an absolute path, but it adds little semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Upload a file attachment to a Dooray task.' The word 'task' distinguishes it from sibling upload tools for drives and wiki pages, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but gives no guidance on when to use it versus alternatives such as upload-drive-file, upload-wiki-file, or download-attachment. No prerequisites or exclusion conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-drive-fileA
Upload a file to a Dooray drive folder.
Required:
driveId: The drive ID
parentId: Parent folder ID to upload the file into
filePath: Absolute path to the file to upload
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.
| Name | Required | Description | Default |
|---|---|---|---|
| driveId | Yes | Drive ID | |
| filePath | Yes | Absolute path to the file to upload | |
| parentId | Yes | Parent folder ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the agent knows this is a non-destructive write touching external local state. The description adds the useful prerequisite that the local file must exist and that a file ID comes back, but says nothing about overwrite behavior for name collisions, size limits, or required auth scopes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence, then a required-parameters list, an example, a return value, and a caveat — well structured and easy to scan. Mildly redundant with the schema, but nothing is wasted enough to hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, stating 'Returns: File ID of the uploaded file' is genuinely valuable, and the local-file prerequisite covers the main failure mode. What is missing is collision/overwrite behavior and any mention of the destination folder needing to exist, which would matter for an open-world write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema, and the description largely restates them (driveId, parentId, filePath). The worked example does slightly help by showing the concrete format of the values, but it adds no constraint beyond the schema's 'Absolute path' wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (upload a file) plus the exact target system scope (a Dooray drive folder). This clearly separates it from upload-wiki-file, upload-wiki-page-file, and upload-attachment, which target different destinations in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the destination (drive folder) but there is no explicit when-to-use vs. the sibling upload/add-attachment tools, nor any prerequisite about permissions or whether the parent folder must already exist. The only real guidance offered is the note that the file must exist at the given path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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:
wikiId: The wiki ID
filePath: Absolute path to the file to upload (e.g., "/Users/name/document.pdf")
Example: { "wikiId": "123456", "filePath": "/Users/nhn/Downloads/report.pdf" }
Workflow:
Upload file with this tool -> get attachFileId
Create wiki page with create-wiki-page using attachFileIds: [attachFileId]
Returns: File ID and attach file ID of the uploaded file.
| Name | Required | Description | Default |
|---|---|---|---|
| wikiId | Yes | Wiki ID | |
| filePath | Yes | Absolute path to the file to upload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, openWorldHint=true, so the write nature is known; the description adds value by disclosing the returned attachFileId and how it feeds create-wiki-page. It does not cover permissions, file size limits, or overwrite behavior for an existing filename, which is the remaining gap for a write tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose followed by skimmable sections (Required Parameters, Example, Workflow, Returns). Some redundancy between the prose 'pre-upload' sentence, the Workflow section, and the Returns line, but each block is short and the structure aids scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter write tool with no output schema, the description covers purpose, params, return value (file ID and attach file ID), and the end-to-end workflow with the consuming tool. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description raises it slightly with a concrete JSON example that demonstrates the expected path format ("absolute path e.g. /Users/name/document.pdf") and a string-typed wikiId. It doesn't explain whether wikiId must be one the caller has write access to, but the format guidance is real added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Upload a file to a Dooray wiki") and immediately scopes it with "(not page-specific)", which distinguishes it from the sibling upload-wiki-page-file. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the use case (pre-uploading before page creation) and the downstream alternative, create-wiki-page with attachFileIds. The numbered workflow makes the when-to-use and ordering unambiguous, and the 'not page-specific' note excludes the wrong sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload-wiki-page-fileA
Upload a file to an existing Dooray wiki page.
Required Parameters:
wikiId: The wiki ID
pageId: The wiki page ID to attach the file to
filePath: Absolute path to the file to upload (e.g., "/Users/name/document.pdf")
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.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes | Wiki page ID to attach the file to | |
| wikiId | Yes | Wiki ID | |
| filePath | Yes | Absolute path to the file to upload |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the bar is lower, and the description still adds real context: the file must exist on disk, the attachment type is forced to 'general', and the return payload is described. It does not mention size limits or permission requirements, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then organized into required parameters, example, returns, and note — easy to scan. The example is somewhat redundant with the parameter list, costing a bit of brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by naming what is returned (file ID and attach file ID). Combined with the path precondition and the automatic type behavior, an agent has what it needs to call this correctly; only permission/limit details are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema, and the description largely restates them. The concrete example with an absolute path adds minor clarity about the expected path format, but nothing beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Upload a file to an existing Dooray wiki page'), which is precise enough to act on. It does not, however, distinguish itself from close siblings such as upload-wiki-file, upload-attachment, or upload-drive-file, leaving the agent to infer the difference from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Existing wiki page' implies the page must already exist, and the note reinforces the file-path precondition. Beyond that there is no guidance on when to choose this over upload-wiki-file or upload-attachment, so the agent must infer the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
55 tool updates
v0.2.0- Added
copy-drive-file - Added
create-calendar-event - Added
create-drive-folder - Added
create-project-template - Added
create-tag - Changed
create-task1 field changed- added
Input schema / properties / isDraftAdded value: +{ + "description": "Set to true to create a draft task (임시 업무) that can be continued in the browser. Returns a URL for further editing. Default: false (creates regular task).", + "type": "boolean" +}
- Added
create-wiki-page - Added
create-wiki-page-comment - Added
delete-attachment - Added
delete-calendar-event - Added
delete-drive-file - Added
delete-project-template - Added
delete-task-comment - Added
delete-wiki-page - Added
delete-wiki-page-comment - Added
delete-wiki-page-file - Added
download-all-attachments - Added
download-attachment - Added
download-drive-file - Added
download-wiki-attach-file - Added
download-wiki-page-file - Added
get-attachment-list - Added
get-attachment-metadata - Added
get-calendar-event - Added
get-calendar-event-list - Added
get-calendar-list - Added
get-drive-file-list - Added
get-drive-file-meta - Added
get-drive-list - Added
get-member - Added
get-member-list - Added
get-tag - Added
get-task-comment - Added
get-wiki-list - Added
get-wiki-page - Added
get-wiki-page-comment - Added
get-wiki-page-comment-list - Added
get-wiki-page-list - Added
get-wiki-page-tree - Added
move-drive-file - Added
move-wiki-page - Added
rename-drive-file - Added
update-calendar-event - Added
update-drive-file - Added
update-project-template - Added
update-tag-group - Changed
update-task10 fields changed- added
Input schema / properties / addAssigneesAdded value: +{ + "description": "Assignees to add, keeping current ones. Cannot be combined with assignees or cc.", + "items": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "enum": [ + "member", + "group", + "email" + ], + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / addCcAdded value: +{ + "description": "CC recipients to add, keeping current ones. Cannot be combined with assignees or cc.", + "items": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "enum": [ + "member", + "group", + "email" + ], + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / addTagIdsAdded value: +{ + "description": "Tag IDs to add, keeping current tags. Cannot be combined with tagIds.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / parentPostIdAdded value: +{ + "description": "Parent task ID to set as parent (상위 업무 설정). Nested hierarchy is NOT allowed: a task that already has sub-tasks cannot be set as a parent.", + "type": "string" +} - added
Input schema / properties / removeAssigneesAdded value: +{ + "description": "Assignees to remove. Cannot be combined with assignees or cc.", + "items": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "enum": [ + "member", + "group", + "email" + ], + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / removeCcAdded value: +{ + "description": "CC recipients to remove. Cannot be combined with assignees or cc.", + "items": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "enum": [ + "member", + "group", + "email" + ], + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / removeTagIdsAdded value: +{ + "description": "Tag IDs to remove. Cannot be combined with tagIds.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / taskIdAdded value: +{ + "description": "Task ID to update", + "type": "string" +} - removed
Input schema / properties / taskNumberRemoved value: -{ - "description": "Task number to update", - "type": "number" -} - changed
Input schema / requiredPrevious value: -[ - "projectId", - "taskNumber" -]New value: +[ + "projectId", + "taskId" +]
- Added
update-task-body - Added
update-wiki-page - Added
update-wiki-page-body - Added
update-wiki-page-comment - Added
upload-attachment - Added
upload-drive-file - Added
upload-wiki-file - Added
upload-wiki-page-file
17 tool updates
v1.0.0- First observed
create-task - First observed
create-task-comment - First observed
get-milestone-list - First observed
get-my-member-info - First observed
get-project - First observed
get-project-list - First observed
get-project-member-group-list - First observed
get-project-member-list - First observed
get-project-template - First observed
get-project-template-list - First observed
get-project-workflow-list - First observed
get-tag-list - First observed
get-task - First observed
get-task-comment-list - First observed
get-task-list - First observed
update-task - First observed
update-task-comment
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.
Maintenance
Related MCP Connectors
Manage projects, tasks, time tracking, and team collaboration through natural language.
Task manager your agent can fully operate: boards, tasks, sprints, roles, worklogs, day planner.
Manage dillie projects, tasks, and sprints; look up members and search platform documentation.
Manage Orangescrum projects, tasks, users, sprints, test cases, releases, and risks from AI tools.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables integration with Dooray API for comprehensive project management including task operations, comment management, tag organization, search functionality, and user management. Supports task creation, modification, status updates, assignee management, and collaborative features through natural language interactions.7-
- FlicenseBqualityDmaintenanceEnables interaction with Dooray's task and calendar management system, allowing users to filter and list tasks, retrieve details, and manage task comments. It provides a set of tools for seamless integration with MCP-compatible clients like Claude Desktop and Cursor.6-
- FlicenseNot gradedqualityDmaintenanceEnables Claude Code to query, create, and modify Dooray tasks via natural language.-
- AlicenseAqualityBmaintenanceEnables interaction with Megaplan project management platform, allowing users to manage tasks, deals, projects, and comments through natural language.822 npm2MIT