InkBotDocs

Integrations

Plugins, Composio apps, logins, and Quill and Blotter sites.

Plugins

Method Path Body Returns
GET /plugins PluginState[]: built-in and custom plugins, connected or not, with their tools
POST /plugins/{id}/connect { "apiKey", "url", "useSaved", "oAuth" } PluginState, connected, with its tools listed
PUT /plugins/custom CustomPluginRequest PluginState. Adds or edits a custom plugin (connect it afterwards).
PUT /plugins/{id}/tools { "enabled": ["search", "read_page"] } PluginState. The tools bots may use.
DELETE /plugins/{id} 204. Disconnects a built-in plugin or removes a custom one.

A custom plugin:

{
  "name": "My MCP server",
  "transport": "Stdio",
  "command": "npx",
  "args": ["-y", "@acme/mcp-server"],
  "env": { "ACME_TOKEN": "..." }
}

For "transport": "Http", give url and headers instead. When editing (with its id), send keepSecrets: true to keep the saved environment variables and headers; their values are never sent back.

Sign-in plugins on a server. If connect fails with pluginSignInUrl set in the error, the sign-in must happen in a browser. The app does it on your PC and calls connect again with the result in oAuth.

Composio apps

Method Path Returns
POST /composio/apps/{slug}/connect { connected, url, account, failed }. Open url to sign in to the app (e.g. gmail).
GET /composio/apps/{slug} The same, to check whether the sign-in finished
DELETE /composio/apps/{slug} 204

Logins

Method Path Body Returns
GET /logins LoginState[] (never passwords: hasPassword, hasPrivateKey and hasOtp say what's saved)
PUT /logins LoginSaveRequest LoginState. No id creates one.
DELETE /logins/{id} 204
POST /logins/{id}/test { ok, message }. Connects and signs in from the server.
{
  "name": "Production database",
  "kind": "PostgreSql",
  "host": "db.internal",
  "port": 5432,
  "username": "reporting",
  "database": "app",
  "password": "...",
  "allowChanges": false
}

kind is Website, Ssh, Sftp, Ftp, MySql or PostgreSql. When editing, leave password, privateKey, passphrase and otpSecret out to keep the saved ones. Which bots may use a login is part of each bot's profile (logins).

Quill

Method Path Body Returns
GET /quill QuillState[]: connected sites, plus a connection waiting for its code (with an empty id)
POST /quill/connect { "url": "docs.example.com", "name": "Product docs" } A QuillState with pendingCode and verifyUrl. Open verifyUrl and approve the code; the server finishes connecting by itself.
PUT /quill/site { "siteId", "name", "about" } 204. Names a site and says what's on it.
DELETE /quill?site={id} 204. Revokes the connection and every bot's key. Without site, cancels a pending connection.
GET /quill/page?slug=...&site=... A page for a page card (with its preview link if it's a draft). Without site, each site is tried.

Poll GET /quill every couple of seconds while connecting: the pending entry disappears once the code is approved, and gets an error if it's turned down or expires.

Blotter

Method Path Body Returns
GET /blotter BlotterState[], as for Quill
POST /blotter/connect { "url": "board.example.com" } A BlotterState with pendingCode and verifyUrl
DELETE /blotter?site={id} 204
POST /blotter/call { "siteId", "method", "path", "body" } { status, body }: a request to the site's own API as the server's connection

path is relative to the site's /api/v1/, such as tickets?status=open or tickets/WEB-12/comments. body is a JSON string.

Which bots work on which sites is part of each bot's profile (quillSites, blotterSites).