{"ok":true,"data":{"protocol":"mcp","transport":"streamable-http (JSON responses)","endpoint":"https://app.artifactry.app/api/v1/mcp","authentication":{"oauth":"https://app.artifactry.app/.well-known/oauth-protected-resource/api/v1/mcp","bearer":"Bearer <AI access token from POST /api/v1/integrations/:id/connect>"},"tools":[{"name":"search","description":"Find source material in the library. Natural-language query with optional filters for workspace, artifact type, tags, collection/team, owner and date range. Uses the same hybrid lexical + semantic engine as the app. Only artifacts the signed-in user may access are ever returned.","scope":"artifact.read"},{"name":"get","description":"Retrieve one artifact by id or canonical URL, including its tags, workspace and current version. Returns the extracted text when the artifact has a text layer; binary formats return metadata and the canonical URL instead of inlining bytes.","scope":"artifact.read"},{"name":"save","description":"Persist what the AI has just produced: HTML pages, slide decks (pptx), documents (docx, pdf) and images (png, jpg, webp, gif). Pick ONE source: (1) an HTML page — pass the full document as content with file \"name.html\"; it is stored exactly as given. If the file is too big to write into one call: when it already exists as a file where you can run code (a sandbox, the desktop app), call upload_part with no arguments and upload it with curl -T to the put_url it returns (never through a third-party file host); otherwise send it in pieces with upload_part. Then pass upload_id here. (2) a file from the conversation — file_ref (ChatGPT fills it automatically). (3) a file at a public URL — source_url. (4) small binaries — content_base64 with file. (5) plain text to turn into a document — content with format \"pdf\" or \"html\". Saves into a workspace, optionally a collection, applies any tags given and proposes more from the artifact's actual content. Use create_version to revise an artifact that already exists.","scope":"artifact.write"},{"name":"create_version","description":"Add a new version to an existing artifact, preserving all prior versions. Use this instead of save when the AI is revising something already in the library.","scope":"artifact.write"},{"name":"upload_part","description":"Get a file that is too large for a single save call into Artifactry. BEST for large or binary files that already exist on disk where you can run code (for example a multi-MB HTML page with embedded media): call with no arguments, then run curl -sS -T <file> \"<put_url>\" in your code environment, then call save with upload_id. No auth header is needed; the link is private to this upload. Your code environment must be allowed to reach this server; if the request is blocked, tell the user to add this server's domain to the allowed network domains in their AI app settings. OTHERWISE send the content one piece at a time. First call: omit upload_id and pass the first piece; keep the returned upload_id and pass it with every following piece, in order. Text files such as HTML go in content, split anywhere (about 20,000 characters per piece works well); binary files go in content_base64, split at a multiple of 4 characters. Then call save (or create_version) with upload_id, file, title and tags. Nothing is saved until then. Uploads expire after 24 hours.","scope":"artifact.write"},{"name":"share","description":"Share an existing artifact with its intended audience: a named team, a workspace, specific email addresses, an email domain, or a public link, with optional expiry and view/download permission. An audience that takes the content outside the organization (public link, raw addresses, email domain) requires explicit user confirmation first: the call returns a confirmation request and nothing is shared until the user agrees.","scope":"artifact.share"},{"name":"revoke_share","description":"Revoke a share so its link stops working immediately.","scope":"artifact.share"},{"name":"list_workspaces","description":"List the workspaces the signed-in user can access, with their role.","scope":"workspace.read"},{"name":"list_teams","description":"List reusable named audiences (teams) the signed-in user can share with, with member counts. Use a team name with share to address an audience without supplying individual addresses.","scope":"team.read"},{"name":"list_tags","description":"List tags in use. Confirmed tags are the library vocabulary; suggestions are shown for a specific artifact via get, not here.","scope":"tags.read"},{"name":"update_tags","description":"Change the tags on an artifact: accept a suggested tag, reject one, add a new one, or remove one. Tags are case-insensitively deduplicated, and a rejected tag is remembered so it is not offered again unless the content changes.","scope":"artifact.write"}]}}