Picture of Wyatt Johnson

Wyatt Johnson

Full-stack developer


Built with at
Picture of Wyatt Johnson

Wyatt Johnson

Full-stack developer

JSR MCP

Give Your LLM Complete Access to the JavaScript Registry

August 5, 2025

I just published two packages that provide a MCP server that gives Claude, GPT-4, or any MCP-compatible LLM full access to JSR - the JavaScript Registry. Use these tools to search packages, manage scopes, and even publish new versions, all through natural language.

  • jsr.io/@wyattjoh/jsr-mcp - MCP server that interacts with JSR
  • jsr.io/@wyattjoh/jsr - client library that interacts with JSR

Getting Started with Claude Desktop

Let me walk you through the setup. First, make sure you have Claude Desktop (version 0.7.0 or later).

Edit your Claude Desktop configuration:

1# On macOS
2code ~/Library/Application\ Support/Claude/claude_desktop_config.json

Add the JSR server to your MCP servers:

1{
2 "mcpServers": {
3 "jsr": {
4 "command": "deno",
5 "args": [
6 "run",
7 "--allow-env=JSR_API_URL,JSR_REGISTRY_URL,JSR_API_TOKEN",
8 "--allow-net=api.jsr.io,jsr.io",
9 "jsr:@wyattjoh/jsr-mcp"
10 ]
11 }
12 }
13}

Restart Claude Desktop. The MCP connection indicator will show it's active.

Usage Examples

Once connected, you can ask Claude things like: "Search for testing packages on JSR"

Claude will call the search tool and return results:

1await jsr_search_packages({
2 query: "testing",
3 limit: 10
4});
5// Returns packages like @std/testing, @mock/test, etc.

"Show me all versions of @oak/oak"

1await jsr_list_package_versions({
2 scope: "oak",
3 name: "oak"
4});
5// Returns all published versions with metadata

"What's the quality score of @std/fs?"

1await jsr_get_package_score({
2 scope: "std",
3 name: "fs"
4});
5// Returns documentation, compatibility, and quality metrics

Public vs Authenticated Operations

The server works in two modes:

Public Mode (No Token Required)

Most read operations work without authentication:

1{
2 "mcpServers": {
3 "jsr": {
4 "command": "deno",
5 "args": [
6 "run",
7 "--allow-env=JSR_API_URL,JSR_REGISTRY_URL,JSR_API_TOKEN",
8 "--allow-net=api.jsr.io,jsr.io",
9 "jsr:@wyattjoh/jsr-mcp"
10 ]
11 }
12 }
13}

This gives you:

  • Package search and discovery
  • Version information
  • Dependency analysis
  • User and scope lookups
  • Registry statistics

Authenticated Mode (With API Token)

For package management, you need a JSR API token:

1{
2 "mcpServers": {
3 "jsr": {
4 "command": "deno",
5 "args": [
6 "run",
7 "--allow-env=JSR_API_URL,JSR_REGISTRY_URL,JSR_API_TOKEN",
8 "--allow-net=api.jsr.io,jsr.io",
9 "jsr:@wyattjoh/jsr-mcp"
10 ],
11 "env": {
12 "JSR_API_TOKEN": "your-jsr-api-token"
13 }
14 }
15 }
16}

Get your token at jsr.io/account/tokens.

This unlocks:

  • Creating and managing scopes
  • Publishing packages and versions
  • Managing scope members
  • Updating package metadata
  • Yanking versions

Available Tools

The server exposes 50+ tools covering every JSR operation. Here are the categories:

Package Discovery & Information

  • jsr_search_packages - Full-text package search
  • jsr_get_package - Detailed package information
  • jsr_get_package_metadata - Registry metadata
  • jsr_get_package_score - Quality metrics
  • jsr_list_packages - Browse all packages

Version Management

  • jsr_list_package_versions - All versions of a package
  • jsr_get_package_version - Specific version details
  • jsr_create_package_version - Publish new versions
  • jsr_update_package_version - Yank versions

Dependency Analysis

  • jsr_get_package_dependencies - What a package depends on
  • jsr_get_package_dependents - What depends on a package

Scope Operations

  • jsr_create_scope - Create new scopes
  • jsr_update_scope - Configure scope settings
  • jsr_list_scope_packages - Packages in a scope
  • jsr_list_scope_members - Scope collaborators

User Management

  • jsr_get_current_user - Your JSR profile
  • jsr_get_user_scopes - User's scope memberships
  • jsr_accept_scope_invite - Join scopes
  • jsr_add_scope_member - Invite collaborators

Examples

Here's what people are using this for:

Package Discovery

  • "Find all Deno-compatible HTTP servers"
  • "What testing frameworks support both Node and Deno?"
  • "Show me packages by the Deno team"

Dependency Research

  • "What packages depend on @std/fs?"
  • "Show me the dependency tree for @oak/oak version 12.0.0"
  • "Find packages with zero dependencies"

Quality Analysis

  • "Compare quality scores of all markdown parsers"
  • "Which @std packages have the best documentation?"
  • "Find packages with 100% browser compatibility"

Package Management (with token)

  • "Create a new scope for my company"
  • "Publish version 2.0.0 of my package"
  • "Add [email protected] as admin to @mycompany scope"
  • "Yank the broken 1.2.3 version"

Publishing Packages

With authentication, Claude can publish packages for you:

1await jsr_create_scope({
2 scope: "mycompany",
3 description: "Corporate packages"
4});
5
6await jsr_create_package({
7 scope: "mycompany",
8 package: "utils"
9});
10
11await jsr_create_package_version({
12 scope: "mycompany",
13 name: "utils",
14 version: "1.0.0",
15 configPath: "deno.json",
16 tarballPath: "./dist/package.tar.gz"
17});

You prepare the tarball, Claude handles the JSR API calls.

Advanced: Authorization Flows

The server even supports OAuth-style authorization flows:

1// Start authorization
2const auth = await jsr_create_authorization({
3 challenge: "random-string",
4 permissions: [{ scope: "package:write" }]
5});
6
7// User approves in browser
8await jsr_approve_authorization({
9 code: auth.code
10});
11
12// Exchange for token
13const token = await jsr_exchange_authorization({
14 exchangeToken: auth.exchangeToken,
15 verifier: "challenge-verifier"
16});

This enables building custom JSR integrations through Claude.

Configuration Options

Three environment variables control the server:

  • JSR_API_TOKEN - Your authentication token
  • JSR_API_URL - Custom API endpoint (default: https://api.jsr.io)
  • JSR_REGISTRY_URL - Custom registry URL (default: https://jsr.io)

What's Next

Some ideas for future enhancements:

  • Bulk operations for managing multiple packages
  • Package migration tools from npm
  • Automated compatibility testing
  • Package analytics and insights
  • CI/CD integration helpers

Try It Now

  1. Install Claude Desktop or Claude Code
  2. Add the configuration above
  3. Start exploring JSR through natural language

Or use it programmatically:

1deno add @wyattjoh/jsr

The full source is at github.com/wyattjoh/jsr-mcp.

Picture of Wyatt Johnson

Hey, I'm Wyatt! I work on Next.js at Vercel. I'm passionate about open source and building secure, impactful software. Want to chat about better software or collaborate on a project? Find me on GitHub or BlueSky! Any comments or questions on this please reach out via email.

On this page
Getting Started with Claude DesktopUsage ExamplesPublic vs Authenticated OperationsPublic Mode (No Token Required)Authenticated Mode (With API Token)Available ToolsPackage Discovery & InformationVersion ManagementDependency AnalysisScope OperationsUser ManagementExamplesPublishing PackagesAdvanced: Authorization FlowsConfiguration OptionsWhat's NextTry It Now