Skip to content

Set a tool's permission for everyone

PUT
/org/tool-permissions/{server}/{tool}
curl --request PUT \
--url https://api.asklucy.eu/v1/org/tool-permissions/m365/mail_send \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "permission": "allow" }'

allow, ask or deny for everyone in the organization; null goes back to the tool’s default. People can still make it stricter for themselves; nobody can make it looser. Takes effect from Lucy’s next answer (an answer already running keeps the tools it started with; Microsoft 365 checks again on every call). Audited as tool.permission_changed (scope organization).

server
required
string

Example

m365

The tool server, a connector (m365) or local (local access).

tool
required
string

Example

mail_send

The tool’s name on its server, without the server prefix.

Media typeapplication/json
object
permission
required
One of:

What Lucy may do with a tool. allow: it uses the tool without asking. ask: each call waits for the person’s yes on a card in the chat (Step.approval). deny: the tool is hidden from the model, which never sees it. Stricter is deny > ask > allow.

string
Allowed values: allow ask deny

OK

Media typeapplication/json
object
server
required

The tool server, a connector (m365) or local.

string
tool
required

The tool’s name on its server (the model sees <server>.<tool>).

string
title
required
string
description
required

One line on what the tool does, for settings pages.

string
app
required

The connector’s app the tool belongs to (ConnectorApp.id); null for local access.

string | null
access
required

For local access, whether the tool reads or changes files; null otherwise.

string | null
Allowed values: read write
hints
required

The tool’s MCP annotations the default is read from.

object
read_only
required
boolean
destructive
required
boolean
open_world
required

It reaches outside the person’s own data, such as other people (sending, inviting).

boolean
annotated

The server gave annotations (Lucy’s catalog always does). False for a custom server’s tool without any.

boolean
default
required

What Lucy may do with a tool. allow: it uses the tool without asking. ask: each call waits for the person’s yes on a card in the chat (Step.approval). deny: the tool is hidden from the model, which never sees it. Stricter is deny > ask > allow.

string
Allowed values: allow ask deny
organization
required

What Lucy may do with a tool. allow: it uses the tool without asking. ask: each call waits for the person’s yes on a card in the chat (Step.approval). deny: the tool is hidden from the model, which never sees it. Stricter is deny > ask > allow.

string
Allowed values: allow ask deny
organization_set
required

An admin set organization; false when it is the tool’s default.

boolean
mine
required
One of:

What Lucy may do with a tool. allow: it uses the tool without asking. ask: each call waits for the person’s yes on a card in the chat (Step.approval). deny: the tool is hidden from the model, which never sees it. Stricter is deny > ask > allow.

string
Allowed values: allow ask deny
effective
required

What Lucy may do with a tool. allow: it uses the tool without asking. ask: each call waits for the person’s yes on a card in the chat (Step.approval). deny: the tool is hidden from the model, which never sees it. Stricter is deny > ask > allow.

string
Allowed values: allow ask deny
changed

For a custom server’s tool, new or changed since an admin reviewed it; organization is then ask at most.

boolean
choices
required

The values the caller may set: an admin any of the three; a person organization and what is stricter (only deny when the organization asks, none when it denies).

Array<string>
Allowed values: allow ask deny

Example

{
"server": "m365",
"tool": "mail_send",
"title": "Send an email",
"app": "send_mail",
"access": "read",
"default": "allow",
"organization": "allow",
"mine": "allow",
"effective": "allow",
"choices": [
"allow"
]
}

The request is invalid; errors lists what’s wrong.

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
string
instance
string
request_id
string
quota

For quota-exceeded, the window that is used up.

object
window
required
string
Allowed values: five_hours week month
percent_used
required
number
<= 100
resets_at
required

Null for a rolling window that hasn’t started.

string | null format: date-time
limited_by
required

organization when the organization’s budget is closer to running out than the member’s own limit.

string
Allowed values: personal organization
request
One of:

A request as its member sees it, where they asked.

object
id
required
string
status
required
string
Allowed values: pending approved declined withdrawn
created_at
required
string format: date-time
decided_at
required
string | null format: date-time
note
required

What the admin who decided wrote back.

string | null
errors

Field-level problems (400 only).

Array<object>
object
field
required

JSON pointer into the request body.

string
message
required
string

Example

{
"type": "https://docs.asklucy.eu/errors/answer-in-progress",
"quota": {
"window": "five_hours",
"limited_by": "personal",
"request": {
"status": "pending"
}
}
}
X-Request-Id
string

Unique per request; quote it to support.

Missing, expired or invalid token.

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
string
instance
string
request_id
string
quota

For quota-exceeded, the window that is used up.

object
window
required
string
Allowed values: five_hours week month
percent_used
required
number
<= 100
resets_at
required

Null for a rolling window that hasn’t started.

string | null format: date-time
limited_by
required

organization when the organization’s budget is closer to running out than the member’s own limit.

string
Allowed values: personal organization
request
One of:

A request as its member sees it, where they asked.

object
id
required
string
status
required
string
Allowed values: pending approved declined withdrawn
created_at
required
string format: date-time
decided_at
required
string | null format: date-time
note
required

What the admin who decided wrote back.

string | null
errors

Field-level problems (400 only).

Array<object>
object
field
required

JSON pointer into the request body.

string
message
required
string

Example

{
"type": "https://docs.asklucy.eu/errors/answer-in-progress",
"quota": {
"window": "five_hours",
"limited_by": "personal",
"request": {
"status": "pending"
}
}
}
X-Request-Id
string

Unique per request; quote it to support.

The token is valid but lacks the role this needs.

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
string
instance
string
request_id
string
quota

For quota-exceeded, the window that is used up.

object
window
required
string
Allowed values: five_hours week month
percent_used
required
number
<= 100
resets_at
required

Null for a rolling window that hasn’t started.

string | null format: date-time
limited_by
required

organization when the organization’s budget is closer to running out than the member’s own limit.

string
Allowed values: personal organization
request
One of:

A request as its member sees it, where they asked.

object
id
required
string
status
required
string
Allowed values: pending approved declined withdrawn
created_at
required
string format: date-time
decided_at
required
string | null format: date-time
note
required

What the admin who decided wrote back.

string | null
errors

Field-level problems (400 only).

Array<object>
object
field
required

JSON pointer into the request body.

string
message
required
string

Example

{
"type": "https://docs.asklucy.eu/errors/answer-in-progress",
"quota": {
"window": "five_hours",
"limited_by": "personal",
"request": {
"status": "pending"
}
}
}
X-Request-Id
string

Unique per request; quote it to support.

No such object in your organization.

Media typeapplication/problem+json

RFC 9457 problem details.

object
type
required
string format: uri-reference
title
required
string
status
required
integer
detail
string
instance
string
request_id
string
quota

For quota-exceeded, the window that is used up.

object
window
required
string
Allowed values: five_hours week month
percent_used
required
number
<= 100
resets_at
required

Null for a rolling window that hasn’t started.

string | null format: date-time
limited_by
required

organization when the organization’s budget is closer to running out than the member’s own limit.

string
Allowed values: personal organization
request
One of:

A request as its member sees it, where they asked.

object
id
required
string
status
required
string
Allowed values: pending approved declined withdrawn
created_at
required
string format: date-time
decided_at
required
string | null format: date-time
note
required

What the admin who decided wrote back.

string | null
errors

Field-level problems (400 only).

Array<object>
object
field
required

JSON pointer into the request body.

string
message
required
string

Example

{
"type": "https://docs.asklucy.eu/errors/answer-in-progress",
"quota": {
"window": "five_hours",
"limited_by": "personal",
"request": {
"status": "pending"
}
}
}
X-Request-Id
string

Unique per request; quote it to support.