Add your own MCP server
const url = 'https://api.asklucy.eu/v1/mcp-servers';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"name":"example","server":"example","url":"https://example.com","auth":{"type":"none","header":"example","secret":"example"}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.asklucy.eu/v1/mcp-servers \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "name": "example", "server": "example", "url": "https://example.com", "auth": { "type": "none", "header": "example", "secret": "example" } }'For you only, when the organization allows it (connectors_member_servers; else 403 member-servers-off).
As createOrgMcpServer: tested at once, the same guardrails. auth.type none, shared (a key of yours,
sealed) or oauth (you sign in with startMcpConnection). You review its tools’ changes yourself
(reviewMcpServerTools), and set their permissions in setMyToolPermission.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
The tools’ prefix; from the name when left out. Not one of Lucy’s (m365, local, sandbox, web, memory).
object
For shared (default Authorization). Not a header Lucy sets itself (Host, Content-Type, …). In Authorization, a bare key (no scheme such as Bearer or Basic ) is sent as Bearer <key>.
For shared, the header’s value, e.g. Bearer sk_…. Sealed; never returned. Leave out on an update to keep the current one.
Responses
Section titled “Responses”Added.
object
The tool server’s name, the prefix of its tools for the model and in tool permissions (ToolPermission.server). Unique in the organization.
How Lucy signs in to the server. Never the secret itself.
object
none: no sign-in. shared: “Shared by the organization”: one credential an admin gave, for everyone’s
calls (on your own server: your key). oauth: each person (and each agent) signs in at the server
themselves (startMcpConnection), with the MCP authorization spec.
For shared, the header the credential goes in, e.g. Authorization or X-API-Key. Shown to the server’s owner (an admin for the organization’s, you for your own); members don’t get the organization’s.
For shared, the credential’s last four characters, e.g. …a1b2.
Why the last test failed, in a sentence (never the server’s whole answer).
object
The tool’s name on the server (the model sees <server>.<name>).
As the server describes it to the model (cut at 2,000 characters here).
The arguments the server asks for (JSON Schema).
object
object
New, or its description, schema or annotations changed since an admin last reviewed it. It stays at ask or stricter, and denied to agents, until reviewed.
Your own server (createMcpServer), not the organization’s.
Example
{ "id": "mcp_8Qk2LmN4Rt7Wx1Yz3Aa5", "name": "Acme CRM", "server": "acme_crm", "url": "https://mcp.acme.example/mcp", "auth": { "type": "none", "header": "Authorization" }, "status": "untested", "connection": { "status": "active" }, "created_by": { "kind": "person" }}The request is invalid; errors lists what’s wrong.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
Missing, expired or invalid token.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
The token is valid but lacks the role this needs.
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.
The object isn’t in a state that allows this (e.g. Lucy is already answering).
RFC 9457 problem details.
object
For quota-exceeded, the window that is used up.
object
Null for a rolling window that hasn’t started.
organization when the organization’s budget is closer to running out than the member’s own limit.
Field-level problems (400 only).
object
JSON pointer into the request body.
Example
{ "type": "https://docs.asklucy.eu/errors/answer-in-progress", "quota": { "window": "five_hours", "limited_by": "personal", "request": { "status": "pending" } }}Headers
Section titled “Headers”Unique per request; quote it to support.