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.
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.
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
The server works in two modes:
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
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
The server exposes 50+ tools covering every JSR operation. Here are the categories:
jsr_search_packages
- Full-text package searchjsr_get_package
- Detailed package informationjsr_get_package_metadata
- Registry metadatajsr_get_package_score
- Quality metricsjsr_list_packages
- Browse all packages
jsr_list_package_versions
- All versions of a packagejsr_get_package_version
- Specific version detailsjsr_create_package_version
- Publish new versionsjsr_update_package_version
- Yank versions
jsr_get_package_dependencies
- What a package depends onjsr_get_package_dependents
- What depends on a package
jsr_create_scope
- Create new scopesjsr_update_scope
- Configure scope settingsjsr_list_scope_packages
- Packages in a scopejsr_list_scope_members
- Scope collaborators
jsr_get_current_user
- Your JSR profilejsr_get_user_scopes
- User's scope membershipsjsr_accept_scope_invite
- Join scopesjsr_add_scope_member
- Invite collaborators
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"
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.
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.
Three environment variables control the server:
JSR_API_TOKEN
- Your authentication tokenJSR_API_URL
- Custom API endpoint (default: https://api.jsr.io
)JSR_REGISTRY_URL
- Custom registry URL (default: https://jsr.io
)
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
- Install Claude Desktop or Claude Code
- Add the configuration above
- Start exploring JSR through natural language
Or use it programmatically:
The full source is at github.com/wyattjoh/jsr-mcp.