npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@h4rvey-g/opencode-anyrouter-cc

v0.1.0

Published

OpenCode plugin for using AnyRouter as a Claude API provider, fixes tool name casing and array serialization issues

Readme

opencode-anyrouter-cc

An OpenCode plugin for using AnyRouter as a Claude API provider with OpenCode.

OpenCode sends tool names in lowercase (e.g. todowrite, webfetch), which causes compatibility issues when using AnyRouter's Claude API. This plugin transparently converts tool names to PascalCase and fixes array serialization problems, making OpenCode work seamlessly with AnyRouter.

Problems Solved

1. Tool Name Casing

OpenCode uses lowercase tool names, but AnyRouter's Claude API requires correct casing. This plugin converts them automatically:

| OpenCode (lowercase) | Converted (PascalCase) | |---------------------|------------------------| | todowrite | TodoWrite | | webfetch | WebFetch | | google_search | Google_Search | | Other names | First letter capitalized |

Transformation covers:

  • Request body: tools[].name and messages[].content[].name (tool_use blocks)
  • Response body: content[].name (tool_use blocks)
  • SSE stream: content_block_start events with tool_use type

2. Array Serialization Fix

Fixes an issue where arrays/objects in tool_use input fields are serialized as JSON strings. The plugin detects string values starting with [ or { and parses them back to proper JSON objects.

Installation

Prerequisites

Option 1: Local Link (Recommended for Development)

git clone <repo-url> opencode-anyrouter-cc
cd opencode-anyrouter-cc
bun install
mise run build
mise run link

This creates a symlink at ~/.config/opencode/plugin/opencode-anyrouter-cc.js.

Option 2: Global Plugin Directory

bun install
mise run build
cp dist/index.js ~/.config/opencode/plugins/opencode-anyrouter-cc.js

Option 3: npm Package (After Publishing)

Add to your project's opencode.json:

{
  "plugin": ["opencode-anyrouter-cc"]
}

Or install globally in ~/.config/opencode/opencode.json:

{
  "plugin": ["opencode-anyrouter-cc"]
}

OpenCode Configuration for AnyRouter

Use either project-level opencode.json or global ~/.config/opencode/opencode.json.

Minimal working config

{
  "plugin": [
    "opencode-anyrouter-cc"
  ],
  "anthropic": {
    "options": {
      "baseURL": "https://anyrouter.top/v1",
      "apiKey": "sk-",
      "headers": { "Authorization": "Bearer sk-" }
    }
  }
}

Full config example

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": [
    "opencode-anyrouter-cc"
  ],
  "anthropic": {
    "options": {
      "baseURL": "https://anyrouter.top/v1",
      "apiKey": "sk-your-anyrouter-key",
      "headers": {
        "Authorization": "Bearer sk-your-anyrouter-key"
      }
    }
  }
}

If you use a local plugin file, replace "opencode-anyrouter-cc" with your relative path (for example "./opencode-anthropic-tool-name-transformer.mjs").

Development

bun install          # Install dependencies
mise run build       # Build the plugin
mise run test        # Run tests
mise run link        # Symlink to OpenCode plugin dir

How It Works

The plugin monkey-patches globalThis.fetch at initialization time. It only intercepts requests to URLs containing /v1/messages (the Anthropic Messages API endpoint). All other requests pass through unchanged.

Request flow:
  OpenCode (lowercase) -> patchedFetch (PascalCase) -> AnyRouter API
                                                            |
  OpenCode <- transformResponse/SSE <-----------------------+

License

MIT