open-pr
Prepare arcade-mcp changes for review by verifying intended behavior, filling the repository PR template, and creating or…
Build new Arcade error adapters from scratch using public Arcade TDK patterns. Use when adding provider integrations, mapping SDK exceptions, or extending HTTP/GraphQL/auth adapter behavior.
Claude Code
$ npx -y skills add ArcadeAI/arcade-mcp --skill build-error-adapter --agent claude-code
Codex
$ npx skills add ArcadeAI/arcade-mcp --skill build-error-adapter -a codex -y
Cursor
$ npx skills add ArcadeAI/arcade-mcp --skill build-error-adapter -a cursor -y
Gemini CLI
$ npx skills add ArcadeAI/arcade-mcp --skill build-error-adapter -a gemini-cli -y
GitHub Copilot
$ npx skills add ArcadeAI/arcade-mcp --skill build-error-adapter -a github-copilot -y
OpenCode
$ npx skills add ArcadeAI/arcade-mcp --skill build-error-adapter -a opencode -y
Windsurf
$ npx skills add ArcadeAI/arcade-mcp --skill build-error-adapter -a windsurf -y
name: build-error-adapter description: Build new Arcade error adapters from scratch using public Arcade TDK patterns. Use when adding provider integrations, mapping SDK exceptions, or extending HTTP/GraphQL/auth adapter behavior.
Use this workflow to create new error adapters that fit Arcade TDK conventions.
Start here and align behavior with this doc:
(timeouts, connection/DNS/TLS failures, decoding errors, redirect exhaustion). `status_code` is always `None`; use one of the `NETWORK_TRANSPORT_RUNTIME_*` kinds: `_TIMEOUT`, `_UNREACHABLE`, `_UNMAPPED`.
environment misconfiguration (invalid URL, unsupported protocol, bad headers, TLS trust failures). Never retried.
hint for the LLM to retry.
1. Keep imports at top-level only (no inline imports), except optional dependency imports that must be lazy by design. 2. Adapter interface contract:
3. Return `None` when the exception is not recognized for that adapter. 4. Return a `ToolRuntimeError` subclass for recognized exceptions (`UpstreamError`, `UpstreamRateLimitError`, etc.). 5. Preserve privacy:
6. Add tests for every new mapping path. 7. Match your installed Arcade version's decorator API and parameter names.
If you are not fully sure what `str(exc)`, vendor `reason`, or nested payload fields can contain, treat them as potentially sensitive.
Use this decision rule:
1. **Known-safe field** (documented stable code/reason without sensitive payload): may be included in `message`. 2. **Unknown or mixed-content field**: keep out of `message`; include only in `developer_message`. 3. **High-risk content** (headers/body/credential-like strings): never include in `message`; sanitize or omit even in `developer_message` if policy requires.
When in doubt, prefer slightly less detail in `message` and richer diagnostics in `developer_message`.
Use an **error adapter** when:
Raise explicit tool errors in tool code when:
from arcade_core.errors import ToolRuntimeError
class VendorErrorAdapter:
slug = "_vendor"
def from_exception(self, exc: Exception) -> ToolRuntimeError | None:
# recognize typed vendor exceptions
# return mapped ToolRuntimeError
return NoneExample ordering:
1. Rate limit subtype 2. Auth subtype 3. Timeout/transport subtype 4. General vendor exception fallback
For adapted errors:
**Upstream responded with an HTTP status code → `UpstreamError`:**
`UpstreamError` derives retryability from status code, so predictable behavior is automatic.
**No complete response from upstream → `NetworkTransportError`:**
Use this class when the exception inherently means the request never reached the upstream, or no complete response came back. `status_code` is `None` by design.
| Exception kind | `kind=` | `can_retry=` | |---|---|---| | Timeouts (connect, read, pool) | `NETWORK_TRANSPORT_RUNTIME_TIMEOUT` | `True` | | Connection refused, DNS, TLS handshake, remote-protocol errors | `NETWORK_TRANSPORT_RUNTIME_UNREACHABLE` | `True` | | Decoding failures, generic transport fallback | `NETWORK_TRANSPORT_RUNTIME_UNMAPPED` | `True` | | Redirect-loop exhaustion | `NETWORK_TRANSPORT_RUNTIME_UNMAPPED` | `False` |
**Tool-authoring bugs / local environment misconfiguration → `FatalToolError`:**
Use this class for exceptions that will never succeed on retry — the tool's code or environment needs to change:
Use when the user needs to run GitNexus CLI commands like analyze/index a repo, check status, clean the index, generate a wiki,…
Query and invoke tools on MCP servers using fastmcp list and fastmcp call. Use when you need to discover what tools a server…
Design n8n AI agents the right way. Use when building or editing any @n8n/n8n-nodes-langchain.* AI node — an AI Agent, LLM chain,…
小红书内容发布技能。支持两种发布模式:(1) 上传图文模式 - 图片+短文;(2) 写长文模式 - 长篇文章+排版模板。 支持两种输入方式:用户提供完整内容和图片/图片URL,直接发布;或提供网页URL,自动提取内容和图片。…