{
"detail": {
"error": "probe_failed",
"error_category": "unreachable",
"message": "Could not reach the target endpoint."
}
}
integration
Register an agent or an MCP server (atomic prove-then-persist)
Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass ‘config’ for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass ‘mcp’ for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.
POST
/
api
/
v1
/
model
Register an agent or an MCP server (atomic prove-then-persist)
bearer='Authorization: Bearer ', api_key='x-api-key: ', basic=HTTP Basic with the credential as 'user:password', oauth_client_credentials=an access token minted from the 'oauth' config below and re-minted before it expires. No enterprise auth. An MCP server takes none, bearer or api_key, which sends the credential in mcp.api_key_header.
An agent's connection. Endpoint transport/parsing config (endpoint_url, response_field dot-path, transport, ...). Use request_timeout (<=180); ws_timeout is ignored here. Exactly one of 'config' and 'mcp'.
Required for auth_type='oauth_client_credentials', rejected otherwise. The token request that mints the bearer (token_url, client_id, and optionally scope/audience). Carries no secret — the client secret is 'credential'.
Show child attributes
Response
Successful Response
Response for POST /api/v1/model (201).
The inventory id and the connection verdict only. It never echoes the config
(it may hold a header secret), the credential, or any part of the target's
reply.
Always true: the target is persisted only after a successful probe.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Enoki Docs","description":"Security and safety testing for AI agents.","colors":{"primary":"#0F121A","light":"#F3F6E8","dark":"#0F121A"},"logo":{"light":"https://mintcdn.com/enoki-861e83a5/wytbpU7UfVc9mmSp/logo/light.svg?fit=max\u0026auto=format\u0026n=wytbpU7UfVc9mmSp\u0026q=85\u0026s=f611c233aaff582b2373aff2e0e21a40","dark":"https://mintcdn.com/enoki-861e83a5/wytbpU7UfVc9mmSp/logo/dark.svg?fit=max\u0026auto=format\u0026n=wytbpU7UfVc9mmSp\u0026q=85\u0026s=58c0a01b9ecf0447c9b3f050d5f828e0","href":"https://enokilabs.ai"},"favicon":"https://mintcdn.com/enoki-861e83a5/6T4h4W4crsrcNUEx/favicon.svg?fit=max\u0026auto=format\u0026n=6T4h4W4crsrcNUEx\u0026q=85\u0026s=c07da50da74ecba8f6c29de226c5691a","background":{"color":{"light":"#F3F6E8","dark":"#0F121A"}},"footer":{"socials":{"website":"https://enokilabs.ai"}},"fonts":{"family":"Geist"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"enoki-861e83a5","hasAudioNarration":false,"actualSubdomain":"enoki-861e83a5","customDomains":["docs.enokilabs.ai"],"gitSource":{"type":"github","owner":"ethicgate","repo":"ethicgate","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"a4b91925-c246-48d6-985e-f709097ec9ea","liveDeploymentHistoryId":"6ae072b9898aa086d1dccb6e","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae072b9898aa086d1dccb6e"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae497b0f49f5b7aedfdbfbe","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"REST API","count":16},{"language":"default","tag":"assessment","count":5},{"language":"default","tag":"Integrations","count":4},{"language":"default","tag":"target-profile","count":4},{"language":"default","tag":"Get started","count":3},{"language":"default","tag":"findings","count":3},{"language":"default","tag":"Connect","count":2},{"language":"default","tag":"MCP","count":2},{"language":"default","tag":"integration","count":2},{"language":"default","tag":"taxonomy","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"styles.css","content":"code:not(pre code){background-color:rgba(15,18,26,.07)!important;color:#0f121a!important;border:1px solid rgba(15,18,26,.12);border-radius:.35rem;padding:.05rem .35rem;white-space:nowrap}.dark code:not(pre code){background-color:rgba(255,255,255,.1)!important;color:#f3f6e8!important;border-color:rgba(255,255,255,.14)}.callout{background-color:#fff!important;border-color:rgba(15,18,26,.1)!important}.callout,.callout *{color:#0f121a!important}.dark .callout{background-color:rgba(255,255,255,.05)!important;border-color:rgba(255,255,255,.12)!important}.dark .callout,.dark .callout *{color:#f3f6e8!important}"}],"page":{"pagePath":"api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist","slug":"/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist","pageMetadata":{"title":"Register an agent or an MCP server (atomic prove-then-persist)","description":"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass 'config' for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass 'mcp' for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/model","href":"/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass ‘config’ for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass ‘mcp’ for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Register an agent or an MCP server (atomic prove-then-persist)","description":"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass 'config' for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass 'mcp' for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/model","href":"/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"tags":["integration"],"summary":"Register an agent or an MCP server (atomic prove-then-persist)","description":"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass 'config' for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass 'mcp' for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.","operationId":"api_create_target_api_v1_model_post","parameters":["adef59e1-9b86-44e4-bbad-acb2659f6f60"],"requestBody":"031358cb-34b4-4361-b890-c180a99f99e2","responses":{"201":"9b1c605b-e93f-4d3e-b748-f0e8944eeffc","400":"08b69446-8f33-4637-8467-5c0648c5a640","422":"251b77a2-4e02-478c-af4e-ed83f3b32845"},"method":"post","type":"path","servers":["78546883-3ea8-4e51-af7f-1c039c45ed9f"],"security":[],"path":"/api/v1/model","baseUrlOptions":["https://api.enokilabs.ai"],"title":"Register an agent or an MCP server (atomic prove-then-persist)","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"adef59e1-9b86-44e4-bbad-acb2659f6f60":{"name":"Authorization","in":"header","required":false,"schema":{"oneOf":[{"type":"string","title":"Authorization","description":"Bearer token with API key","uniqueKey":"oneOf.0","typeLabel":"string"},{"type":"null","title":"Authorization","description":"Bearer token with API key","uniqueKey":"oneOf.1","typeLabel":"null"}],"isRequired":false,"uniqueKey":"","typeLabel":"string | null"},"description":"Bearer token with API key"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name","description":"Display name for the target.","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"environment":{"type":"string","enum":["prod","staging","dev"],"title":"Environment","default":"staging","uniqueKey":"environment","typeLabel":"enum\u003cstring>"},"auth_type":{"type":"string","enum":["none","bearer","api_key","basic","oauth_client_credentials"],"title":"Auth Type","description":"bearer='Authorization: Bearer \u003ccred>', api_key='x-api-key: \u003ccred>', basic=HTTP Basic with the credential as 'user:password', oauth_client_credentials=an access token minted from the 'oauth' config below and re-minted before it expires. No enterprise auth. An MCP server takes none, bearer or api_key, which sends the credential in mcp.api_key_header.","default":"none","uniqueKey":"auth_type","typeLabel":"enum\u003cstring>"},"credential":{"oneOf":[{"type":"string","title":"Credential","description":"Required for bearer/api_key/basic, and the OAuth client secret for oauth_client_credentials; omit for none. Stored encrypted, never returned.","minLength":5,"uniqueKey":"credential.oneOf.0","typeLabel":"string"},{"type":"null","title":"Credential","description":"Required for bearer/api_key/basic, and the OAuth client secret for oauth_client_credentials; omit for none. Stored encrypted, never returned.","uniqueKey":"credential.oneOf.1","typeLabel":"null"}],"uniqueKey":"credential","typeLabel":"string | null"},"config":{"oneOf":[{"type":"object","title":"ApiAgentConfig","description":"An agent's connection. Endpoint transport/parsing config (endpoint_url, response_field dot-path, transport, ...). Use request_timeout (\u003c=180); ws_timeout is ignored here. Exactly one of 'config' and 'mcp'.","required":["endpoint_url"],"properties":{"endpoint_url":{"type":"string","title":"Endpoint Url","isRequired":true,"uniqueKey":"config.oneOf.0.endpoint_url","typeLabel":"string"},"request_field":{"type":"string","title":"Request Field","default":"message","uniqueKey":"config.oneOf.0.request_field","typeLabel":"string"},"response_field":{"type":"string","title":"Response Field","default":"response","uniqueKey":"config.oneOf.0.response_field","typeLabel":"string"},"session_field":{"oneOf":[{"type":"string","title":"Session Field","default":"session_id","uniqueKey":"config.oneOf.0.session_field.oneOf.0","typeLabel":"string"},{"type":"null","title":"Session Field","default":"session_id","uniqueKey":"config.oneOf.0.session_field.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.session_field","typeLabel":"string | null"},"session_response_field":{"oneOf":[{"type":"string","title":"Session Response Field","uniqueKey":"config.oneOf.0.session_response_field.oneOf.0","typeLabel":"string"},{"type":"null","title":"Session Response Field","uniqueKey":"config.oneOf.0.session_response_field.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.session_response_field","typeLabel":"string | null"},"session_response_header_field":{"oneOf":[{"type":"string","title":"Session Response Header Field","uniqueKey":"config.oneOf.0.session_response_header_field.oneOf.0","typeLabel":"string"},{"type":"null","title":"Session Response Header Field","uniqueKey":"config.oneOf.0.session_response_header_field.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.session_response_header_field","typeLabel":"string | null"},"session_id_numeric":{"type":"boolean","title":"Session Id Numeric","default":false,"uniqueKey":"config.oneOf.0.session_id_numeric","typeLabel":"boolean"},"transport":{"type":"string","enum":["http","websocket"],"title":"Transport","default":"http","uniqueKey":"config.oneOf.0.transport","typeLabel":"enum\u003cstring>"},"http_stream_format":{"type":"string","enum":["sync","jsonl","sse"],"title":"Http Stream Format","default":"sync","uniqueKey":"config.oneOf.0.http_stream_format","typeLabel":"enum\u003cstring>"},"chunk_combination":{"type":"string","enum":["concatenate","replace"],"title":"Chunk Combination","default":"concatenate","uniqueKey":"config.oneOf.0.chunk_combination","typeLabel":"enum\u003cstring>"},"chunk_skip_roles":{"items":{"type":"string","uniqueKey":"config.oneOf.0.chunk_skip_roles.items.[INDEX]","typeLabel":"string"},"type":"array","title":"Chunk Skip Roles","uniqueKey":"config.oneOf.0.chunk_skip_roles","typeLabel":"string[]"},"extra_http_headers":{"oneOf":[{"type":"object","title":"Extra Http Headers","additionalProperties":{"type":"string","uniqueKey":"config.oneOf.0.extra_http_headers.oneOf.0.additionalProperties","typeLabel":"string"},"uniqueKey":"config.oneOf.0.extra_http_headers.oneOf.0","typeLabel":"Extra Http Headers · object"},{"type":"null","title":"Extra Http Headers","uniqueKey":"config.oneOf.0.extra_http_headers.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.extra_http_headers","typeLabel":"Extra Http Headers · object | null"},"request_body_template":{"oneOf":[{"type":"object","title":"Request Body Template","additionalProperties":true,"uniqueKey":"config.oneOf.0.request_body_template.oneOf.0","typeLabel":"Request Body Template · object"},{"type":"null","title":"Request Body Template","uniqueKey":"config.oneOf.0.request_body_template.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.request_body_template","typeLabel":"Request Body Template · object | null"},"ws_auth_method":{"oneOf":[{"type":"string","title":"Ws Auth Method","enum":["query_param","header","post_connect"],"uniqueKey":"config.oneOf.0.ws_auth_method.oneOf.0","typeLabel":"enum\u003cstring>"},{"type":"null","title":"Ws Auth Method","uniqueKey":"config.oneOf.0.ws_auth_method.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.ws_auth_method","typeLabel":"enum\u003cstring> | null"},"ws_auth_endpoint":{"type":"null","title":"Ws Auth Endpoint","uniqueKey":"config.oneOf.0.ws_auth_endpoint","typeLabel":"null"},"ws_url_endpoint":{"type":"null","title":"Ws Url Endpoint","uniqueKey":"config.oneOf.0.ws_url_endpoint","typeLabel":"null"},"ws_request_extra_fields":{"oneOf":[{"type":"object","title":"Ws Request Extra Fields","additionalProperties":{"oneOf":[{"type":"string","uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.0.additionalProperties.oneOf.0","typeLabel":"string"},{"type":"integer","uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.0.additionalProperties.oneOf.1","typeLabel":"integer"},{"type":"number","uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.0.additionalProperties.oneOf.2","typeLabel":"number"},{"type":"boolean","uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.0.additionalProperties.oneOf.3","typeLabel":"boolean"}],"uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.0.additionalProperties","typeLabel":"string | integer | number | boolean"},"uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.0","typeLabel":"Ws Request Extra Fields · object"},{"type":"null","title":"Ws Request Extra Fields","uniqueKey":"config.oneOf.0.ws_request_extra_fields.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.ws_request_extra_fields","typeLabel":"Ws Request Extra Fields · object | null"},"ws_event_type_field":{"type":"string","title":"Ws Event Type Field","default":"type","uniqueKey":"config.oneOf.0.ws_event_type_field","typeLabel":"string"},"ws_done_event_type":{"oneOf":[{"type":"string","title":"Ws Done Event Type","uniqueKey":"config.oneOf.0.ws_done_event_type.oneOf.0","typeLabel":"string"},{"type":"null","title":"Ws Done Event Type","uniqueKey":"config.oneOf.0.ws_done_event_type.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.ws_done_event_type","typeLabel":"string | null"},"ws_result_extract_field":{"oneOf":[{"type":"string","title":"Ws Result Extract Field","uniqueKey":"config.oneOf.0.ws_result_extract_field.oneOf.0","typeLabel":"string"},{"type":"null","title":"Ws Result Extract Field","uniqueKey":"config.oneOf.0.ws_result_extract_field.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.ws_result_extract_field","typeLabel":"string | null"},"ws_stream_extract_field":{"oneOf":[{"type":"string","title":"Ws Stream Extract Field","uniqueKey":"config.oneOf.0.ws_stream_extract_field.oneOf.0","typeLabel":"string"},{"type":"null","title":"Ws Stream Extract Field","uniqueKey":"config.oneOf.0.ws_stream_extract_field.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.ws_stream_extract_field","typeLabel":"string | null"},"request_timeout":{"type":"number","maximum":180,"exclusiveMinimum":0,"title":"Request Timeout","default":180,"uniqueKey":"config.oneOf.0.request_timeout","typeLabel":"number"},"reply_fetch":{"oneOf":[{"type":"object","title":"ReplyFetchConfig","description":"How to read the reply of a target that answers after the POST.\n\nThe POST returns only our message; the reply appears later in a message\nlist served by a GET. List items are assumed oldest first.","required":["url","messages_field","role_field","reply_roles","text_field"],"properties":{"url":{"type":"string","title":"Url","description":"GET URL of the message list, on the endpoint's host. May contain __SESSION_ID__.","isRequired":true,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.url","typeLabel":"string"},"messages_field":{"type":"string","title":"Messages Field","description":"Dot-path to the list of messages.","isRequired":true,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.messages_field","typeLabel":"string"},"role_field":{"type":"string","title":"Role Field","description":"Dot-path, within a message, to its author role.","isRequired":true,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.role_field","typeLabel":"string"},"reply_roles":{"items":{"type":"string","uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.reply_roles.items.[INDEX]","typeLabel":"string"},"type":"array","minItems":1,"title":"Reply Roles","description":"Role values that mark the bot's messages.","isRequired":true,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.reply_roles","typeLabel":"string[]"},"text_field":{"type":"string","title":"Text Field","description":"Dot-path, within a message, to its text.","isRequired":true,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.text_field","typeLabel":"string"},"anchor_id_field":{"oneOf":[{"type":"string","title":"Anchor Id Field","description":"Dot-path, in the POST response, to our message's id; messages after it are candidate replies. Unset: the anchor is the last message whose text is ours.","uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.anchor_id_field.oneOf.0","typeLabel":"string"},{"type":"null","title":"Anchor Id Field","description":"Dot-path, in the POST response, to our message's id; messages after it are candidate replies. Unset: the anchor is the last message whose text is ours.","uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.anchor_id_field.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.anchor_id_field","typeLabel":"string | null"},"item_id_field":{"type":"string","title":"Item Id Field","description":"Dot-path, within a message, to its id, matched to the anchor.","default":"id","uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.item_id_field","typeLabel":"string"},"poll_interval_seconds":{"type":"number","maximum":10,"exclusiveMinimum":0,"title":"Poll Interval Seconds","default":1.5,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.poll_interval_seconds","typeLabel":"number"},"deadline_seconds":{"type":"number","maximum":60,"exclusiveMinimum":0,"title":"Deadline Seconds","default":25,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.deadline_seconds","typeLabel":"number"},"settle_seconds":{"type":"number","maximum":20,"minimum":0,"title":"Settle Seconds","description":"After the first reply, keep polling this long for more, then concatenate.","default":2,"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0.settle_seconds","typeLabel":"number"}},"uniqueKey":"config.oneOf.0.reply_fetch.oneOf.0","typeLabel":"ReplyFetchConfig · object"},{"type":"null","uniqueKey":"config.oneOf.0.reply_fetch.oneOf.1","typeLabel":"null"}],"uniqueKey":"config.oneOf.0.reply_fetch","typeLabel":"ReplyFetchConfig · object | null"}},"uniqueKey":"config.oneOf.0","typeLabel":"ApiAgentConfig · object"},{"type":"null","description":"An agent's connection. Endpoint transport/parsing config (endpoint_url, response_field dot-path, transport, ...). Use request_timeout (\u003c=180); ws_timeout is ignored here. Exactly one of 'config' and 'mcp'.","uniqueKey":"config.oneOf.1","typeLabel":"null"}],"uniqueKey":"config","typeLabel":"ApiAgentConfig · object | null"},"mcp":{"oneOf":[{"type":"object","title":"ApiMcpServerConfig","description":"An MCP server instead of an agent: its endpoint and transport. Exactly one of 'config' and 'mcp'.","required":["endpoint_url"],"properties":{"endpoint_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Endpoint Url","description":"The server's MCP endpoint, e.g. https://mcp.example.com/mcp.","isRequired":true,"uniqueKey":"mcp.oneOf.0.endpoint_url","typeLabel":"string"},"transport":{"type":"string","enum":["http","sse"],"title":"Transport","description":"'http' for streamable HTTP, the default, or 'sse' for the older SSE transport.","default":"http","uniqueKey":"mcp.oneOf.0.transport","typeLabel":"enum\u003cstring>"},"api_key_header":{"oneOf":[{"type":"string","title":"Api Key Header","description":"The header an API key is sent in, for auth_type 'api_key'. Defaults to X-API-Key.","maxLength":128,"minLength":1,"pattern":"^[!#$%\u0026'*+\\-.^_`|~0-9A-Za-z]+$","uniqueKey":"mcp.oneOf.0.api_key_header.oneOf.0","typeLabel":"string"},{"type":"null","title":"Api Key Header","description":"The header an API key is sent in, for auth_type 'api_key'. Defaults to X-API-Key.","uniqueKey":"mcp.oneOf.0.api_key_header.oneOf.1","typeLabel":"null"}],"uniqueKey":"mcp.oneOf.0.api_key_header","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"mcp.oneOf.0","typeLabel":"ApiMcpServerConfig · object"},{"type":"null","description":"An MCP server instead of an agent: its endpoint and transport. Exactly one of 'config' and 'mcp'.","uniqueKey":"mcp.oneOf.1","typeLabel":"null"}],"uniqueKey":"mcp","typeLabel":"ApiMcpServerConfig · object | null"},"oauth":{"oneOf":[{"type":"object","title":"ApiOAuthClientCredentialsConfig","description":"Required for auth_type='oauth_client_credentials', rejected otherwise. The token request that mints the bearer (token_url, client_id, and optionally scope/audience). Carries no secret — the client secret is 'credential'.","required":["token_url","client_id"],"properties":{"token_url":{"type":"string","title":"Token Url","description":"The OAuth 2.0 token endpoint. Absolute URL; https is required unless the platform allows private targets.","isRequired":true,"uniqueKey":"oauth.oneOf.0.token_url","typeLabel":"string"},"client_id":{"type":"string","title":"Client Id","description":"OAuth client identifier.","isRequired":true,"uniqueKey":"oauth.oneOf.0.client_id","typeLabel":"string"},"scope":{"oneOf":[{"type":"string","title":"Scope","description":"Space-delimited scopes, when the provider expects them (Okta, Azure, ...).","uniqueKey":"oauth.oneOf.0.scope.oneOf.0","typeLabel":"string"},{"type":"null","title":"Scope","description":"Space-delimited scopes, when the provider expects them (Okta, Azure, ...).","uniqueKey":"oauth.oneOf.0.scope.oneOf.1","typeLabel":"null"}],"uniqueKey":"oauth.oneOf.0.scope","typeLabel":"string | null"},"audience":{"oneOf":[{"type":"string","title":"Audience","description":"Audience parameter, for providers that require it instead of scope (Auth0).","uniqueKey":"oauth.oneOf.0.audience.oneOf.0","typeLabel":"string"},{"type":"null","title":"Audience","description":"Audience parameter, for providers that require it instead of scope (Auth0).","uniqueKey":"oauth.oneOf.0.audience.oneOf.1","typeLabel":"null"}],"uniqueKey":"oauth.oneOf.0.audience","typeLabel":"string | null"},"extra_params":{"additionalProperties":{"type":"string","uniqueKey":"oauth.oneOf.0.extra_params.additionalProperties","typeLabel":"string"},"type":"object","title":"Extra Params","description":"Additional form fields for the token request, for providers wanting something neither scope nor audience covers. Carries no secret.","uniqueKey":"oauth.oneOf.0.extra_params","typeLabel":"Extra Params · object"},"client_auth_method":{"type":"string","enum":["post","basic"],"title":"Client Auth Method","description":"How the client credentials are presented: 'post' sends client_id + client_secret in the form body; 'basic' sends them as HTTP Basic.","default":"post","uniqueKey":"oauth.oneOf.0.client_auth_method","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oauth.oneOf.0","typeLabel":"ApiOAuthClientCredentialsConfig · object"},{"type":"null","description":"Required for auth_type='oauth_client_credentials', rejected otherwise. The token request that mints the bearer (token_url, client_id, and optionally scope/audience). Carries no secret — the client secret is 'credential'.","uniqueKey":"oauth.oneOf.1","typeLabel":"null"}],"uniqueKey":"oauth","typeLabel":"ApiOAuthClientCredentialsConfig · object | null"}},"type":"object","required":["name"],"title":"ApiCreateTargetRequest","description":"Request body for `POST /api/v1/model` (register an agent or an MCP server).","uniqueKey":"","typeLabel":"ApiCreateTargetRequest · object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","environment":"staging","auth_type":"none","credential":"\u003cstring>","config":{"endpoint_url":"\u003cstring>","request_field":"message","response_field":"response","session_field":"session_id","session_response_field":"\u003cstring>","session_response_header_field":"\u003cstring>","session_id_numeric":false,"transport":"http","http_stream_format":"sync","chunk_combination":"concatenate","chunk_skip_roles":["\u003cstring>"],"extra_http_headers":{},"request_body_template":{},"ws_auth_endpoint":null,"ws_url_endpoint":null,"ws_request_extra_fields":{},"ws_event_type_field":"type","ws_done_event_type":"\u003cstring>","ws_result_extract_field":"\u003cstring>","ws_stream_extract_field":"\u003cstring>","request_timeout":180,"reply_fetch":{"url":"\u003cstring>","messages_field":"\u003cstring>","role_field":"\u003cstring>","reply_roles":["\u003cstring>"],"text_field":"\u003cstring>","anchor_id_field":"\u003cstring>","item_id_field":"id","poll_interval_seconds":1.5,"deadline_seconds":25,"settle_seconds":2}},"mcp":{"endpoint_url":"\u003cstring>","transport":"http","api_key_header":"\u003cstring>"},"oauth":{"token_url":"\u003cstring>","client_id":"\u003cstring>","scope":"\u003cstring>","audience":"\u003cstring>","extra_params":{},"client_auth_method":"post"}}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"9b1c605b-e93f-4d3e-b748-f0e8944eeffc":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"model_id":{"type":"string","title":"Model Id","description":"Inventory model id — use directly as model_id in POST /api/v1/run.","isRequired":true,"uniqueKey":"model_id","typeLabel":"string"},"connected":{"type":"boolean","const":true,"title":"Connected","description":"Always true: the target is persisted only after a successful probe.","isRequired":true,"uniqueKey":"connected","typeLabel":"boolean"}},"type":"object","required":["model_id","connected"],"title":"ApiCreateTargetResponse","description":"Response for `POST /api/v1/model` (201).\n\nThe inventory id and the connection verdict only. It never echoes the config\n(it may hold a header secret), the credential, or any part of the target's\nreply.","uniqueKey":"","typeLabel":"ApiCreateTargetResponse · object"},"examples":{"Example":{"title":"Example","value":{"model_id":"\u003cstring>","connected":true}}},"exampleType":"generated"}},"exampleType":"generated"},"08b69446-8f33-4637-8467-5c0648c5a640":{"description":"Endpoint URL rejected (scheme or private/internal address)","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"251b77a2-4e02-478c-af4e-ed83f3b32845":{"description":"Two distinct shapes share this status. A **probe failure** returns `detail` as an **object** (`error_category` + a redacted message, shown below). A **request-validation** error returns the standard FastAPI `detail` as a **list** of per-field errors. Clients must branch on the type of `detail` (object vs list) rather than assume the validation shape.","content":{"application/json":{"example":{"detail":{"error":"probe_failed","error_category":"unreachable","message":"Could not reach the target endpoint."}},"examples":{"Example":{"title":"Example","value":{"detail":{"error":"probe_failed","error_category":"unreachable","message":"Could not reach the target endpoint."}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{},"servers":{"78546883-3ea8-4e51-af7f-1c039c45ed9f":{"url":"https://api.enokilabs.ai","description":"Enoki API"}}},"originalFileLocation":"openapi.json"},"subdomain":"enoki-861e83a5","siteName":"Enoki Docs","title":"Register an agent or an MCP server (atomic prove-then-persist) - Enoki Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-30T13:12:21.192Z","originalFileLocation":"api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass \u0026#x27;config\u0026#x27; for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass \u0026#x27;mcp\u0026#x27; for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Enoki Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Register an agent or an MCP server (atomic prove-then-persist) - Enoki Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass \u0026#x27;config\u0026#x27; for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass \u0026#x27;mcp\u0026#x27; for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Enoki Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://enoki-861e83a5.mintlify.app/_mintlify/api/og/v2?division=integration\u0026amp;title=Register+an+agent+or+an+MCP+server+%28atomic+prove-then-persist%29\u0026amp;description=Fires+a+live+round-trip+and+persists+the+target+ONLY+if+the+probe+succeeds%3B+a+failed+probe+persists+nothing+and+returns+a+categorized+error+%28unreachable+%2F+auth_\u0026amp;theme=7dab79a77306f37c8b6ebe93\u0026amp;signature=e0cd4b03353c832506cae1c578e7a2165c59a831d198554c1eb790a6caa55972\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Register an agent or an MCP server (atomic prove-then-persist) - Enoki Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass \u0026#x27;config\u0026#x27; for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass \u0026#x27;mcp\u0026#x27; for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://enoki-861e83a5.mintlify.app/_mintlify/api/og/v2?division=integration\u0026amp;title=Register+an+agent+or+an+MCP+server+%28atomic+prove-then-persist%29\u0026amp;description=Fires+a+live+round-trip+and+persists+the+target+ONLY+if+the+probe+succeeds%3B+a+failed+probe+persists+nothing+and+returns+a+categorized+error+%28unreachable+%2F+auth_\u0026amp;theme=7dab79a77306f37c8b6ebe93\u0026amp;signature=e0cd4b03353c832506cae1c578e7a2165c59a831d198554c1eb790a6caa55972\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/enoki-861e83a5/kOa2A3QnLxOcGLaX/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Enoki Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0F121A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.enokilabs.ai/#organization\",\"name\":\"Enoki Docs\",\"url\":\"https://docs.enokilabs.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/enoki-861e83a5/wytbpU7UfVc9mmSp/logo/light.svg?fit=max\u0026auto=format\u0026n=wytbpU7UfVc9mmSp\u0026q=85\u0026s=f611c233aaff582b2373aff2e0e21a40\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.enokilabs.ai#website\",\"name\":\"Enoki Docs\",\"url\":\"https://docs.enokilabs.ai\",\"publisher\":{\"@id\":\"https://docs.enokilabs.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist#webpage\",\"url\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist\",\"name\":\"Register an agent or an MCP server (atomic prove-then-persist)\",\"description\":\"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass 'config' for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass 'mcp' for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.\",\"dateModified\":\"2026-10-30T13:12:21.192Z\",\"isPartOf\":{\"@id\":\"https://docs.enokilabs.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"REST API\",\"item\":\"https://docs.enokilabs.ai/api-reference\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"integration\",\"item\":\"https://docs.enokilabs.ai/api-reference/integration/list-inventory-models\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Register an agent or an MCP server (atomic prove-then-persist)\",\"item\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist#apireference\",\"headline\":\"Register an agent or an MCP server (atomic prove-then-persist)\",\"name\":\"Register an agent or an MCP server (atomic prove-then-persist)\",\"description\":\"Fires a live round-trip and persists the target ONLY if the probe succeeds; a failed probe persists nothing and returns a categorized error (unreachable / auth_failed / parse_error / no_reply / not_an_endpoint). Pass 'config' for an agent: static auth (none/bearer/api_key/basic) or oauth_client_credentials, over http or websocket. Pass 'mcp' for an MCP server: none/bearer/api_key, over streamable HTTP or SSE; its probe connects, signs in and lists what the server offers. The response never echoes the config, credential, or reply. The returned model_id is the handle for POST /api/v1/run. List first via GET /api/v1/model — creates are not deduplicated.\",\"url\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist\",\"mainEntityOfPage\":{\"@id\":\"https://docs.enokilabs.ai/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist#webpage\"},\"dateModified\":\"2026-10-30T13:12:21.192Z\",\"publisher\":{\"@id\":\"https://docs.enokilabs.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.enokilabs.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Enoki Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Enoki Docs","nav":{"global":null,"groups":[{"group":"Get started","pages":[{"title":"Enoki documentation","href":"/index"},{"title":"What we test for","href":"/what-we-test"},{"title":"Quickstart","href":"/quickstart"}]},{"group":"Connect","pages":[{"title":"Connect your agent","href":"/connect-your-agent"},{"title":"API keys \u0026 scopes","href":"/api-keys"}]},{"group":"Integrations","pages":[{"title":"Webhooks","href":"/integrations/webhooks"},{"title":"Linear","href":"/integrations/linear"},{"title":"Jira","href":"/integrations/jira"},{"title":"GitHub","href":"/integrations/github"}]},{"group":"MCP","pages":[{"title":"MCP tool reference","href":"/mcp-tools"},{"title":"Troubleshooting","href":"/troubleshooting"}]},{"group":"REST API","pages":[{"title":"REST API reference","href":"/api-reference"},{"group":"assessment","pages":[{"title":"Trigger an assessment run","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/run","href":"/api-reference/assessment/trigger-an-assessment-run"},{"title":"Poll run status","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/run/{run_id}","href":"/api-reference/assessment/poll-run-status"},{"title":"Retrieve what a completed run covered, per category","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/run/{run_id}/coverage","href":"/api-reference/assessment/retrieve-what-a-completed-run-covered-per-category"},{"title":"Cancel a running assessment","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/run/{run_id}/cancel","href":"/api-reference/assessment/cancel-a-running-assessment"},{"title":"List runs for a model","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/model/{model_id}/run","href":"/api-reference/assessment/list-runs-for-a-model"}]},{"group":"integration","pages":[{"title":"List inventory models","description":"List all inventory models in the workspace.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/model","href":"/api-reference/integration/list-inventory-models"},{"title":"Register an agent or an MCP server (atomic prove-then-persist)","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/model","href":"/api-reference/integration/register-an-agent-or-an-mcp-server-atomic-prove-then-persist"}]},{"group":"findings","pages":[{"title":"Retrieve findings for a completed run","description":"Returns structured findings for a completed assessment run. Returns 409 while the run is still running — partial findings are not exposed. A finding whose proof the workspace's plan withholds is still returned, carrying its id and severity, no attacks, and '[redacted]' in place of its text — so 'count' and the run's pass/fail verdict are the same either way.","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/run/{run_id}/findings","href":"/api-reference/findings/retrieve-findings-for-a-completed-run"},{"title":"Close a finding (mark fixed or dismiss as not an issue)","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/findings/{finding_id}/close","href":"/api-reference/findings/close-a-finding-mark-fixed-or-dismiss-as-not-an-issue"},{"title":"Re-run a finding's attacks to confirm a fix","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/findings/{finding_id}/validate","href":"/api-reference/findings/re-run-a-findings-attacks-to-confirm-a-fix"}]},{"group":"taxonomy","pages":[{"title":"List taxonomy categories","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/category","href":"/api-reference/taxonomy/list-taxonomy-categories"}]},{"group":"target-profile","pages":[{"title":"Read a target's profile","deprecated":null,"version":null,"openapi":"/openapi.json get /api/v1/model/{model_id}/profile","href":"/api-reference/target-profile/read-a-targets-profile"},{"title":"Change a target's profile","deprecated":null,"version":null,"openapi":"/openapi.json patch /api/v1/model/{model_id}/profile","href":"/api-reference/target-profile/change-a-targets-profile"},{"title":"Confirm values of a target's profile","deprecated":null,"version":null,"openapi":"/openapi.json post /api/v1/model/{model_id}/profile/confirm","href":"/api-reference/target-profile/confirm-values-of-a-targets-profile"},{"title":"Retract a dismissal from a target's profile","deprecated":null,"version":null,"openapi":"/openapi.json delete /api/v1/model/{model_id}/profile/non-issues/{finding_id}","href":"/api-reference/target-profile/retract-a-dismissal-from-a-targets-profile"}]}]}]},"title":"Register an agent or an MCP server (atomic prove-then-persist) - Enoki Docs","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-26-lDe7V.js","utils-CWQmgYtH.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-4-Aw3rSD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C2zjXYA5.js","snippetPresets-DFmpFA7C.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-FJpQavWq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-D_GvPF7k.js","shallow-Bs2ZB0NO.js","getApiPlaygroundDisplay-DCcqJJk-.js","CodeSnippet-DzDxawVe.js","CodeSnippets-aUr7fU-7.js","Page-CT9uE8Ip.js","getPastedJson-Y1fKsj_I.js","icon-DI4zTsDr.js","MethodPill-C0nDlmSQ.js","DuplicateIcon-NUXbx2nQ.js","createIcon-BdTHrPAi.js","DynamicMarkdown-CtpgKJwj.js","SectionHeading-B3x35tOt.js","axios-vUo_bRtp.js","Markdown-3OmurJMP.js","clsx-DMKzROTp.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-1ms6tsT-.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Ke9xIMFx.js"]}