Xero Projects API — Project
Xero Projects API — Project. 16 operations. Lead operation: Xero Retrieves all projects. Self-contained Naftiko capability covering one Xero business surface.
What You Can Do
MCP Tools
xero-retrieves-all-projects
Xero Retrieves all projects
xero-create-one-more-new
Xero Create one or more new projects
xero-retrieves-single-project
Xero Retrieves a single project
xero-updates-specific-project
Xero Updates a specific project
xero-creates-project-specified-contact
Xero creates a project for the specified contact
xero-retrieves-all-project-tasks
Xero Retrieves all project tasks
xero-allows-you-create-task
Xero Allows you to create a task
xero-retrieves-single-project-task
Xero Retrieves a single project task
xero-allows-you-update-task
Xero Allows you to update a task
xero-allows-you-delete-task
Xero Allows you to delete a task
xero-retrieves-all-time-entries
Xero Retrieves all time entries associated with a specific project
xero-creates-time-entry-specific
Xero Creates a time entry for a specific project
xero-retrieves-single-time-entry
Xero Retrieves a single time entry for a specific project
xero-updates-time-entry-specific
Xero Updates a time entry for a specific project
xero-deletes-time-entry-specific
Xero Deletes a time entry for a specific project
xero-retrieves-list-all-project
Xero Retrieves a list of all project users
Capability Spec
naftiko: 1.0.0-alpha2
info:
label: Xero Projects API — Project
description: 'Xero Projects API — Project. 16 operations. Lead operation: Xero Retrieves all projects. Self-contained Naftiko
capability covering one Xero business surface.'
tags:
- Xero
- Project
created: '2026-05-19'
modified: '2026-05-19'
binds:
- namespace: env
keys:
XERO_API_KEY: XERO_API_KEY
capability:
consumes:
- type: http
namespace: projects-project
baseUri: https://api.xero.com/projects.xro/2.0
description: Xero Projects API — Project business capability. Self-contained, no shared references.
resources:
- name: Projects
path: /Projects
operations:
- name: getprojects
method: GET
description: Xero Retrieves all projects
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectIds
in: query
type: array
description: Search for all projects that match a comma separated list of projectIds
- name: contactID
in: query
type: string
description: Filter for projects for a specific contact
- name: states
in: query
type: string
description: Filter for projects in a particular state (INPROGRESS or CLOSED)
- name: page
in: query
type: integer
description: set to 1 by default. The requested number of the page in paged response - Must be a number greater
than 0.
- name: pageSize
in: query
type: integer
description: Optional, it is set to 50 by default. The number of items to return per page in a paged response -
Must be a number between 1 and 500.
- name: createproject
method: POST
description: Xero Create one or more new projects
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: Projects-projectId
path: /Projects/{projectId}
operations:
- name: getproject
method: GET
description: Xero Retrieves a single project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: updateproject
method: PUT
description: Xero Updates a specific project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: patchproject
method: PATCH
description: Xero creates a project for the specified contact
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: Projects-projectId-Tasks
path: /Projects/{projectId}/Tasks
operations:
- name: gettasks
method: GET
description: Xero Retrieves all project tasks
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: page
in: query
type: integer
description: Set to 1 by default. The requested number of the page in paged response - Must be a number greater
than 0.
- name: pageSize
in: query
type: integer
description: Optional, it is set to 50 by default. The number of items to return per page in a paged response -
Must be a number between 1 and 500.
- name: taskIds
in: query
type: string
description: Search for all tasks that match a comma separated list of taskIds, i.e. GET https://.../tasks?taskIds={taskID},{taskID}
- name: createtask
method: POST
description: Xero Allows you to create a task
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can create a task on a specified projectId
required: true
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: Projects-projectId-Tasks-taskId
path: /Projects/{projectId}/Tasks/{taskId}
operations:
- name: gettask
method: GET
description: Xero Retrieves a single project task
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: taskId
in: path
type: string
description: You can specify an individual task by appending the taskId to the endpoint, i.e. GET https://.../tasks/{taskID}
required: true
- name: updatetask
method: PUT
description: Xero Allows you to update a task
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: taskId
in: path
type: string
description: You can specify an individual task by appending the id to the endpoint
required: true
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: deletetask
method: DELETE
description: Xero Allows you to delete a task
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: taskId
in: path
type: string
description: You can specify an individual task by appending the id to the endpoint
required: true
- name: Projects-projectId-Time
path: /Projects/{projectId}/Time
operations:
- name: gettimeentries
method: GET
description: Xero Retrieves all time entries associated with a specific project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: Identifier of the project, that the task (which the time entry is logged against) belongs to.
required: true
- name: userId
in: query
type: string
description: The xero user identifier of the person who logged time.
- name: taskId
in: query
type: string
description: Identifier of the task that time entry is logged against.
- name: invoiceId
in: query
type: string
description: Finds all time entries for this invoice.
- name: contactId
in: query
type: string
description: Finds all time entries for this contact identifier.
- name: page
in: query
type: integer
description: Set to 1 by default. The requested number of the page in paged response - Must be a number greater
than 0.
- name: pageSize
in: query
type: integer
description: Optional, it is set to 50 by default. The number of items to return per page in a paged response -
Must be a number between 1 and 500.
- name: states
in: query
type: array
description: Comma-separated list of states to find. Will find all time entries that are in the status of whatever
is specified.
- name: isChargeable
in: query
type: boolean
description: Finds all time entries which relate to tasks with the charge type `TIME` or `FIXED`.
- name: dateAfterUtc
in: query
type: string
description: ISO 8601 UTC date. Finds all time entries on or after this date filtered on the `dateUtc` field.
- name: dateBeforeUtc
in: query
type: string
description: ISO 8601 UTC date. Finds all time entries on or before this date filtered on the `dateUtc` field.
- name: createtimeentry
method: POST
description: Xero Creates a time entry for a specific project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: Projects-projectId-Time-timeEntryId
path: /Projects/{projectId}/Time/{timeEntryId}
operations:
- name: gettimeentry
method: GET
description: Xero Retrieves a single time entry for a specific project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: timeEntryId
in: path
type: string
description: You can specify an individual time entry by appending the id to the endpoint
required: true
- name: updatetimeentry
method: PUT
description: Xero Updates a time entry for a specific project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: timeEntryId
in: path
type: string
description: You can specify an individual time entry by appending the id to the endpoint
required: true
- name: body
in: body
type: object
description: Request body (JSON).
required: true
- name: deletetimeentry
method: DELETE
description: Xero Deletes a time entry for a specific project
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: projectId
in: path
type: string
description: You can specify an individual project by appending the projectId to the endpoint
required: true
- name: timeEntryId
in: path
type: string
description: You can specify an individual task by appending the id to the endpoint
required: true
- name: ProjectsUsers
path: /ProjectsUsers
operations:
- name: getprojectusers
method: GET
description: Xero Retrieves a list of all project users
outputRawFormat: json
outputParameters:
- name: result
type: object
value: $.
inputParameters:
- name: page
in: query
type: integer
description: set to 1 by default. The requested number of the page in paged response - Must be a number greater
than 0.
- name: pageSize
in: query
type: integer
description: Optional, it is set to 50 by default. The number of items to return per page in a paged response -
Must be a number between 1 and 500.
authentication:
type: bearer
token: '{{env.XERO_API_KEY}}'
exposes:
- type: rest
namespace: projects-project-rest
port: 8080
description: REST adapter for Xero Projects API — Project. One Spectral-compliant resource per consumed operation, prefixed
with /v1.
resources:
- path: /v1/projects
name: projects
description: REST surface for Projects.
operations:
- method: GET
name: getprojects
description: Xero Retrieves all projects
call: projects-project.getprojects
with:
projectIds: rest.projectIds
contactID: rest.contactID
states: rest.states
page: rest.page
pageSize: rest.pageSize
outputParameters:
- type: object
mapping: $.
- method: POST
name: createproject
description: Xero Create one or more new projects
call: projects-project.createproject
with:
body: rest.body
outputParameters:
- type: object
mapping: $.
- path: /v1/projects/{projectid}
name: projects-projectid
description: REST surface for Projects-projectId.
operations:
- method: GET
name: getproject
description: Xero Retrieves a single project
call: projects-project.getproject
with:
projectId: rest.projectId
outputParameters:
- type: object
mapping: $.
- method: PUT
name: updateproject
description: Xero Updates a specific project
call: projects-project.updateproject
with:
projectId: rest.projectId
body: rest.body
outputParameters:
- type: object
mapping: $.
- method: PATCH
name: patchproject
description: Xero creates a project for the specified contact
call: projects-project.patchproject
with:
projectId: rest.projectId
body: rest.body
outputParameters:
- type: object
mapping: $.
- path: /v1/projects/{projectid}/tasks
name: projects-projectid-tasks
description: REST surface for Projects-projectId-Tasks.
operations:
- method: GET
name: gettasks
description: Xero Retrieves all project tasks
call: projects-project.gettasks
with:
projectId: rest.projectId
page: rest.page
pageSize: rest.pageSize
taskIds: rest.taskIds
outputParameters:
- type: object
mapping: $.
- method: POST
name: createtask
description: Xero Allows you to create a task
call: projects-project.createtask
with:
projectId: rest.projectId
body: rest.body
outputParameters:
- type: object
mapping: $.
- path: /v1/projects/{projectid}/tasks/{taskid}
name: projects-projectid-tasks-taskid
description: REST surface for Projects-projectId-Tasks-taskId.
operations:
- method: GET
name: gettask
description: Xero Retrieves a single project task
call: projects-project.gettask
with:
projectId: rest.projectId
taskId: rest.taskId
outputParameters:
- type: object
mapping: $.
- method: PUT
name: updatetask
description: Xero Allows you to update a task
call: projects-project.updatetask
with:
projectId: rest.projectId
taskId: rest.taskId
body: rest.body
outputParameters:
- type: object
mapping: $.
- method: DELETE
name: deletetask
description: Xero Allows you to delete a task
call: projects-project.deletetask
with:
projectId: rest.projectId
taskId: rest.taskId
outputParameters:
- type: object
mapping: $.
- path: /v1/projects/{projectid}/time
name: projects-projectid-time
description: REST surface for Projects-projectId-Time.
operations:
- method: GET
name: gettimeentries
description: Xero Retrieves all time entries associated with a specific project
call: projects-project.gettimeentries
with:
projectId: rest.projectId
userId: rest.userId
taskId: rest.taskId
invoiceId: rest.invoiceId
contactId: rest.contactId
page: rest.page
pageSize: rest.pageSize
states: rest.states
isChargeable: rest.isChargeable
dateAfterUtc: rest.dateAfterUtc
dateBeforeUtc: rest.dateBeforeUtc
outputParameters:
- type: object
mapping: $.
- method: POST
name: createtimeentry
description: Xero Creates a time entry for a specific project
call: projects-project.createtimeentry
with:
projectId: rest.projectId
body: rest.body
outputParameters:
- type: object
mapping: $.
- path: /v1/projects/{projectid}/time/{timeentryid}
name: projects-projectid-time-timeentryid
description: REST surface for Projects-projectId-Time-timeEntryId.
operations:
- method: GET
name: gettimeentry
description: Xero Retrieves a single time entry for a specific project
call: projects-project.gettimeentry
with:
projectId: rest.projectId
timeEntryId: rest.timeEntryId
outputParameters:
- type: object
mapping: $.
- method: PUT
name: updatetimeentry
description: Xero Updates a time entry for a specific project
call: projects-project.updatetimeentry
with:
projectId: rest.projectId
timeEntryId: rest.timeEntryId
body: rest.body
outputParameters:
- type: object
mapping: $.
- method: DELETE
name: deletetimeentry
description: Xero Deletes a time entry for a specific project
call: projects-project.deletetimeentry
with:
projectId: rest.projectId
timeEntryId: rest.timeEntryId
outputParameters:
- type: object
mapping: $.
- path: /v1/projectsusers
name: projectsusers
description: REST surface for ProjectsUsers.
operations:
- method: GET
name: getprojectusers
description: Xero Retrieves a list of all project users
call: projects-project.getprojectusers
with:
page: rest.page
pageSize: rest.pageSize
outputParameters:
- type: object
mapping: $.
- type: mcp
namespace: projects-project-mcp
port: 9090
transport: http
description: MCP adapter for Xero Projects API — Project. One tool per consumed operation, routed inline through this
capability's consumes block.
tools:
- name: xero-retrieves-all-projects
description: Xero Retrieves all projects
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.getprojects
with:
projectIds: tools.projectIds
contactID: tools.contactID
states: tools.states
page: tools.page
pageSize: tools.pageSize
outputParameters:
- type: object
mapping: $.
- name: xero-create-one-more-new
description: Xero Create one or more new projects
hints:
readOnly: false
destructive: false
idempotent: false
call: projects-project.createproject
with:
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-retrieves-single-project
description: Xero Retrieves a single project
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.getproject
with:
projectId: tools.projectId
outputParameters:
- type: object
mapping: $.
- name: xero-updates-specific-project
description: Xero Updates a specific project
hints:
readOnly: false
destructive: false
idempotent: true
call: projects-project.updateproject
with:
projectId: tools.projectId
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-creates-project-specified-contact
description: Xero creates a project for the specified contact
hints:
readOnly: false
destructive: false
idempotent: true
call: projects-project.patchproject
with:
projectId: tools.projectId
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-retrieves-all-project-tasks
description: Xero Retrieves all project tasks
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.gettasks
with:
projectId: tools.projectId
page: tools.page
pageSize: tools.pageSize
taskIds: tools.taskIds
outputParameters:
- type: object
mapping: $.
- name: xero-allows-you-create-task
description: Xero Allows you to create a task
hints:
readOnly: false
destructive: false
idempotent: false
call: projects-project.createtask
with:
projectId: tools.projectId
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-retrieves-single-project-task
description: Xero Retrieves a single project task
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.gettask
with:
projectId: tools.projectId
taskId: tools.taskId
outputParameters:
- type: object
mapping: $.
- name: xero-allows-you-update-task
description: Xero Allows you to update a task
hints:
readOnly: false
destructive: false
idempotent: true
call: projects-project.updatetask
with:
projectId: tools.projectId
taskId: tools.taskId
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-allows-you-delete-task
description: Xero Allows you to delete a task
hints:
readOnly: false
destructive: true
idempotent: true
call: projects-project.deletetask
with:
projectId: tools.projectId
taskId: tools.taskId
outputParameters:
- type: object
mapping: $.
- name: xero-retrieves-all-time-entries
description: Xero Retrieves all time entries associated with a specific project
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.gettimeentries
with:
projectId: tools.projectId
userId: tools.userId
taskId: tools.taskId
invoiceId: tools.invoiceId
contactId: tools.contactId
page: tools.page
pageSize: tools.pageSize
states: tools.states
isChargeable: tools.isChargeable
dateAfterUtc: tools.dateAfterUtc
dateBeforeUtc: tools.dateBeforeUtc
outputParameters:
- type: object
mapping: $.
- name: xero-creates-time-entry-specific
description: Xero Creates a time entry for a specific project
hints:
readOnly: false
destructive: false
idempotent: false
call: projects-project.createtimeentry
with:
projectId: tools.projectId
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-retrieves-single-time-entry
description: Xero Retrieves a single time entry for a specific project
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.gettimeentry
with:
projectId: tools.projectId
timeEntryId: tools.timeEntryId
outputParameters:
- type: object
mapping: $.
- name: xero-updates-time-entry-specific
description: Xero Updates a time entry for a specific project
hints:
readOnly: false
destructive: false
idempotent: true
call: projects-project.updatetimeentry
with:
projectId: tools.projectId
timeEntryId: tools.timeEntryId
body: tools.body
outputParameters:
- type: object
mapping: $.
- name: xero-deletes-time-entry-specific
description: Xero Deletes a time entry for a specific project
hints:
readOnly: false
destructive: true
idempotent: true
call: projects-project.deletetimeentry
with:
projectId: tools.projectId
timeEntryId: tools.timeEntryId
outputParameters:
- type: object
mapping: $.
- name: xero-retrieves-list-all-project
description: Xero Retrieves a list of all project users
hints:
readOnly: true
destructive: false
idempotent: true
call: projects-project.getprojectusers
with:
page: tools.page
pageSize: tools.pageSize
outputParameters:
- type: object
mapping: $.