Loading...
Loading...
Build MCP clients that connect to ContextVM servers over Nostr. Use when creating clients, discovering servers, connecting to remote servers, handling encrypted connections, or implementing the proxy pattern for existing MCP clients.
npx skill4agent add contextvm/cvmi client-devimport { Client } from "@modelcontextprotocol/sdk/client";
import {
NostrClientTransport,
PrivateKeySigner,
ApplesauceRelayPool,
EncryptionMode,
} from "@contextvm/sdk";
const signer = new PrivateKeySigner(process.env.CLIENT_PRIVATE_KEY!);
const relayPool = new ApplesauceRelayPool([
"wss://relay.contextvm.org",
"wss://cvm.otherstuff.ai",
]);
const SERVER_PUBKEY = "server-public-key-hex";
const transport = new NostrClientTransport({
signer,
relayHandler: relayPool,
serverPubkey: SERVER_PUBKEY,
encryptionMode: EncryptionMode.OPTIONAL,
});
const client = new Client({
name: "my-client",
version: "1.0.0",
});
await client.connect(transport);
// Use the client
const tools = await client.listTools();
const result = await client.callTool({
name: "echo",
arguments: { message: "Hello" },
});const transport = new NostrClientTransport({
signer,
relayHandler: relayPool,
serverPubkey: "known-server-pubkey",
});import { CTXVM_MESSAGES_KIND, SERVER_ANNOUNCEMENT_KIND } from "@contextvm/sdk";
// Query relays for server announcements
await relayPool.subscribe([{ kinds: [SERVER_ANNOUNCEMENT_KIND] }], (event) => {
const serverInfo = JSON.parse(event.content);
console.log(`Found server: ${serverInfo.serverInfo.name}`);
console.log(`Pubkey: ${event.pubkey}`);
});| Option | Type | Description |
|---|---|---|
| | Required. Signs all Nostr events |
| | Required. Relay connection manager |
| | Required. Target server's public key |
| | |
| | Skip initialization handshake. Default: |
| | Logging verbosity |
const transport = new NostrClientTransport({
signer,
relayHandler: relayPool,
serverPubkey: SERVER_PUBKEY,
isStateless: true, // Skip initialize roundtrip
});NostrMCPProxyimport { NostrMCPProxy } from "@contextvm/sdk";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const proxy = new NostrMCPProxy({
// Local transport for existing client to connect to
mcpHostTransport: new StdioServerTransport(),
// Remote server connection
nostrTransportOptions: {
signer,
relayHandler: relayPool,
serverPubkey: SERVER_PUBKEY,
},
});
await proxy.start();// Require encrypted connections only
encryptionMode: EncryptionMode.REQUIRED;
// Use encryption if server supports it (default)
encryptionMode: EncryptionMode.OPTIONAL;
// Never use encryption
encryptionMode: EncryptionMode.DISABLED;assets/client-template.tsctxcntools/listnpx @contextvm/ctxcn init
npx @contextvm/ctxcn add <server-pubkey>
npx @contextvm/ctxcn updatereferences/nostr-way-without-sdks.mdreferences/discovery.mdreferences/proxy-pattern.mdreferences/stateless-mode.md