All free skills / Other majors
agent-base 9.x
Use agent-base 9 as an ESM adapter for Node's HTTP and HTTPS agent machinery.
- For
agent-base@9.0.0- Verified
- 2026-09-08, 3 examples executed
- Skill package
@modootoday/pmcp-agent-base@9.0.0
Use this skill for free
No PMCP login or subscription is required. Download the original instructions, or install the content-only archive with your project's package manager.
Download SKILL.md · Download package archive
npm install --save-dev https://pmcp.build/skills/agent-base/9/package.tgz
PMCP discovers the installed package's instructions. Connect your runtime after installation.
Archive integrity
sha512-O354EwwyWRb/TXM8kE0Vc84yyhjSH8Ge7mpDMU4hpIizpQPAjefsIvgKh9m18WHp65dy7q2Wc/TY0k3mBjFcJg==Complete instructions
Verified against agent-base@9.0.0 on 2026-09-08. 3 of 3 examples executed.
agent-base
Version and module shape
This skill targets agent-base 9.x. It is ESM-only and requires Node.js 20 or newer. Import the named Agent class and helpers:
import { Agent, json, req, toBuffer } from 'agent-base';
Do not use the old CommonJS/default-export form:
const agent = require('agent-base');
That was the v6 shape. The v7 API removed the default export and introduced the named abstract Agent class.
Agent subclass contract
Agent extends Node's http.Agent. A subclass must implement:
connect(
req: http.ClientRequest,
options: AgentConnectOpts
): Promise<Duplex | http.Agent> | Duplex | http.Agent;
connect() may return:
- a
Duplexsocket; - another
http.Agent, delegating connection handling; or - a promise resolving to either of those.
The options include secureEndpoint: boolean, which distinguishes HTTPS from HTTP connection requests. The resulting agent is passed to Node's http or https APIs through their { agent } option.
import assert from 'node:assert/strict';
import { PassThrough } from 'node:stream';
import { Agent } from 'agent-base';
class LocalAgent extends Agent {
connect(_request: never, options: { secureEndpoint: boolean }) {
assert.equal(options.secureEndpoint, false);
return new PassThrough();
}
}
const agent = new LocalAgent({ keepAlive: true });
assert.ok(agent instanceof Agent);
assert.equal(agent.options.keepAlive, true);
const socket = agent.connect({} as never, { secureEndpoint: false });
assert.ok(socket instanceof PassThrough);
The package is an adapter, not a request runner. In a real request, pass the subclass instance to Node's http.get() or https.get() as { agent }. The connection implementation normally returns a socket created by the appropriate networking API, or returns another agent when delegation is needed.
Version 9's createSocket agent detection uses duck typing. This matters when delegating to agent implementations that are not instances of Node's http.Agent, such as tunnel-agent's TunnelingAgent; do not rely on the older strict-instance behavior.
toBuffer()
toBuffer(readable) consumes a readable stream and resolves to a Buffer containing its bytes. Provide Buffer or other byte chunks to the readable stream.
import assert from 'node:assert/strict';
import { Readable } from 'node:stream';
import { toBuffer } from 'agent-base';
const result = await toBuffer(
Readable.from([Buffer.from('hello '), Buffer.from('world')]),
);
assert.ok(Buffer.isBuffer(result));
assert.equal(result.toString('utf8'), 'hello world');
json()
json(readable) consumes a readable stream, decodes it as UTF-8, and parses it with JSON.parse.
import assert from 'node:assert/strict';
import { Readable } from 'node:stream';
import { json } from 'agent-base';
const value = await json(Readable.from([Buffer.from('{"ok":true,"count":2}') ]));
assert.deepEqual(value, { ok: true, count: 2 });
The input must contain valid JSON. Parsing failures reject with the error from JSON.parse.
req()
req(url, opts) creates and ends an HTTP or HTTPS request based on the URL and returns the http.ClientRequest with a promise-like .then method. It is intended as a small request helper; the returned thenable resolves to the response.
This helper necessarily starts a real HTTP(S) request, so it is not demonstrated with a runnable example here: examples in this skill must run without network access. Use it only in an environment where the target URL is available, and provide request options as the second argument when needed.
Common mistakes
- Importing a default export or using
require('agent-base'); v9 uses the named ESM exportAgent. - Trying to instantiate
Agentdirectly; it is abstract and requires aconnect()implementation. - Treating
connect()as returning only a socket. It can return a socket, another agent, or a promise of either. - Ignoring
options.secureEndpointwhen choosing HTTP versus HTTPS/TLS connection behavior. - Passing string chunks to
toBuffer()through a Node readable; use byte chunks such asBufferorUint8Array. - Treating agent-base as a standalone request runner. It integrates with Node's
httpandhttpsrequest machinery. - Running package examples that use
describe,it, orexpectdirectly. Those are runner globals, not part of agent-base or a plain Node/Bun script.
Not covered
This skill does not cover the internal details of Node's http.Agent pooling, custom proxy protocols, TLS option construction, tunnel-agent integration beyond the v9 duck-typing change, or network-backed usage of req(). It also does not cover package development commands or the package's test suite.