Add a connector by URL
const url = 'https://api.asklucy.eu/v1/org/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/org/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" } }'Adds a remote MCP server for everyone at the organization, and tests it at once: Lucy connects, lists its
tools and keeps them (tools, status). Each tool gets a permission from its annotations (read-only:
allow; anything else: ask), which admins change in setOrgToolPermission with the server’s server
name.
The URL must be https, without a user name or password, on a public address: a name resolving to a
private, loopback, link-local or otherwise reserved address is refused (400), now and on every connection.
Sign-in (auth.type): none, or shared (“Shared by the organization”): an admin gives a header and its
value (an API key or a bearer token), sealed in Lucy’s vault; everyone’s calls use that one account.
The server learns nothing about the organization or the person, beyond what its own sign-in tells it.
Audited as mcp_server.created (never the secret).
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 (see status for the test’s result).
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.