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

@aynicobros/mcp

v0.1.1

Published

MCP server for building an ayni cobros integration: creates test charges and drives them through the bank simulator, so an assistant can exercise the code it just wrote.

Readme

@aynicobros/mcp

An MCP server for building an ayni cobros integration. It creates test charges and drives them through the bank simulator, so an assistant can exercise the code it just wrote instead of only describing it.

https://aynicobros.com/llms.txt tells a model how the integration works. This lets it run one.

Test mode only, and that is the whole safety model

An MCP server is a process that holds an API key and hands a language model tools that use it. That inverts the rule @aynicobros/node is built around — the secret key never leaves your server — because here it sits on a laptop beside a model reading text other people wrote. A merchant pasting a customer's message into an assistant is pasting untrusted instructions next to a charge-creating tool.

So:

  • The server refuses to start with an ayn_live_ key. Not a per-call check that someone can forget or reorder — the process does not come up.
  • create_test_charge hardcodes mode: 'test'. It is not in the tool schema, so no argument can change it.
  • The API refuses simulate-payment against a live charge unconditionally, which is a second guard that does not depend on the first.

The blast radius of the worst case is a row in a database.

Live charge creation is deliberately absent. It needs per-call human confirmation, which is a protocol concern rather than a bigger version of this.

Setup

Get a test key from your ayni dashboard, then:

{
  "mcpServers": {
    "aynicobros": {
      "command": "npx",
      "args": ["-y", "@aynicobros/mcp"],
      "env": { "AYNI_TEST_KEY": "ayn_test_..." }
    }
  }
}

AYNI_API_ORIGIN overrides the API host while developing locally. It is read from the environment and never from a tool argument — an origin a model can choose is an origin a model can be talked into choosing.

Tools

| Tool | What it does | | --------------------- | -------------------------------------------------------------------------------------- | | create_test_charge | Creates a mode: test charge; returns checkoutUrl and publicToken | | simulate_payment | Settles it through the bank simulator | | simulate_expiry | Expires it, so the unhappy path is reachable too | | get_charge | Reads one charge and its payments | | list_charges | Lists charges, newest first | | get_checkout_status | Reads a charge by its public token, the way the payer's browser does — no key involved |

The loop it makes possible

create_test_charge  →  open the checkoutUrl and look at it
                    →  simulate_payment
                    →  get_checkout_status, and watch PENDING become PAID

Then the same again with simulate_expiry, which is the branch most integrations never test until a real charge expires on a real customer.

Amounts and dates, once more

amount is a decimal string in major units: "250.00" is 250 Bs, not 250 centavos. dueInDays is resolved against the Bolivian calendar by datePlusDays() — a server on UTC is a day ahead of Bolivia for four hours out of every day.