+
+This release lets outside assistants join your team. Claude Code, Codex, OpenCode and other MCP clients can now sign in to Paperclip as you, then read, create and delegate work. Connections can also carry instructions that reach your agents automatically. The release has two breaking changes that operators should read before upgrading: workspace restore locks now use a new protocol, and stored tool grants are enforced exactly as written.
+
+**New pages**
+
+- [Assistant connections (MCP)](../experimental/assistant-connections.md), with the [Assistant MCP API](api/assistant-mcp.md) and [MCP Commands](cli/mcp.md) references — connect Claude Code, Codex, OpenCode or any MCP client with browser or device-code consent, choose whether it can write, and revoke it later.
+- [Saved connection instructions](../connectors/connection-instructions.md) — write usage notes on a connection once, and every agent allowed to use it receives them on each turn.
+- [Check AI account usage](../connectors/ai-usage.md) — read the current provider limits for a saved OpenAI (Codex), Claude, Grok or OpenRouter account from the **Check usage** action.
+- [Task-pinned AI routing](../experimental/task-pinned-ai-routing.md) — the experimental connection pools that rotate new tasks across saved AI accounts while each task stays on the account it started with.
+- [Neon](../connectors/neon.md) — connect serverless Postgres with Neon sign-in or an API key, pin it to one project, and keep it read-only if you want.
+
+**Updated pages**
+
+- [Update Paperclip](../how-to/update-paperclip.md) — the restore-lock breaking change: stop every old server and worker before you upgrade or roll back, and clear away the legacy lock folders. Also: which migration in this release changes existing rows.
+- [Tool Gateway API](api/tool-gateway.md) and [Access model](../connectors/access-model.md) — stored grants are now enforced as written, and a grant with an unknown selector denies access. Check your custom grants after upgrading.
+- [HTTP adapter](adapters/http.md), [Process adapter](adapters/process.md) and [Creating an adapter](adapters/creating-an-adapter.md) — how custom adapters receive connection instructions, through `connectionInstructions` or `PAPERCLIP_CONNECTION_INSTRUCTIONS_FILE`.
+- [Agents](../guides/org/agents.md), [Agents API](api/agents.md), [Delegation](../guides/org/delegation.md) and [Team catalog](../guides/org/team-catalog.md) — much shorter default instructions for new companies and hires, and the default configuration grants new agents now receive.
+- [Skills](../guides/org/skills.md), [Skills Reference](skills.md) and [Write a company skill](../how-to/write-a-company-skill.md) — agents can update company skills with the `update_skill` tool, which uses version checks and safe retries.
+- [MCP aggregators](../connectors/mcp-aggregators.md), [Composio](../connectors/composio.md), [Arcade](../connectors/arcade.md) and the [connector catalog](../connectors.md) — accounts you already connected upstream show up in one Apps catalog, grouped with your native accounts. AgentMail is now a default connection, and [Asana](../connectors/asana.md) signs in again.
+- [Agent Chat](../experimental/agent-chat.md), [Chat-Style Tasks](../experimental/task-chat.md) and [Issues](../guides/day-to-day/issues.md) — Chat leads the navigation, an optional combined Inbox and task list, the rebuilt **New task** dialog, and the "Model at capacity" and "Model unavailable" recovery cards.
+- [Claude Code](adapters/claude-code.md), [Codex](adapters/codex.md), [OpenCode](adapters/opencode.md), [Paperclip Runner](adapters/paperclip-runner.md) and [Agent adapters](../guides/org/agent-adapters.md) — Claude Sonnet 5.5, GPT-6.1 Sol, refreshed harness pins, the supported range for remote Codex, and Codex runs that survive server restarts.
+- [Anthropic](../connectors/anthropic.md), [OpenAI](../connectors/openai.md), [xAI](../connectors/xai.md) and [OpenRouter](../connectors/openrouter.md) — reconnect an unavailable account in place from agent settings, and check usage.
+- [Trust & Low-Trust Review](../administration/trust-and-low-trust-review.md) — low-trust agents can take self-assigned work inside their scope, accept work from a person who messages them or assigns them a task directly, and update their own `AGENTS.md` when you ask from their chat.
+- Smaller updates: [Settings](../administration/settings.md), [Experimental overview](../experimental/overview.md), [Task watchdogs](../guides/projects-workflow/task-watchdogs.md) (the new 5- and 15-minute silence thresholds), [Docker](deploy/docker.md), [Sandbox Providers](adapters/sandbox-providers.md) (exe.dev **Source VM**), [Plugin SDK](plugins/sdk.md) (AI connection routers), [Artifacts](../guides/day-to-day/artifacts.md), [Work Modes](../guides/day-to-day/work-modes.md), the memory connector guides, and [Verify and troubleshoot](../connectors/verify-and-troubleshoot.md).
+
+
+
+
+
Docs for v2026.1005.0 October 5, 2026
diff --git a/docs/reference/cli/connections.md b/docs/reference/cli/connections.md
index 4dc3c29..0c6bf5b 100644
--- a/docs/reference/cli/connections.md
+++ b/docs/reference/cli/connections.md
@@ -1,5 +1,5 @@
---
-paperclip_version: v2026.1005.0
+paperclip_version: v2026.1012.0
seo_title: The connections Command
seo_description: Search the connections catalog or request access to a service from inside an active heartbeat run, using the runtime tools the run provides.
---
@@ -64,6 +64,8 @@ Like `search`, the response prints to stdout as JSON, pretty-printed when you pa
The server double-checks both provider flags: the task, the requesting agent, the user's answer, and whether the route is still allowed. Neither flag grants any access the provider connection doesn't already have.
+For `agentmail`, the request puts an API-key card on the task for the responsible user, instead of a setup link. The card creates an inbox for the requesting agent. Wait for the request to complete before you tell anyone the agent's email address.
+
> **Tip:** Search first, request second. Take the service slug from a `search` result and feed it straight into `request` so you are asking for a service the catalog actually knows about.
---
diff --git a/docs/reference/cli/managed-agent.md b/docs/reference/cli/managed-agent.md
index caf26fb..c5e5069 100644
--- a/docs/reference/cli/managed-agent.md
+++ b/docs/reference/cli/managed-agent.md
@@ -1,5 +1,5 @@
---
-paperclip_version: v2026.1005.0
+paperclip_version: v2026.1012.0
seo_title: The managed-agent Command
seo_description: Provision and qualify a locked-down Anthropic managed agent and environment, then save the company profile Paperclip uses to run it.
---
diff --git a/docs/reference/cli/mcp.md b/docs/reference/cli/mcp.md
new file mode 100644
index 0000000..65774d3
--- /dev/null
+++ b/docs/reference/cli/mcp.md
@@ -0,0 +1,79 @@
+---
+paperclip_version: v2026.1012.0
+seo_title: MCP Device Login and Proxy Commands
+seo_description: Authorize an assistant through browser device consent, then expose Paperclip tools over local stdio with the CLI's private credential store.
+---
+
+# MCP Commands
+
+Use `mcp` to connect an assistant as your human Paperclip account. Device login works without a local browser callback listener; the proxy gives a stdio-only MCP client access to the authorized remote tools.
+
+Assistant connections are experimental and off by default. These commands require an authenticated instance with [Assistant connections (MCP)](../../experimental/assistant-connections.md) enabled.
+
+```sh
+paperclipai mcp login --device --url https://YOUR-PAPERCLIP-HOST/mcp/paperclip
+paperclipai mcp proxy --url https://YOUR-PAPERCLIP-HOST/mcp/paperclip
+```
+
+## Authorize with device login
+
+```sh
+paperclipai mcp login --device --url [--company ]
+```
+
+| Option | Use |
+| --- | --- |
+| `--device` | Required. Start browser approval without a callback listener. |
+| `--url ` | Required. The exact canonical MCP URL shown by your instance. |
+| `--company ` | Restrict consent to the specified organization UUID. |
+
+Keep the command running. It prints an approval URL and a human verification code, then waits. Open the URL, sign in, compare the code, review the organization and permissions, and approve or decline. Requests expire after ten minutes; start again if the command expires.
+
+The approval URL opens your instance's `/mcp-device` page with the code already filled in. If you open `/mcp-device` yourself, type the code under **Enter the code shown by your assistant**. When you approve, the command prints `Connected to` with the MCP URL and `Organization:` with the approved organization's ID.
+
+The CLI requests read, write, and refresh access. Consent and your organization role determine which scopes you actually receive. Login verifies the approved organization with `paperclip_connection` before saving credentials.
+
+Use an HTTPS URL ending in `/mcp/paperclip`, without credentials, query parameters, or a fragment. HTTP is accepted only for localhost or loopback. The setup-page URL `/mcp/setup` is not the MCP resource URL.
+
+## Run the stdio proxy
+
+```sh
+paperclipai mcp proxy --url
+```
+
+Configure this command as a local stdio MCP server in your assistant. Use the exact URL from login. The proxy handles `initialize`, `ping`, `tools/list`, and `tools/call`; it does not provide the Events subscription interface.
+
+For example, a client that accepts command-and-arguments configuration can run:
+
+```json
+{
+ "command": "paperclipai",
+ "args": ["mcp", "proxy", "--url", "https://YOUR-PAPERCLIP-HOST/mcp/paperclip"]
+}
+```
+
+Your client's surrounding configuration format may differ. Call `paperclip_connection` from the connected client before doing work.
+
+## Credential storage and revocation
+
+Credentials stay under `$PAPERCLIP_HOME/mcp`, or `~/.paperclip/mcp` by default. The CLI uses private directories and files, replaces credentials atomically, and serializes refresh across processes. Access is bound to the exact resource URL; redirects are rejected.
+
+When login replaces an existing credential for the same instance, the CLI attempts to revoke the old connection. If that fails, it tells you to revoke it in Paperclip. You can always revoke from **Connectors → Assistant Connection (MCP)** or `/assistant-connections`.
+
+Keep tokens and private device codes out of chat and project configuration. The displayed verification code is for the human to compare during consent.
+
+## Troubleshooting
+
+| Problem | Next step |
+| --- | --- |
+| The URL is rejected | Copy the canonical `/mcp/paperclip` URL from Paperclip and check the HTTPS or loopback requirements. |
+| Device authorization expires | Start login again and approve while the command is still running. |
+| The proxy says to connect first | Run device login for that exact URL under the same OS account. |
+| Access was revoked or expired | Sign in again. Membership and consent are checked again. |
+| A write reports a connection failure | Inspect the task before retrying. The change may already have completed; the proxy never retries it automatically. |
+
+## See also
+
+- [Connect an assistant](../../experimental/assistant-connections.md)
+- [Assistant MCP reference](../api/assistant-mcp.md)
+- [Authentication](authentication.md) — other CLI authentication paths.
diff --git a/docs/reference/cli/test-drive.md b/docs/reference/cli/test-drive.md
index 0e63a2d..426a2f3 100644
--- a/docs/reference/cli/test-drive.md
+++ b/docs/reference/cli/test-drive.md
@@ -1,5 +1,5 @@
---
-paperclip_version: v2026.1005.0
+paperclip_version: v2026.1012.0
seo_title: The test-drive Command
seo_description: Spin up an isolated, self-initialized Paperclip instance with a ready-made company and CEO agent so you can try the product locally.
---
diff --git a/docs/reference/deploy/docker.md b/docs/reference/deploy/docker.md
index 388609c..eb3fca6 100644
--- a/docs/reference/deploy/docker.md
+++ b/docs/reference/deploy/docker.md
@@ -1,5 +1,5 @@
---
-paperclip_version: v2026.609.0
+paperclip_version: v2026.1012.0
seo_title: Deploy Paperclip with Docker
seo_description: Run a self-contained instance without installing Node or pnpm on the host. Covers the quickstart image, manual builds, and configuration.
---
@@ -132,4 +132,16 @@ docker run --name paperclip \
Without those keys, the app still runs. The adapter environment test will simply report missing prerequisites for the relevant adapter.
+### Remote runner provider pack
+
+The standard image also bundles the remote runner's provider pack at `/opt/paperclip-runner/provider-pack` and points `PAPERCLIP_RUNNER_REMOTE_PROVIDER_PACK_PATH` at it. Remote OpenCode and ACPX runs need that pack, so with it in place they no longer fail with `runner_remote_provider_artifact_incompatible`.
+
+If you build your own image on top of the standard one, you inherit the pack automatically. If you build from source, pass the full 40-character Git SHA as a build argument — the pack only builds when the commit is known, and a local build without it skips the pack with a log line:
+
+```sh
+docker build --target production \
+ --build-arg PAPERCLIP_BUILD_COMMIT="$(git rev-parse HEAD)" \
+ -t paperclip-local .
+```
+
> **Tip:** If you are testing adapter behavior inside Docker, verify the bind mount first. Most surprising failures come from lost state, not the container image itself.
diff --git a/docs/reference/plugins/sdk.md b/docs/reference/plugins/sdk.md
index 7bf46e4..3cb04c8 100644
--- a/docs/reference/plugins/sdk.md
+++ b/docs/reference/plugins/sdk.md
@@ -1,5 +1,5 @@
---
-paperclip_version: v2026.1005.0
+paperclip_version: v2026.1012.0
seo_title: Plugin SDK
seo_description: The worker-side authoring kit for Paperclip plugins. Import it in your worker entrypoint to declare a plugin and subscribe to host events.
---
@@ -226,6 +226,8 @@ A note on imports: the domain types these methods hand back — `IssueThreadInte
Interactions are the decision cards an agent posts into an issue thread: suggested tasks, questions, confirmations. Your plugin could already create them; now it can read them back and resolve them.
+When you create one with `ctx.issues.createInteraction`, the payload is typed as `CreateIssueThreadInteractionInput` (exported from the SDK); `ctx.issues.askUserQuestions` takes the same `ask_user_questions` shape without `kind`. It's the input shape the host validates, so you can leave out fields the host fills with defaults instead of building the fully stored form yourself.
+
| Method | Signature | Capability |
|---|---|---|
| `ctx.issues.listInteractions` | `listInteractions(issueId, companyId)` → `Promise` | `issue.interactions.read` |
@@ -398,6 +400,48 @@ You implement the lifecycle as three optional hooks on your plugin definition. E
If you implement only `onResolveExternalObject`, the host refreshes objects one at a time within the window set by your `refreshPolicy`; declaring `onRefreshExternalObjects` lets you collapse those into a single round trip. For a concrete reference implementation, see the parent `server/src/services/github-external-object-provider.ts`.
+### AI connection routers
+
+A plugin can act as the routing brain behind [task-pinned AI routing](../../experimental/task-pinned-ai-routing.md): it decides which saved AI account in a connection pool takes the next task. Paperclip does everything else — authorization, pinning tasks to accounts, storing pools, and the setup and management screens — so a router plugin is a small amount of code.
+
+To declare one, add both of these to your manifest:
+
+```ts
+capabilities: ["ai.connections.route"],
+aiConnectionRouter: {
+ name: "AI connection pool", // 1–100 characters
+ description: "Use existing AI connections.", // 1–500 characters
+},
+```
+
+The manifest validator rejects `aiConnectionRouter` without the `ai.connections.route` capability. Paperclip adds your router to the **Connectors** catalog with an **Add connection pool** action; you don't need a plugin page or sidebar entry. It is only available while the instance's `enableAiConnectionRouters` experimental flag is on and your plugin is ready.
+
+Then implement `onRouteAiConnection` on your plugin definition. The host calls it (the `routeAiConnection` worker method) when a task without a pinned account needs one:
+
+```ts
+export default definePlugin({
+ async setup() {},
+ async onRouteAiConnection(request) {
+ const next = request.candidates[0];
+ return next
+ ? { kind: "selected", memberId: next.member.id }
+ : { kind: "unavailable", skipped: {} };
+ },
+});
+```
+
+The `AiConnectionRouterRequest` carries the `companyId`, the `pool` (an `AiConnectionPool`), `agentId`, `taskKey`, `lastMemberId`, `cursorVersion`, the pool's `memberOrder`, an optional `pinnedMemberId`, the `candidates` the host has already authorized for this agent (each with its `member`, `runtimeConfig`, `notes`, and optional `usage`), and `now`. It contains no credentials and no raw provider responses.
+
+Return an `AiConnectionRouterResult`:
+
+| `kind` | Meaning |
+| --- | --- |
+| `selected` | Use `memberId`. Optionally explain skipped members in `skipped`, a map of member ID to reason. |
+| `exhausted` | Every candidate is over its limit. Paperclip defers the task until `retryAt` and shows **Pool exhausted**. Include `skipped`. |
+| `unavailable` | No candidate can run this task. Include `skipped`. |
+
+Your result is only a proposal. The host rechecks authorization and can't be made to use an account the responsible person isn't allowed to use. The SDK re-exports the related types: `AiConnectionPool`, `AiConnectionPoolConfig`, `AiConnectionPoolMember`, `AiConnectionRouterRequest`, `AiConnectionRouterResult`, and `AiConnectionRouterSelection`.
+
### JSON-RPC protocol
The SDK speaks JSON-RPC 2.0 between host and worker. Most plugin authors never call these directly, but they are exported for advanced use (custom transports, tests, replay tools).
@@ -619,6 +663,7 @@ The harness deliberately mirrors the host's own write bar rather than waving it
- `NOOP_PLUGIN_TRACER`, `NOOP_PLUGIN_SPAN` — the default no-op tracer and span (values, not types). Handy as a stand-in when you want the do-nothing default explicitly, e.g. in tests.
- Constants from `@paperclipai/shared`: `PLUGIN_API_VERSION`, `PLUGIN_STATUSES`, `PLUGIN_CATEGORIES`, `PLUGIN_CAPABILITIES`, `PLUGIN_UI_SLOT_TYPES`, `PLUGIN_UI_SLOT_ENTITY_TYPES`, `PLUGIN_RESERVED_COMPANY_SETTINGS_ROUTE_SEGMENTS`, `PLUGIN_STATE_SCOPE_KINDS`, `PLUGIN_JOB_STATUSES`, `PLUGIN_JOB_RUN_STATUSES`, `PLUGIN_JOB_RUN_TRIGGERS`, `PLUGIN_WEBHOOK_DELIVERY_STATUSES`, `PLUGIN_EVENT_TYPES`, `PLUGIN_BRIDGE_ERROR_CODES`.
- Access and permission constant arrays from `@paperclipai/shared`, matching the domain types used by [`ctx.access` and `ctx.authorization`](#access-and-authorization): `PERMISSION_KEYS`, `HUMAN_COMPANY_MEMBERSHIP_ROLES`, `HUMAN_COMPANY_MEMBERSHIP_ROLE_LABELS`, `MEMBERSHIP_STATUSES`, `PRINCIPAL_TYPES`.
+- AI connection router types re-exported from `@paperclipai/shared` for [router plugins](#ai-connection-routers): `AiConnectionPool`, `AiConnectionPoolConfig`, `AiConnectionPoolMember`, `AiConnectionRouterRequest`, `AiConnectionRouterResult`, `AiConnectionRouterSelection`.
- Connection-provider shapes re-exported from `@paperclipai/shared` for plugins that back a connection intent: `ConnectionIntentInteraction`, `ConnectionIntentPayload`, `ConnectionIntentResult`, `ConnectionIntentSetupOptions`, `ConnectionRequestResult`, `ConnectionsSearchResult`.
---
diff --git a/docs/reference/skills.md b/docs/reference/skills.md
index 2a7d2bf..dd47234 100644
--- a/docs/reference/skills.md
+++ b/docs/reference/skills.md
@@ -1,5 +1,5 @@
---
-paperclip_version: v2026.1005.0
+paperclip_version: v2026.1012.0
seo_title: Skills Reference
seo_description: The reference for company skills: file shape on disk, the install pipeline, attaching to agents, scoping rules, canonical keys, and versioning.
---
@@ -159,7 +159,7 @@ Skills are installed at the **company** level. Once installed, any agent in that
| List skills | `GET /api/companies/{companyId}/skills` |
| Skill detail (with usage) | `GET /api/companies/{companyId}/skills/{skillId}` |
| Read a file from a skill | `GET /api/companies/{companyId}/skills/{skillId}/files?path=SKILL.md` |
-| Update a file (editable skills) | `PATCH /api/companies/{companyId}/skills/{skillId}/files` |
+| Update a file (editable skills) | `PATCH /api/companies/{companyId}/skills/{skillId}/files` — see [Safe file updates](#safe-file-updates) |
| Update status (GitHub-managed) | `GET /api/companies/{companyId}/skills/{skillId}/update-status` |
| Pull latest commit | `POST /api/companies/{companyId}/skills/{skillId}/install-update` |
| Delete | `DELETE /api/companies/{companyId}/skills/{skillId}` |
@@ -169,13 +169,55 @@ Skills are installed at the **company** level. Once installed, any agent in that
Mutating routes require either `agents:create` permission or `permissions.canCreateAgents=true` on the calling agent.
+### Safe file updates
+
+`PATCH /api/companies/{companyId}/skills/{skillId}/files` writes one file in an editable skill. The body takes `path`, `content`, and optionally `encoding` (`utf8` or `base64`) and `executable`. Two more optional fields protect you from lost edits:
+
+| Field | What it does |
+|---|---|
+| `expectedVersionId` | The skill's `currentVersionId` as you last read it. If the skill has moved on since, the write is rejected with `409` and *"Skill version changed. Read the current version before retrying."* Reread the skill and apply your change to the latest version. |
+| `idempotencyKey` | 1–240 characters. Makes the write safe to retry: repeat the exact same request with the same key and you get the original result back, with no second version and no second activity entry. Reusing a key with different inputs returns `409` with *"Skill file idempotency key was used with different inputs"*. |
+
+Without `idempotencyKey`, the route responds with the updated file, as before. With it, the response is a small receipt instead:
+
+```json
+{
+ "skillId": "…",
+ "path": "SKILL.md",
+ "versionId": "…",
+ "studioPath": "/skills/studio/…"
+}
+```
+
+Either way the write is checked against the `skills.edit` policy action (even on an exact retry), recorded as a new version when the bytes or executable flag changed, and logged as `company.skill_file_updated`. This is the same route the native runner's **Update skill** tool calls when an agent edits a skill — see [Letting an agent improve an existing skill](../guides/org/skills.md#letting-an-agent-improve-an-existing-skill).
+
### Native Runner skill tools
-An agent using the native Runner can save a reusable procedure with the `create_skill` tool. It's available in Auto (`standard`) and skill-test work, not Ask or pre-acceptance Plan work. It uses the company skill API and its existing policy; creating a skill adds it to the library without assigning it to agents.
+An agent using the native Runner can save a reusable procedure with `create_skill` or improve an existing editable skill with `update_skill`. These tools are available in Auto (`standard`) and skill-test work, not Ask or pre-acceptance Plan work. They use the company skill API and its existing policy; creating a skill adds it to the library without assigning it to agents.
-`create_skill` takes `name`, `description`, `markdown`, and `idempotencyKey`, plus an optional `slug`. The name is lowercase and hyphenated; the complete file's name and description must match those inputs, and a supplied slug must equal the name. Company, agent, task, and run identity come from the authenticated run. Reuse the same `idempotencyKey` when you retry. A successful creation appears as a **Skill created** card in the task thread; see [Skills your agents create during a task](../guides/org/skills.md#skills-your-agents-create-during-a-task).
+`update_skill` requires these inputs:
-Implementation reference: [create tool contract](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/packages/paperclip-runner/src/protocol-actions/create-skill.ts) and [tool validation and REST binding](https://github.com/paperclipai/paperclip/blob/467125fafb47a8520856504fecc48d6e32055db1/server/src/services/skill-tools.ts).
+| Field | What to send |
+|---|---|
+| `skillId` | UUID of the existing skill. |
+| `markdown` | The complete primary `SKILL.md`, including valid name and description frontmatter and a nonempty body. |
+| `expectedVersionId` | The `currentVersionId` you read before editing. |
+| `idempotencyKey` | A 1–240 character retry key. |
+
+```json
+{
+ "skillId": "",
+ "expectedVersionId": "",
+ "markdown": "---\nname: release-review\ndescription: Review release notes.\n---\n\n# Review\nCheck each release note against its change.\n",
+ "idempotencyKey": "release-review-update-1"
+}
+```
+
+After a lost response, retry with exactly the same inputs and key to receive the original receipt. After a version conflict, read the current skill, reapply the edit, and use a new key. A key reused with different inputs is a conflict. Policy is checked again on exact retries.
+
+`create_skill` takes `name`, `description`, `markdown`, and `idempotencyKey`, plus an optional `slug`. The name is lowercase and hyphenated; the complete file's name and description must match those inputs, and a supplied slug must equal the name. Company, agent, task, and run identity come from the authenticated run. A successful creation appears as a **Skill created** card in the task thread; see [Skills your agents create during a task](../guides/org/skills.md#skills-your-agents-create-during-a-task).
+
+Implementation reference: [update tool contract](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/packages/paperclip-runner/src/protocol-actions/update-skill.ts) and [tool validation and REST binding](https://github.com/paperclipai/paperclip/blob/bba6a45f0d364cfd962ac59b3bdf2426a8222adb/server/src/services/skill-tools.ts).
### Import: accepted sources
@@ -659,6 +701,10 @@ Walk down this list in order. The first match is usually the problem.
- The path you imported isn't inside the company's managed skills folder, a registered project workspace, or a project's server-managed checkout folder (code `skill_workspace_boundary_denied`). Register the folder as a project workspace, or move the skill into one, and import again. Symlinks are followed before the check, so a link that points elsewhere is refused too.
+### "Skill version changed. Read the current version before retrying."
+
+- You sent `expectedVersionId` on a file update and someone saved the skill after you read it. Fetch the skill again, reapply your change to the current content, and retry with the new `currentVersionId` (and a new `idempotencyKey` if you use one).
+
### "A GitHub-synced skill didn't pick up an upstream change"
- Sources never refresh automatically. Use **Refresh** on **Skills → Sources**, or `POST /skill-sources/{sourceId}/refresh`.
diff --git a/site/content.json b/site/content.json
index 171174a..88b4f31 100644
--- a/site/content.json
+++ b/site/content.json
@@ -169,6 +169,10 @@
"title": "Action Permissions",
"file": "../docs/connectors/action-permissions.md"
},
+ {
+ "title": "Connection Instructions",
+ "file": "../docs/connectors/connection-instructions.md"
+ },
{
"title": "Review Requests",
"file": "../docs/connectors/review-requests.md"
@@ -193,6 +197,10 @@
"title": "Google Workspace Setup",
"file": "../docs/connectors/google-setup.md"
},
+ {
+ "title": "Check AI Usage",
+ "file": "../docs/connectors/ai-usage.md"
+ },
{
"title": "Memory Connectors (Experimental)",
"file": "../docs/connectors/memory-connectors.md"
@@ -367,6 +375,10 @@
"title": "Mixpanel",
"file": "../docs/connectors/mixpanel.md"
},
+ {
+ "title": "Neon",
+ "file": "../docs/connectors/neon.md"
+ },
{
"title": "Netlify",
"file": "../docs/connectors/netlify.md"
@@ -549,6 +561,14 @@
"title": "Agent Chat",
"file": "../docs/experimental/agent-chat.md"
},
+ {
+ "title": "Assistant Connections (MCP)",
+ "file": "../docs/experimental/assistant-connections.md"
+ },
+ {
+ "title": "Task-Pinned AI Routing",
+ "file": "../docs/experimental/task-pinned-ai-routing.md"
+ },
{
"title": "Chat-Style Tasks",
"file": "../docs/experimental/task-chat.md"
@@ -755,6 +775,10 @@
"title": "Authentication",
"file": "../docs/reference/api/authentication.md"
},
+ {
+ "title": "Assistant MCP",
+ "file": "../docs/reference/api/assistant-mcp.md"
+ },
{
"title": "Companies",
"file": "../docs/reference/api/companies.md"
@@ -915,6 +939,10 @@
"title": "Connect",
"file": "../docs/reference/cli/connect.md"
},
+ {
+ "title": "MCP",
+ "file": "../docs/reference/cli/mcp.md"
+ },
{
"title": "Token",
"file": "../docs/reference/cli/token.md"