MCP Core Tools
Easy8 core tools are available from the built-in MCP server when the related service classes load successfully and the effective API user has the required permissions.
Every tool publishes a JSON schema through tools/list; clients should use that schema as the source of truth for accepted arguments and supported filters. Cross-field requirements are still validated by the tool at runtime.
easy8_projects_list
Lists visible projects.
Use it when the client needs to resolve a project before creating or filtering issues.
Arguments:
limit- maximum number of projects to returnoffset- pagination offsetname- project name filter
easy8_users_me
Returns the effective Easy8 user for this MCP request.
Use it when the prompt contains terms like me, my, mine, or assigned to me and the client wants to resolve the current user before calling another tool.
Example request:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "easy8_users_me",
"arguments": {}
}
}
easy8_users_search
Searches visible active users and returns IDs suitable for assignment.
Arguments:
limit- maximum number of users to returnoffset- pagination offsetquery- name, login, or numeric user ID to searchproject_id- optional visible project ID; limits results to project members
easy8_issues_list
Lists visible issues.
For prompts such as Show me all issues which are assigned to me, call this tool with assigned_to_id: "me". The server resolves me through the effective API user described in User identity.
The response includes issue metadata, description, comments_count, start_date, due_date, tag_list, custom_fields, and nested reference objects for related records such as project, tracker, status, priority, author, and assigned_to. Each visible custom field contains id, name, and value; values can be arrays for multiple-value fields. List responses include offset, limit, and has_more metadata. When has_more is true, the response also includes next_offset. The response includes total_count only when include_total_count is true; counting broad result sets can be expensive.
Arguments:
limit- maximum number of issues to returnoffset- pagination offsetproject_id- filter by projectassigned_to_id- filter by assignee user ID, or use"me"for the effective current MCP userstatus- high-level status filter,all,open, orclosedstatus_id- specific status ID or list of IDssubject- subject text filterdue_date_period- relative due date filtersort_by- sortable EasyIssueQuery column name, such ascreated_onorupdated_onsort_direction- sort direction,ascordescinclude_total_count- whentrue, includetotal_count; use only when the client needs an exact count
easy8_issues_get
Returns one visible issue by ID.
Arguments:
id- issue IDinclude_journals- whentrue, include a paginated page of visible journal notesjournals_limit- maximum number of journal notes returned wheninclude_journalsistruejournals_offset- pagination offset for journal notes wheninclude_journalsistrue
The response includes issue metadata, description, tag_list, custom_fields, and comments_count. Each visible custom field contains id, name, and value; values can be arrays for multiple-value fields. When include_journals is true, the response also includes journals, journals_total_count, journals_offset, and journals_limit.
easy8_issues_comments_list
Lists visible issue journal notes ordered from newest to oldest.
Arguments:
id- issue IDlimit- maximum number of commentsoffset- pagination offset
The response includes comments, total_count, offset, and limit.
Issue attachment tools
Use these tools when the user asks to attach files to a task/issue, list files already attached to a task/issue, or read an attachment so the assistant can analyze its contents.
Tools:
easy8_issue_attachments_list- lists visible attachments on an issueeasy8_issue_attachments_upload- uploads content provided in the tool arguments as a new issue attachmenteasy8_issue_attachments_read- reads one visible issue attachment or a selected attachment version, returning text, an image, or metadata for unsupported binary formats
Important behavior:
- Do not pass local file paths to
easy8_issue_attachments_upload; the Easy8 server cannot read files from the client machine. - To upload a local file, the client-side assistant must read the file content first, then pass that content as
content. - Use
content_encoding: "plain"for text andcontent_encoding: "base64"for binary files. - When the attachment ID is unknown, use
easy8_issue_attachments_listfirst. easy8_issue_attachments_readkeeps JSON metadata in the first MCP text block,result.content[0].text.- In
content_format: "auto", files detected asimage/*from their bytes using Marcel return the complete original image as a separate standard MCP image block withtype: "image", base64data, and the detectedmimeType. The metadata reportsanalysis_supported: true. Image data is not embedded in the metadata JSON or encoded as another text block. - The image path has no size limit and does not create thumbnails, resize, convert, or truncate images.
max_bytesdoes not limit images inautomode. - Text-like files return
content_encoding: "plain"and may be truncated according tomax_bytes. Explicitcontent_format: "text"forces UTF-8 text reading, with invalid bytes replaced, even for images or other binary files; the text byte limit applies in this mode. - Unsupported non-image binary files, such as PDFs and spreadsheets, still return metadata only with
analysis_supported: falseinautomode. - Client/provider payload limits and image-format support are external constraints; this code does not bypass them. Reading original image bytes requires memory proportional to the file size, plus the base64 representation. See Attachment read troubleshooting.
Read arguments:
id- required issue IDattachment_id- requiredAttachment.idby default; anAttachmentVersion.idwhenversionistrueversion- optional boolean, defaults tofalse; set totruefor an attachment-version URL such as/attachments/789?version=true, passing789asattachment_idcontent_format-auto(default) ortextmax_bytes- text-read limit in bytes, defaults to 262144 (256 KiB), capped at 1048576 (1 MiB); applies only to text-like reads and explicitcontent_format: "text"
The version flag selects the ID namespace explicitly. There is no fallback from Attachment to AttachmentVersion or vice versa, even if the same numeric ID exists in both tables. The server scopes lookup to the visible issue and checks the parent attachment and selected version permissions; possession of an ID or URL does not grant access.
For a selected version, response metadata keeps attachment.id as the parent Attachment.id. attachment.version_id identifies the selected AttachmentVersion record, and attachment.version is its version number. File metadata and returned bytes come from that selected version, not the current parent file. Privacy (is_private) remains that of the parent attachment.
All IDs in the examples below are synthetic and do not establish any real issue/attachment relationship.
Example upload request:
{
"jsonrpc": "2.0",
"id": 12,
"method": "tools/call",
"params": {
"name": "easy8_issue_attachments_upload",
"arguments": {
"id": 123,
"filename": "analysis.md",
"content": "# Analysis\n\nSummary from the assistant.",
"content_encoding": "plain",
"content_type": "text/markdown",
"description": "Generated analysis"
}
}
}
Example read request:
{
"jsonrpc": "2.0",
"id": 13,
"method": "tools/call",
"params": {
"name": "easy8_issue_attachments_read",
"arguments": {
"id": 123,
"attachment_id": 456,
"content_format": "auto",
"max_bytes": 262144
}
}
}
Example version read request, assuming the synthetic URL /attachments/789?version=true belongs to a version of attachment 456 on issue 123:
{
"jsonrpc": "2.0",
"id": 14,
"method": "tools/call",
"params": {
"name": "easy8_issue_attachments_read",
"arguments": {
"id": 123,
"attachment_id": 789,
"version": true,
"content_format": "auto"
}
}
}
For the image response layout, see Attachment image content.
easy8_issues_create
Creates a new issue.
Arguments include:
- project selectors:
project_id,projectId,project,project_name,project_identifier - subject aliases:
subject,title,name - issue fields:
tracker_id,description,description_format,assigned_to_id,priority_id,status_id,parent_issue_id,parent_id,start_date,due_date - custom fields:
custom_fields
Notes:
- the issue subject is required
- a project selector is required
- permissions are checked with standard Easy8 authorization
- required custom fields are validated server-side
parent_issue_idcreates a subtask;parent_idis accepted as an alias whenparent_issue_idis absent
easy8_issues_update
Updates an existing issue.
Arguments include:
id- issue IDsubjectdescriptionassigned_to_idpriority_idstatus_idparent_issue_id- moves the issue under another issue; usenullto remove the parentparent_id- alias forparent_issue_idwhenparent_issue_idis absentstart_datedue_datecustom_fields- array of{ "id": integer, "value": string | integer | array }valuesnotes- appends a new comment to the issue journaldescription_formatandnotes_format- set tomarkdownwhen sending Markdown text
Changing a custom field follows the normal issue update flow and records a journal entry when the value changes.
Project workflow tools
easy8_projects_geteasy8_projects_createeasy8_projects_updateeasy8_projects_archiveeasy8_projects_unarchiveeasy8_projects_closeeasy8_projects_reopeneasy8_projects_copy
easy8_projects_get returns visible project custom_fields as { "id", "name", "value" } objects. Values can be arrays for multiple-value fields.
Project member tools
easy8_project_members_listeasy8_project_members_addeasy8_project_members_update
Project version tools
easy8_project_versions_listeasy8_project_versions_geteasy8_project_versions_createeasy8_project_versions_update
Project issue category tools
easy8_project_issue_categories_listeasy8_project_issue_categories_createeasy8_project_issue_categories_update
Metadata and issue workflow tools
easy8_issue_statuses_listeasy8_issue_priorities_listeasy8_trackers_listeasy8_time_entry_activities_listeasy8_custom_fields_listeasy8_issues_transition_optionseasy8_issues_comments_createeasy8_issue_attachments_listeasy8_issue_attachments_uploadeasy8_issue_attachments_readeasy8_issue_relations_listeasy8_issue_relations_create
easy8_time_entry_activities_list
Lists time entry activities allowed for a project or issue context.
Use it before easy8_time_entries_create when the client does not already know the correct activity_id. This is especially important when correcting or splitting wrongly logged time into multiple entries on different projects, because each project can allow a different set of time entry activities.
Arguments:
project_id- project context for activity lookupissue_id- issue context for activity lookup; the issue project is usedactive- when omitted, only active activities are returnedlimit- maximum number of activitiesoffset- pagination offset
When both issue_id and project_id are provided, the project must match the issue project. The response includes time_entry_activities, project_id, issue_id when an issue was used, and default_activity_id when Easy8 can resolve one.
Time entry tools
easy8_time_entries_listeasy8_time_entries_geteasy8_time_entries_createeasy8_time_entries_update
easy8_time_entries_create
Creates a time entry using Easy8 safe attributes and permissions.
Required runtime context:
- provide either
issue_idorproject_id - provide
hoursandspent_on - provide
activity_idunless Easy8 can resolve a default or fixed issue activity
Recommended client flow:
- Resolve the target issue or project.
- Call
easy8_time_entry_activities_listwith thatissue_idorproject_id. - Use one returned
time_entry_activities[].idasactivity_idineasy8_time_entries_create.
If activity_id is missing and Easy8 cannot resolve a default, the tool returns a tool-level error that tells the client to call easy8_time_entry_activities_list and includes visible candidate activity IDs.