mpp-mcp-gateway
Provides a storage adapter using Cloudflare KV for state persistence across requests, and supports deployment on the Cloudflare Workers platform.
Enables optional OpenTelemetry tracing for monitoring paid call spans and performance.
Exposes a /metrics endpoint for Prometheus metrics scraping, allowing monitoring of call counts and revenue.
Provides Redis-backed store and rate limiting capabilities, usable with any Redis-compatible service.
Provides a store adapter using Upstash Redis for atomic state management and rate limiting.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mpp-mcp-gatewaycall get_weather for San Francisco"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mpp-mcp-gateway
Monetize any MCP server with stablecoin micropayments via the Machine Payments Protocol (MPP) on the Tempo blockchain.
Build MCP tool servers that charge AI agents per-call, per-session, or via access keys — settled in pathUSD and other TIP-20 stablecoins. Build AI-agent clients that pay for those tools automatically with configurable spending caps.
Table of Contents
Related MCP server: AgentPay
Overview
mpp-mcp-gateway is a TypeScript library that adds stablecoin micropayment gating to MCP (Model Context Protocol) servers. When an AI agent calls a paid tool, the server issues a 402 Payment Required challenge. The agent's client signs a payment transaction on the Tempo blockchain, retries the call with a credential, and the server verifies settlement before running the handler and returning the result with a receipt.
Key capabilities:
Four pricing models — per-call, tiered, session (payment channels), and access-key (subscriptions)
Multi-currency support — accept multiple TIP-20 stablecoins per tool
Exact revenue tracking — BigInt arithmetic prevents float drift across millions of sub-cent payments
Pluggable storage — in-memory, Upstash Redis (atomic CAS), Cloudflare KV, or bring your own
Rate limiting — token bucket (in-memory or Redis-backed) with per-tool overrides
Auth middleware — bearer token, API key, HTTP Basic, signed URLs, CORS — all timing-safe
Prometheus metrics —
/metricsendpoint, zero dependenciesOpenTelemetry tracing — opt-in span tree per paid call, zero cost when disabled
Webhooks — HMAC-signed event push with retry, backoff, and dead-letter hooks
Service discovery — OpenAPI 3.1 with
x-payment-infoextensions (crawled by mpp.land)Dashboard — React UI + JSON API for live revenue and call monitoring
Graceful shutdown — drain in-flight calls, fire hooks, settle webhooks
Runtime-portable — works on Node.js 20+, Cloudflare Workers, Vercel Edge, Deno, Bun
How It Works
┌─────────────┐ 402 Challenge ┌──────────────────┐
│ AI Agent │ ────────────────────────────── │ Paid MCP Server │
│ (Client) │ │ (Gateway) │
│ │ ◄── Payment Required (-32042) │ │
│ │ │ │
│ Signs tx │ ── Credential (signed payment) │ Verifies on │
│ via mppx │ ──► │ Tempo chain │
│ │ │ │
│ │ ◄── Tool Result + Receipt │ Runs handler │
└─────────────┘ └──────────────────┘Agent calls a paid tool via MCP
Server responds with MCP error code
-32042containing an MPP challengeClient enforces spending caps, signs the payment, retries with a credential
Server verifies on-chain settlement via
mppxHandler runs, result is returned with a payment receipt (tx hash, timestamp)
Installation
npm install mpp-mcp-gatewayPeer dependencies (install only what you use):
# For HTTP/Express transports and dashboard
npm install express
# For Upstash Redis stores / rate limiting
npm install @upstash/redis
# For OpenTelemetry tracing
npm install @opentelemetry/api
# For Cloudflare Workers KV store
npm install @cloudflare/workers-typesQuick Start
Server (tool provider)
import { createPaidMcpServer } from 'mpp-mcp-gateway/server'
import { z } from 'zod'
const server = createPaidMcpServer({
name: 'my-api',
version: '1.0.0',
recipient: '0xYourWalletAddress',
secretKey: process.env.PAYMENT_SECRET_KEY!,
network: 'testnet',
tools: [
{
name: 'get_weather',
description: 'Get weather for a city. $0.001 per call.',
inputSchema: { city: z.string() },
pricing: { type: 'per-call', amount: '0.001' },
handler: async ({ city }) => ({
content: [{ type: 'text', text: `Weather in ${city}: 72°F, sunny` }],
}),
},
{
name: 'ping',
description: 'Free liveness check.',
inputSchema: {},
// No pricing = free tool
handler: async () => ({
content: [{ type: 'text', text: 'pong' }],
}),
},
],
})
await server.startStdio()Client (AI agent)
import { createPaidMcpClient } from 'mpp-mcp-gateway/client'
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'
const client = createPaidMcpClient({
name: 'my-agent',
version: '1.0.0',
privateKey: process.env.AGENT_PRIVATE_KEY! as `0x${string}`,
maxPerCall: '0.10', // safety cap: max $0.10 per single call
maxTotal: '10.00', // safety cap: max $10.00 total spend
network: 'testnet',
})
const transport = new StdioClientTransport({
command: 'node',
args: ['server.js'],
})
await client.connect(transport)
// Free call — no payment required
const ping = await client.callTool('ping')
console.log(ping.content[0].text) // "pong"
console.log(ping.paid) // false
// Paid call — automatic 402 → sign → retry
const weather = await client.callTool('get_weather', { city: 'Tokyo' })
console.log(weather.content[0].text) // "Weather in Tokyo: 72°F, sunny"
console.log(weather.paid) // true
console.log(weather.receipt?.reference) // "0xabc...def" (tx hash)
await client.close()Pricing Models
Per-Call
Fixed price per invocation. One on-chain transaction per call.
pricing: { type: 'per-call', amount: '0.001' }Tiered
Price decreases (or increases) based on cumulative call count.
pricing: {
type: 'tiered',
tiers: [
{ upTo: 100, amount: '0.01' },
{ upTo: 1000, amount: '0.005' },
{ upTo: 'unlimited', amount: '0.001' },
],
}Session (Payment Channels)
Agent opens an on-chain escrow channel once. Subsequent calls submit signed vouchers off-chain. Server settles the highest voucher when the channel closes. Best for streaming or high-frequency tools.
pricing: {
type: 'session',
amount: '0.0005', // per-unit price
unitType: 'request', // informational label
suggestedDeposit: '0.50', // hint for initial channel funding
}Client-side session management:
// Make multiple calls against the same channel
await client.callTool('think', { topic: 'AI alignment' })
await client.callTool('think', { topic: 'quantum computing' })
// Cooperatively close and settle on-chain
const result = await client.closeSession('think')
console.log(result.receipt.reference) // settlement tx hashAccess Key (Subscriptions)
Agent pays once upfront and receives an opaque token. Subsequent calls present the token — no further payment until the key expires or is exhausted. Best for "buy a day pass" or "buy N calls" UX.
pricing: {
type: 'access-key',
amount: '0.01', // upfront cost
validFor: '1d', // time limit (supports: 60s, 30m, 4h, 7d)
maxCalls: 100, // call limit (at least one of validFor/maxCalls required)
}The client handles caching automatically:
// First call: pays $0.01, receives access key
const r1 = await client.callTool('premium_data', { query: 'foo' })
console.log(r1.paid) // true
console.log(r1.accessKey?.justIssued) // true
console.log(r1.accessKey?.remainingCalls) // 99
// Subsequent calls: free (key presented in _meta)
const r2 = await client.callTool('premium_data', { query: 'bar' })
console.log(r2.paid) // falseMulti-Currency
Any pricing model can accept multiple TIP-20 stablecoins:
pricing: {
type: 'per-call',
amount: '0.001',
accept: [
{ currency: '0x20c0...0000', amount: '0.001' }, // pathUSD
{ currency: '0x20c0...0001', amount: '0.001' }, // alphaUSD
],
}Server API
import { createPaidMcpServer, PaidMcpServer } from 'mpp-mcp-gateway/server'
const server = createPaidMcpServer(config)
// Start on stdio (for CLI / subprocess use)
await server.startStdio()
// Or access the underlying McpServer for custom transports
const mcpServer = server.server
await mcpServer.connect(someTransport)
// Runtime inspection
server.getStats() // GatewayStats (calls, revenue, sessions, keys)
server.listTools() // tool names, descriptions, current prices
server.getRecentCalls(100) // last N calls from the ring buffer
server.getInFlightCount() // currently active handlers
server.isShuttingDown() // true after close() begins
server.describe() // full descriptor for discovery/OpenAPI
// Access-key management
await server.listAccessKeys() // live keys issued by this instance
await server.revokeAccessKey(token) // { revoked: boolean }
// Graceful shutdown
await server.close({ timeoutMs: 25_000 })Client API
import { createPaidMcpClient, PaidMcpClient } from 'mpp-mcp-gateway/client'
const client = createPaidMcpClient(config)
await client.connect(transport)
await client.listTools()
const result = await client.callTool('tool_name', { arg: 'value' })
// Spending state
client.getSpending() // { totalSpent, remaining, maxTotal, maxPerCall, ... }
client.resetSpending() // reset cumulative counter (for tests)
// Access key management
client.getAccessKeys() // cached keys by tool name
client.clearAccessKey('tool') // force re-payment on next call
client.clearAccessKeys() // drop all cached keys
// Session management
client.getOpenSessions() // open channels by tool name
await client.closeSession('tool') // settle channel on-chain
await client.close()Transports
The gateway works with any MCP transport. Examples included:
Transport | Use Case | Example |
stdio | CLI tools, subprocess spawning |
|
Streamable HTTP | Network servers (modern) |
|
SSE (legacy) | Older MCP clients |
|
In-Memory | Testing, same-process |
|
Store Adapters
The gateway uses a pluggable MppMcpStore interface for persisting access-key records and session channel state.
import { Store } from 'mpp-mcp-gateway/stores'Adapter | Atomicity | Use Case |
| Atomic (promise-chain) | Tests, local dev, single-instance |
| Atomic (Lua CAS) | Production, multi-instance |
| Best-effort | Edge access keys (not for sessions) |
| Best-effort | Backward compat with mppx stores |
Upstash Example
import { Redis } from '@upstash/redis'
import { createUpstashStore } from 'mpp-mcp-gateway/stores'
const store = createUpstashStore(
new Redis({ url: process.env.UPSTASH_URL!, token: process.env.UPSTASH_TOKEN! }),
{ keyPrefix: 'mppmcp:', ttlSeconds: 30 * 24 * 3600 }
)
const server = createPaidMcpServer({
// ...
accessKeyStore: store,
sessionStore: store,
})Custom Store
Implement the four-method interface:
interface MppMcpStore {
get<T>(key: string): Promise<T | null>
put(key: string, value: unknown): Promise<void>
delete(key: string): Promise<void>
update<T>(key: string, transform: (current: T | null) => T | null): Promise<T | null>
}The update method must guarantee atomic read-modify-write. The transform callback may be called multiple times under contention (CAS-style backends).
Rate Limiting
Rate limiting fires before payment and handler logic — denied calls never issue a 402 or run your handler.
const server = createPaidMcpServer({
// ...
rateLimit: {
refillPerMinute: 60, // sustained rate
capacity: 10, // burst capacity
perTool: {
expensive_ai: { refillPerMinute: 5, capacity: 2 },
cheap_lookup: { refillPerMinute: 600, capacity: 100 },
},
// Custom bucketing (e.g. per-session on HTTP transports)
keyExtractor: (toolName, extra) => `${toolName}:${extra.sessionId ?? 'default'}`,
},
})For multi-instance deployments, use the Upstash-backed limiter:
import { upstashTokenBucketLimiter } from 'mpp-mcp-gateway/rate-limit'
const limiter = upstashTokenBucketLimiter(redis, {
keyPrefix: 'mppmcp:rl:',
refillPerMinute: 120,
capacity: 20,
})
const server = createPaidMcpServer({
// ...
rateLimit: { limiter },
})Authentication Middleware
Five Express middleware factories for protecting dashboard, metrics, and discovery endpoints:
import { auth } from 'mpp-mcp-gateway'
// Bearer token (constant-time comparison)
mountDashboard(server, app, {
middleware: auth.bearerToken(process.env.DASHBOARD_TOKEN!, { realm: 'admin' }),
})
// API key in custom header
mountMetrics(server, app, {
middleware: auth.apiKey({ header: 'x-api-key', value: process.env.METRICS_KEY! }),
})
// HTTP Basic Auth (multi-user)
mountDashboard(server, app, {
middleware: auth.basicAuth({ users: { admin: 'secret' }, realm: 'gateway' }),
})
// HMAC-signed URLs with TTL
mountDashboard(server, app, {
middleware: auth.signedQuery({ secret: process.env.URL_SECRET!, ttlSeconds: 300 }),
})
// Public CORS for registry crawlers
mountDiscovery(server, app, {
middleware: auth.publicCors(),
})Dashboard & Monitoring
JSON API
import { mountDashboard } from 'mpp-mcp-gateway'
mountDashboard(server, app, { prefix: '/api' })Exposes:
Endpoint | Response |
|
|
|
|
|
|
|
|
|
|
Prometheus Metrics
import { mountMetrics } from 'mpp-mcp-gateway'
mountMetrics(server, app, {
middleware: auth.bearerToken(process.env.METRICS_TOKEN!),
})Exposed metrics:
mppmcp_calls_total{tool}— counter by toolmppmcp_calls_by_mode_total{mode}— paid, free, session, access_key, totalmppmcp_revenue_micro_usd_total{tool}— cumulative revenue in micro-USDmppmcp_in_flight_calls— gauge of active handlersmppmcp_access_keys_issued_total/expired_totalmppmcp_sessions_opened_total/closed_totalmppmcp_rate_limited_total— calls rejected by the rate limitermppmcp_rejected_shutting_down_total— calls rejected during shutdownmppmcp_uptime_secondsmppmcp_shutting_down
React Dashboard
A pre-built React + Vite dashboard lives in dashboard/. It polls the JSON API every 2 seconds and displays:
Revenue counters and tool table sorted by revenue
Live call log color-coded by payment mode
Access key and session statistics
cd dashboard
npm install
npm run buildServe dashboard/dist/ as static files from your Express app.
Service Discovery
Generate and serve an OpenAPI 3.1 document with x-payment-info extensions per the MPP service-discovery IETF draft. Public registries like mpp.land crawl this automatically.
import { mountDiscovery } from 'mpp-mcp-gateway'
mountDiscovery(server, app, {
baseUrl: 'https://api.example.com',
categories: ['data', 'search'],
docs: { homepage: 'https://example.com/docs' },
})
// GET /openapi.json → OpenAPI 3.1 with x-payment-info per toolWebhooks
Push events to a URL with HMAC-SHA-256 signatures. Delivery is fire-and-forget (non-blocking), with retry and exponential backoff.
const server = createPaidMcpServer({
// ...
webhooks: {
url: 'https://example.com/webhook',
secret: process.env.WEBHOOK_SECRET!,
events: ['payment.received', 'session.closed'], // or omit for all
maxAttempts: 3,
onDrop: async (event, lastError) => {
// Dead-letter: persist to DB for replay
await db.insert('webhook_dlq', { event, error: lastError })
},
},
})Event types: payment.received, access-key.issued, access-key.expired, session.opened, session.closed, call.failed
Receiver verification:
import { createHmac } from 'node:crypto'
function verify(req) {
const expected = 'sha256=' + createHmac('sha256', WEBHOOK_SECRET)
.update(`${req.headers['x-mppmcp-timestamp']}.${req.body}`)
.digest('hex')
return timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-mppmcp-signature']))
}OpenTelemetry Tracing
Opt-in. Pass a tracer to get a span tree per paid call. Zero overhead when disabled.
import { trace } from '@opentelemetry/api'
const server = createPaidMcpServer({
// ...
tracer: trace.getTracer('mpp-mcp-gateway', '1.0.0'),
})Span tree:
mppmcp.tool.call (root)
├── mppmcp.payment.charge (or mppmcp.session.advance, mppmcp.access-key.redeem)
└── mppmcp.handler.runAttributes: mppmcp.tool.name, mppmcp.pricing.type, mppmcp.amount, mppmcp.payment.mode, mppmcp.payment.tx-hash, mppmcp.session.action, mppmcp.error.code
Operator CLI
Inspect and manage deployed gateways from the command line:
npx mpp-mcp inspect https://my-gateway.fly.dev --token=secret123
npx mpp-mcp stats https://api.example.com
npx mpp-mcp tools https://api.example.com
npx mpp-mcp calls https://api.example.com --limit=50
npx mpp-mcp keys list https://api.example.com --token=admin
npx mpp-mcp keys revoke mppmcp_abc123... https://api.example.com --token=adminConfiguration Reference
Server (PaidMcpServerConfig)
Field | Type | Default | Description |
|
| required | Server name advertised to clients |
|
| required | Server version |
|
| required | Wallet address receiving payments |
|
| required | HMAC key for binding payment challenges |
|
| required | Tool definitions with handlers |
|
| pathUSD | TIP-20 stablecoin contract address |
|
|
| Tempo network |
|
| — | Server-sponsored gas (fee payer private key) |
|
| — | Operator key required for session settlement |
|
| per-network default | Session escrow contract |
|
| in-memory | Persistence for access keys |
|
| in-memory | Persistence for session channels |
|
|
| Bind keys to paying wallet |
|
|
| Ring buffer capacity (0 = disabled) |
|
| console+redaction | Structured logger |
|
|
| Graceful shutdown timeout |
|
| — | Hook fired when drain begins |
| object | 60/min per tool | Rate limit configuration |
|
| — | OpenTelemetry tracer (opt-in) |
|
| — | Event push configuration |
Client (PaidMcpClientConfig)
Field | Type | Default | Description |
|
| required | Client name |
|
| required | Client version |
|
| required | Agent wallet private key |
|
|
| Max spend per single call (USD) |
|
|
| Max cumulative spend (USD) |
|
|
| Max channel deposit (USD) |
|
|
| Tempo network |
|
| console+redaction | Structured logger |
|
|
| Verify session settlement tx on-chain |
Examples
Example | Pricing | Transport | What it demonstrates |
| per-call | InMemory | Full 402 round-trip in one process |
| per-call | stdio | Agent spawns server as subprocess |
| per-call | Streamable HTTP | Network server on Express |
| per-call | SSE (legacy) | Backward-compatible SSE transport |
| per-call + access-key | Streamable HTTP | Combined MCP + dashboard + discovery |
| session | stdio | Payment channels, vouchers, close |
| access-key | stdio | Day pass, time-only, call packs |
| per-call | stdio | Gate Peer Cash tools, then cash out MPP revenue |
Run any example:
# In-memory demo (no wallet needed)
npm run example:demo
# Server + client pairs
npm run example:server # then in another terminal:
npm run example:client
npm run example:http:server
npm run example:http:client
npm run example:streaming:server
npm run example:streaming:client
npm run example:subscription:server
npm run example:subscription:client
# Node.js 22+, Tempo mainnet
npm run example:peer-cash:server
# Dashboard (with all endpoints)
npm run example:dashboard:serverFunding a Test Wallet
Paid examples require a funded wallet on Tempo testnet. The Peer Cash example is the exception: it uses Tempo mainnet because the revenue route is live-only.
cast rpc tempo_fundAddress 0xYourAddress --rpc-url https://rpc.moderato.tempo.xyzRuntime Compatibility
The core library (server, client, stores, rate limit, amounts, access keys) is runtime-portable via Web Crypto:
Runtime | Support |
Node.js 20+ | Full |
Cloudflare Workers | Full |
Vercel Edge | Full |
Deno | Full |
Bun | Full |
The auth.ts middleware module uses node:crypto and requires Node.js. Edge deployments use their platform's native router and auth primitives instead.
Architecture
src/
├── server.ts PaidMcpServer — payment gating, stats, shutdown, webhooks
├── client.ts PaidMcpClient — auto-payment, caps, key caching, sessions
├── types.ts Core interfaces (PricingModel, configs, stats, results)
├── index.ts Barrel exports (11 subpath entry points)
├── access-keys.ts Issue, redeem (atomic), validate, duration parsing
├── amounts.ts BigInt <-> USD string conversion (exact arithmetic)
├── auth.ts 5 Express middleware factories (timing-safe)
├── cli.ts Operator CLI (inspect, stats, tools, calls, keys)
├── constants.ts Tempo networks, token addresses, escrow contracts
├── dashboard.ts JSON API: /api/stats, /api/tools, /api/calls
├── discovery.ts OpenAPI 3.1 generation with x-payment-info
├── errors.ts 9 typed error classes with stable codes
├── logger.ts Logger interface + 4 implementations + redaction
├── metrics.ts Prometheus /metrics (hand-formatted, zero deps)
├── rate-limit.ts RateLimiter interface + 3 implementations
├── runtime.ts Cross-runtime: randomHex, writeLogLine, hmacSha256Hex
├── tracing.ts OTel span helpers (no-op when disabled)
├── webhooks.ts HMAC-signed event push with retry + dead-letter
└── stores/
├── types.ts MppMcpStore interface
├── index.ts Store namespace + re-exports
├── memory.ts In-memory (atomic via promise chains)
├── upstash.ts Upstash Redis (atomic via Lua CAS)
├── cloudflare-kv.ts Cloudflare KV (best-effort)
└── bridge.ts Legacy 3-method store adapterPackage Exports
{
".": "Main barrel (everything)",
"./server": "PaidMcpServer",
"./client": "PaidMcpClient",
"./dashboard": "mountDashboard",
"./discovery": "mountDiscovery, buildOpenApi",
"./stores": "Store adapters",
"./rate-limit": "Rate limiter implementations",
"./auth": "Auth middleware factories",
"./metrics": "mountMetrics, formatMetrics",
"./tracing": "startSpan, withSpan, TRACE_ATTRS",
"./webhooks": "WebhookDispatcher, event types"
}Design Principles
Revenue exactness — all money math uses
bigintbase units (6 decimals). No float drift after millions of operations.Zero-cost opt-in — tracing, webhooks, and rate limiting are no-ops unless configured. Non-traced deployments allocate no spans.
Pluggable everything — stores, loggers, rate limiters, and auth are interface-based. Swap implementations without touching gateway code.
Fail fast — configuration errors throw at construction time, not at request time.
Errors are values — typed error classes with stable codes. Use
instanceoforerr.codefor programmatic handling.Ring buffer call log — O(1) pre-allocated, never grows. No GC pressure under high throughput.
Graceful lifecycle — shutdown gate rejects new calls, drain waits for in-flight, webhook flush, then disconnect.
Development
# Install dependencies
npm install
# Build
npm run build
# Type check
npm run typecheck
# Run tests
npm run test
# Run tests in watch mode
npm run test:watch
# Type tests (tsd)
npm run test:types
# Benchmarks
npm run bench
# Generate docs
npm run docsTest Suite
27+ test files covering:
Access-key atomicity (concurrent redeems of N-call keys)
Access-key flows (issue → redeem → exhaust → re-pay)
Amount math (BigInt conversions, edge cases)
Auth middleware (all 5 factories)
Call-log ring buffer (wrap-around, capacity limits)
Graceful shutdown & drain
Dashboard API responses
Discovery / OpenAPI generation
Error taxonomy
Free tools (no-payment path)
Logger (structured output, redaction, child loggers)
Prometheus metrics formatting
Multi-currency discovery
Paid flow (402 → credential → receipt)
Pricing calculations (tiered, per-call)
Rate limiting (token bucket, denial, retry-after)
Revenue exactness (BigInt accumulation across many calls)
Runtime helpers (randomHex, hmacSha256Hex)
Session lifecycle (open → voucher → close → settle)
Spending caps (per-call, total, session deposit)
OpenTelemetry tracing (span attributes, error recording)
Webhooks (delivery, retry, HMAC signature, dead-letter)
Type tests (via
tsd)Throughput benchmarks (via
vitest bench)
Graceful Shutdown
Wire close() to your container's shutdown signal:
process.on('SIGTERM', async () => {
try {
await server.close({ timeoutMs: 25_000 })
process.exit(0)
} catch {
process.exit(1) // drain timed out
}
})Structured Logging
The library ships a pluggable Logger interface. Default: JSON to stderr with automatic redaction of secrets (private keys, credentials, signed transactions).
import { consoleLogger, silentLogger, withRedaction } from 'mpp-mcp-gateway'
// Custom logger
const server = createPaidMcpServer({
// ...
logger: withRedaction(consoleLogger({ level: 'debug', pretty: true })),
})
// Silence for tests
const server = createPaidMcpServer({
// ...
logger: silentLogger(),
})Adapt to pino, winston, or any logging library:
const adapter: Logger = {
debug: (m, c) => pino.debug(c, m),
info: (m, c) => pino.info(c, m),
warn: (m, c) => pino.warn(c, m),
error: (m, c) => pino.error(c, m),
child: (bindings) => /* wrap pino.child(bindings) */,
}License
MIT — Gaurav Pant
This server cannot be deployed
Maintenance
Related MCP Connectors
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Remote MCP server for AI.TV creators — delegate account operations to your AI agent over MCP.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Paid MCP tools behind one endpoint. Agents pay per call in USDC on Base via x402.
Related MCP Servers
- -licenseNot gradedqualityNot gradedmaintenanceA production-ready TypeScript MCP server providing basic tools (add, echo, timestamp), resources (server info, greetings, data access), and prompt templates (analyze, code-review, summarize). Serves as a foundation for building custom MCP servers with extensible architecture.261 npm-
- AlicenseNot gradedqualityCmaintenanceMCP server for AgentPay — the payment gateway for autonomous AI agents. Fund a wallet once, give your agent the key, and it discovers, provisions, and pays for tool APIs on its own. One key, every tool.112 npm1MIT
- AlicenseNot gradedqualityDmaintenanceSimplifies creating MCP servers in TypeScript with an Express-like API and experimental decorators, enabling quick definition of tools, resources, and prompts.30 npm196MIT
- AlicenseNot gradedqualityDmaintenanceTurn your typed TypeScript functions into an MCP server — tool, resource, and prompt schemas inferred from your types and JSDoc. No schema library, no decorators, no boilerplate.9 npmMIT