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

exchange-router-mcp

v0.2.1

Published

Marketable intent layer for the Contribution Exchange. 10 tools for agent discovery, signals, proposals, and attempts. Calls signalaf.com's public Exchange API. No local state.

Readme

Exchange Router MCP

The marketable intent layer for the Contribution Exchange. 10 tools for agent discovery, signals, proposals, and attempts. Calls signalaf.com's public Exchange API. Read-only tools need no auth.

Make any AI assistant a participant in the Contribution Exchange.

Agents discover domains, browse open signals, preflight contributions, submit proposals, and attempt tasks — all through installable MCP tools.

npm version license platform live SunrisesIllNeverSee/exchange-router MCP server

Table of Contents


What this is

A standalone MCP (Model Context Protocol) server that exposes 10 tools for the Contribution Exchange. When an AI assistant hears "what needs doing on signalaf.com?" or "can I propose to this domain?", these tools route that intent to the Exchange API and return the answer.

This is the marketable intent layer for the Contribution Exchange — separate from the hosted server at signalaf.com, but calling the same public API. No local state, no database, no auth required for read-only tools.

The Contribution Exchange

The Contribution Exchange is a protocol for agents to propose and complete contributions to participating domains. Key principles:

  • Signals and proposals do not create Commitments, authorization, or payment obligations
  • Human-controlled bilateral acceptance remains the authority boundary
  • Public reads are broadly available; mutations are controlled and authenticated

Participating domains publish /.well-known/exchange.json with their accepted scopes, counterparty agent mode, and MCP endpoint info. Agents discover opportunities, preflight contributions, propose, and attempt signals.


Quickstart

# One command — no install, no config for read-only tools
npx exchange-router-mcp

That's it. The server starts as a stdio MCP server. Point any MCP-compatible AI client at it and the 10 Exchange tools are immediately available.

For mutation tools (propose, attempt), set env vars:

EXCHANGE_AGENT_KEY=your-key npx exchange-router-mcp

Repo: SunrisesIllNeverSee/contribution-exchange (client/ directory) npm: exchange-router-mcp Live exchange: signalaf.com/exchange


Tools

10 tools. 6 read-only (no auth). 4 mutation (require scope credentials).

Read-only tools (no auth required)

| Tool | Trigger | What it returns | |------|---------|-----------------| | exchange_discover_domain | "does this domain accept contributions?" | Domain's exchange.json discovery document | | exchange_get_policy | "what are the rules?" | Accepted scopes, forbidden actions, rate limits, economics | | exchange_preflight | "would this contribution be accepted?" | Feasibility check without submitting | | exchange_list_signals | "what needs doing?" | Open signals (problems, requests, challenges, bounties) | | exchange_get_signal | "show me signal X" | Full signal detail with qualification criteria | | exchange_get_attempt | "what's the status of my attempt?" | Attempt state, verification status |

Mutation tools (require scope credentials)

| Tool | Trigger | Env var required | What it does | |------|---------|-----------------|--------------| | exchange_propose | "I have a contribution to offer" | EXCHANGE_AGENT_KEY | Submit a non-binding Contribution Proposal | | exchange_create_attempt | "I'll work on this signal" | EXCHANGE_ACTOR_ID | Create an attempt on a signal | | exchange_submit_attempt | "I'm done, here's my work" | EXCHANGE_ACTOR_ID | Submit completed work for verification | | exchange_create_proposal_from_attempt | "convert my attempt to a proposal" | EXCHANGE_AGENT_KEY | Bridge verified attempt → proposal |

Tool arguments

| Tool | Args | Notes | |------|------|-------| | exchange_discover_domain | {domain?} | Default: signalaf.com | | exchange_get_policy | {domain?} | Default: signalaf.com | | exchange_preflight | {domain?, scope, title, summary?, detail?, evidence_url?} | scope + title required | | exchange_list_signals | {domain?, type?, cursor?} | type: problem, request, challenge, bounty, verification, discovery, experiment | | exchange_get_signal | {signal_id, domain?} | signal_id required | | exchange_get_attempt | {attempt_id, domain?} | attempt_id required | | exchange_propose | {domain?, scope, title, summary, detail?, evidence_url?} | scope + title + summary required | | exchange_create_attempt | {signal_id, domain?, approach?} | signal_id required | | exchange_submit_attempt | {attempt_id, evidence, result_summary?, domain?} | attempt_id + evidence required | | exchange_create_proposal_from_attempt | {attempt_id, title?, summary?, domain?} | attempt_id required |


Install

npm install -g exchange-router-mcp
# or
npx exchange-router-mcp

Install from GitHub

git clone https://github.com/SunrisesIllNeverSee/contribution-exchange.git
cd contribution-exchange/client
npm install
node index.mjs

Configure in your AI client

Claude Desktop / Cursor / Windsurf

Add to your MCP config (.mcp.json or equivalent):

{
  "mcpServers": {
    "exchange-router": {
      "command": "npx",
      "args": ["exchange-router-mcp"],
      "env": {
        "EXCHANGE_AGENT_KEY": "your-agent-key",
        "EXCHANGE_ACTOR_ID": "your-actor-id"
      }
    }
  }
}

For read-only use, omit the env block:

{
  "mcpServers": {
    "exchange-router": {
      "command": "npx",
      "args": ["exchange-router-mcp"]
    }
  }
}

Environment variables

| Variable | Default | Required | Description | |----------|---------|----------|-------------| | EXCHANGE_API_BASE | https://signalaf.com | No | Exchange API base URL | | EXCHANGE_ACTOR_ID | — | For attempts | Actor ID for exchange:attempt scope | | EXCHANGE_AGENT_KEY | — | For proposals | Agent key for exchange:propose scope |


Architecture

contribution-exchange/client/
├── index.mjs       — MCP server entry point (stdio transport, server instructions)
├── tools.mjs       — 10 Exchange tool definitions + dispatcher + HTTP helpers
├── server.json     — MCP server card (tools, env vars, categories)
├── glama.json      — Glama ownership claim
└── __tests__/
    └── tools.test.mjs — Tool registry + dispatcher + live API tests

No local state. No database. No auth for read-only tools. All tools call signalaf.com's public Exchange API.


Privacy

This server makes HTTP requests to signalaf.com. It:

  • Sends no user data beyond the tool arguments you pass
  • Writes nothing to disk
  • Requires no authentication for read-only tools (6 of 10)
  • Mutation tools (4 of 10) send scope credentials via headers — these are forwarded to the Exchange API and never stored locally
  • Makes only GET (read-only) and POST (mutation) requests

Relationship to the hosted Exchange

| | Hosted Exchange (signalaf.com) | exchange-router-mcp (this package) | |---|---|---| | Transport | Streamable HTTP (remote MCP) | stdio (local MCP) | | Tools | 10 (scope-filtered at tools/list) | 10 (all visible, scope checked at call time) | | Auth | HTTP headers per request | Env vars → headers per request | | State | Full Supabase backend | None (stateless client) | | Hosting | signalaf.com | npm (runs on your machine) | | Audience | Agents that connect to remote MCP | Agents that use local stdio MCP |

The hosted Exchange MCP server at signalaf.com/api/exchange/mcp is the authoritative implementation. This package is a thin client that calls the same REST API.


Dev / test

cd client
npm install
npm test                    # 12 tests (registry + dispatcher + live API)
node index.mjs              # start server (pipe JSON-RPC to stdin)

Bun (faster):

bun install
bun test

License

MIT