Outil MCP
Créer une clé API
sosoapi_create_api_keyCréer une clé d’accès personnelle avec les capacités choisies (agent:operate, agent:publish, agent:engage), une restriction workspace_ids facultative et une durée de validité maximale de 365 jours ; le secret n’est renvoyé qu’une fois et ne peut pas être relu. Un agent ne peut accorder que les droits de sa propre autorisation, pour 30 jours au maximum, et la clé cesse de fonctionner à la fin de cette autorisation. Nécessite l’autorisation Manage API keys ; un PAT ne peut pas l’utiliser.
Lire en MarkdownProfils et transports
Profils : full · Transports : stdio, http
Choisissez core ou full pour définir les outils visibles du client ; cela ne change pas ses autorisations. Le téléversement local nécessite stdio et n’est pas disponible sur HTTP. Définissez SOSOAPI_OUTPUT_SCHEMAS=1 pour inclure les schémas de sortie à la découverte. Les outils renvoient des résultats structurés avec ou sans ce réglage.
Autorisations et effets de bord
Les annotations aident les clients à décrire un outil. Chaque appel vérifie toujours l’authentification, le rôle, l’accès aux ressources et les capacités accordées de l’utilisateur.
{
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
}- /identity-api/api-keys/create: agent:manage_api_keys · synchronous_http_response
Champs d’entrée
Requis signifie requis dans l’objet parent et la branche sélectionnée. Un enfant requis ne rend pas obligatoire un parent facultatif. Les règles et noms de champs ci-dessous proviennent du contrat.
| Champ / branche | Type / requis | Contraintes |
|---|---|---|
$ | objectRequis dans le parent |
|
name | stringRequis dans le parent |
|
lifetime_days | integerFacultatif / élément | Jours avant expiration de la clé (1-365, 365 par défaut). Une clé créée par un agent délégué ne reste jamais valide plus de 30 jours.
|
capabilities | arrayFacultatif / élément | Actions permises à la clé. operate, publish et engage par défaut pour un utilisateur connecté. Un agent délégué ne peut accorder que les droits de sa propre autorisation (jamais la gestion de clés).
|
capabilities[] | stringFacultatif / élément |
|
workspace_ids | arrayFacultatif / élément | Limiter la clé à ces espaces de travail. Omettre pour tous les espaces accessibles à l’utilisateur. Une clé limitée doit nommer son espace (workspace_id) sur les routes utilisant sinon l’espace actif et ne peut effectuer les lectures à l’échelle de l’organisation.
|
workspace_ids[] | stringFacultatif / élément |
|
scopes | arrayFacultatif / élément | Alias obsolète de capabilities. Il est respecté exactement ; une liste vide est ignorée.
|
scopes[] | stringFacultatif / élément |
|
idempotency_key | stringFacultatif / élément | Facultatif. Réutilisez la même clé pour réessayer en sécurité. Le secret n’est affiché qu’une fois : si la clé existe déjà, une nouvelle tentative renvoie 409 IDEMPOTENT_REPLAY (details.existing_key l’identifie) au lieu de l’afficher à nouveau. Révoquez-la et créez-en une autre avec une nouvelle idempotency_key.
|
JSON Schema complet
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80
},
"lifetime_days": {
"description": "Days until the key expires (1-365, default 365). A key created by a delegated agent never lives longer than 30 days.",
"type": "integer",
"minimum": 1,
"maximum": 365
},
"capabilities": {
"description": "What the key may do. Defaults to operate, publish and engage for a signed-in user. A delegated agent can only grant what its own authorization holds (never key management).",
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"agent:operate",
"agent:publish",
"agent:engage"
]
}
},
"workspace_ids": {
"description": "Limit the key to these Workspaces. Omit it for every Workspace the user can access. A limited key must name its Workspace (workspace_id) on routes that would otherwise use the active Workspace, and cannot call organization-wide reads.",
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
},
"scopes": {
"description": "Deprecated alias of capabilities. It is honoured exactly; an empty list is ignored.",
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"agent:operate",
"agent:publish",
"agent:engage"
]
}
},
"idempotency_key": {
"description": "Optional. Reuse the same key to retry safely. The secret is shown once: a retry that finds the key already created answers 409 IDEMPOTENT_REPLAY (details.existing_key names it) instead of showing it again. Revoke that key and create a new one with a new idempotency_key.",
"type": "string",
"minLength": 8,
"maxLength": 160,
"pattern": "^[!-~]+$"
}
},
"required": [
"name"
],
"additionalProperties": false
}Sortie structurée
Ce schéma décrit structuredContent dans un résultat d’outil réussi. La réponse MCP contient aussi content et peut définir isError en cas d’échec. Pour publier, lisez le résultat final de la publication plutôt que de considérer une requête acceptée ou une réponse texte comme une confirmation. L’opération API liée explique les autorisations et règles de nouvelle tentative.
Requis signifie requis dans l’objet parent et la branche sélectionnée. Un enfant requis ne rend pas obligatoire un parent facultatif. Les règles et noms de champs ci-dessous proviennent du contrat.
| Champ / branche | Type / requis | Contraintes |
|---|---|---|
$ | objectRequis dans le parent |
|
apiKey | objectRequis dans le parent |
|
apiKey.id | stringRequis dans le parent |
|
apiKey.name | stringRequis dans le parent | — |
apiKey.last_4 | stringRequis dans le parent | — |
apiKey.scopes | arrayRequis dans le parent | — |
apiKey.scopes[] | stringFacultatif / élément | — |
apiKey.created_at | stringRequis dans le parent |
|
apiKey.expires_at | string | nullRequis dans le parent | — |
apiKey.expires_atanyOf 1 | stringRequis dans le parent |
|
apiKey.expires_atanyOf 2 | nullRequis dans le parent | — |
apiKey.last_used_at | string | nullRequis dans le parent | — |
apiKey.last_used_atanyOf 1 | stringRequis dans le parent |
|
apiKey.last_used_atanyOf 2 | nullRequis dans le parent | — |
apiKey.revoked_at | string | nullRequis dans le parent | — |
apiKey.revoked_atanyOf 1 | stringRequis dans le parent |
|
apiKey.revoked_atanyOf 2 | nullRequis dans le parent | — |
apiKey.status | stringRequis dans le parent |
|
apiKey.replaces | object | nullRequis dans le parent | — |
apiKey.replacesanyOf 1 | objectRequis dans le parent |
|
apiKey.replaces.idanyOf 1 | stringRequis dans le parent |
|
apiKey.replaces.nameanyOf 1 | stringRequis dans le parent | — |
apiKey.replaces.last_4anyOf 1 | stringRequis dans le parent | — |
apiKey.replaces.statusanyOf 1 | stringRequis dans le parent |
|
apiKey.replacesanyOf 2 | nullRequis dans le parent | — |
apiKey.replaced_by | arrayRequis dans le parent | — |
apiKey.replaced_by[] | objectFacultatif / élément |
|
apiKey.replaced_by[].id | stringRequis dans le parent |
|
apiKey.replaced_by[].name | stringRequis dans le parent | — |
apiKey.replaced_by[].last_4 | stringRequis dans le parent | — |
apiKey.replaced_by[].status | stringRequis dans le parent |
|
apiKey.capabilities | arrayFacultatif / élément | — |
apiKey.capabilities[] | stringFacultatif / élément |
|
apiKey.workspace_ids | array | nullFacultatif / élément | — |
apiKey.workspace_idsanyOf 1 | arrayFacultatif / élément | — |
apiKey.workspace_ids[]anyOf 1 | stringFacultatif / élément |
|
apiKey.workspace_idsanyOf 2 | nullFacultatif / élément | — |
apiKey.created_by_delegated_grant_id | string | nullFacultatif / élément | — |
apiKey.created_by_delegated_grant_idanyOf 1 | stringFacultatif / élément |
|
apiKey.created_by_delegated_grant_idanyOf 2 | nullFacultatif / élément | — |
secret | stringRequis dans le parent |
|
JSON Schema complet
{
"type": "object",
"properties": {
"apiKey": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"last_4": {
"type": "string"
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"expires_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"last_used_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"revoked_at": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"status": {
"type": "string",
"enum": [
"active",
"expired",
"revoked"
]
},
"replaces": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"last_4": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"active",
"expired",
"revoked"
]
}
},
"required": [
"id",
"name",
"last_4",
"status"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"replaced_by": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"name": {
"type": "string"
},
"last_4": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"active",
"expired",
"revoked"
]
}
},
"required": [
"id",
"name",
"last_4",
"status"
],
"additionalProperties": false
}
},
"capabilities": {
"type": "array",
"items": {
"type": "string",
"enum": [
"agent:operate",
"agent:publish",
"agent:engage"
]
}
},
"workspace_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"format": "uuid"
}
},
{
"type": "null"
}
]
},
"created_by_delegated_grant_id": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"name",
"last_4",
"scopes",
"created_at",
"expires_at",
"last_used_at",
"revoked_at",
"status",
"replaces",
"replaced_by"
],
"additionalProperties": false
},
"secret": {
"type": "string",
"minLength": 1
}
},
"required": [
"apiKey",
"secret"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Exemple d’appel d’outil
Ces exemples utilisent des valeurs fictives vérifiées contre les schémas. Remplacez les identifiants par ceux que vous êtes autorisé à utiliser, les médias par des ressources prêtes et les dates par l’heure confirmée. Vérifiez l’éligibilité du compte avant toute écriture. Cette page n’envoie aucune requête API.
{
"name": "sosoapi_create_api_key",
"arguments": {
"name": "example"
}
}structuredContent
{
"apiKey": {
"id": "11111111-1111-4111-8111-111111111111",
"name": "example",
"last_4": "example",
"scopes": [],
"created_at": "2099-01-15T09:00:00Z",
"expires_at": null,
"last_used_at": null,
"revoked_at": null,
"status": "active",
"replaces": null,
"replaced_by": []
},
"secret": "example"
}