Loading...
Loading...
Compare original and translation side by side
@contextvm/sdk@contextvm/sdkimport { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { NostrServerTransport } from "@contextvm/sdk";
import { PrivateKeySigner } from "@contextvm/sdk";
import { ApplesauceRelayPool } from "@contextvm/sdk";
const signer = new PrivateKeySigner(process.env.SERVER_PRIVATE_KEY!);
const relayPool = new ApplesauceRelayPool([
"wss://relay.contextvm.org",
"wss://cvm.otherstuff.ai",
]);
const server = new McpServer({
name: "my-server",
version: "1.0.0",
});
// Register tools
server.registerTool(
"echo",
{ description: "Echo back the input" },
async ({ message }) => ({
content: [{ type: "text", text: `Echo: ${message}` }],
}),
);
const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
serverInfo: {
name: "My ContextVM Server",
website: "https://example.com",
},
});
await server.connect(transport);
console.log("Server running on Nostr");import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { NostrServerTransport } from "@contextvm/sdk";
import { PrivateKeySigner } from "@contextvm/sdk";
import { ApplesauceRelayPool } from "@contextvm/sdk";
const signer = new PrivateKeySigner(process.env.SERVER_PRIVATE_KEY!);
const relayPool = new ApplesauceRelayPool([
"wss://relay.contextvm.org",
"wss://cvm.otherstuff.ai",
]);
const server = new McpServer({
name: "my-server",
version: "1.0.0",
});
// 注册工具
server.registerTool(
"echo",
{ description: "Echo back the input" },
async ({ message }) => ({
content: [{ type: "text", text: `Echo: ${message}` }],
}),
);
const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
serverInfo: {
name: "My ContextVM Server",
website: "https://example.com",
},
});
await server.connect(transport);
console.log("Server running on Nostr");| Option | Type | Description |
|---|---|---|
| | Required. Signs all Nostr events |
| | Required. Relay connection manager. |
| | Optional. Metadata for announcements |
| | Publish server announcements. Default: |
| | Whitelist client public keys |
| | Bypass whitelist for specific methods |
| | Inject client pubkey into |
| | |
| 选项 | 类型 | 描述 |
|---|---|---|
| | 必填项。对所有Nostr事件进行签名 |
| | 必填项。中继连接管理器。 |
| | 可选项。公告用元数据 |
| | 发布服务器公告。默认值: |
| | 客户端公钥白名单 |
| | 针对特定方法绕过白名单 |
| | 将客户端公钥注入 |
| | |
const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
allowedPublicKeys: ["client1-pubkey-hex", "client2-pubkey-hex"],
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
allowedPublicKeys: ["client1-pubkey-hex", "client2-pubkey-hex"],
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
allowedPublicKeys: ["trusted-client"],
excludedCapabilities: [
{ method: "tools/list" }, // Anyone can list tools
{ method: "tools/call", name: "public_tool" }, // Specific tool is public
],
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
allowedPublicKeys: ["trusted-client"],
excludedCapabilities: [
{ method: "tools/list" }, // 任何人都可列出工具
{ method: "tools/call", name: "public_tool" }, // 特定工具为公开
],
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
isPublicServer: true,
serverInfo: {
name: "Weather Service",
about: "Get weather data worldwide",
website: "https://weather.example.com",
},
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
isPublicServer: true,
serverInfo: {
name: "Weather Service",
about: "Get weather data worldwide",
website: "https://weather.example.com",
},
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
injectClientPubkey: true,
});
// In your tool handler, access _meta.clientPubkey
server.registerTool("personalized", {...}, async (args, extra) => {
const clientPubkey = extra._meta?.clientPubkey;
// Use pubkey for personalization, rate limiting, etc.
});const transport = new NostrServerTransport({
signer,
relayHandler: relayPool,
injectClientPubkey: true,
});
// 在工具处理器中,访问_meta.clientPubkey
server.registerTool("personalized", {...}, async (args, extra) => {
const clientPubkey = extra._meta?.clientPubkey;
// 使用公钥进行个性化处理、速率限制等操作
});assets/server-template.tsassets/server-template.tsnpxnpx @modelcontextprotocol/inspector <command>NostrServerTransportreferences/debugging-inspector.mdnpxnpx @modelcontextprotocol/inspector <command>NostrServerTransportreferences/debugging-inspector.mdreferences/transport-config.mdreferences/security-patterns.mdreferences/gateway-pattern.mdreferences/transport-config.mdreferences/security-patterns.mdreferences/gateway-pattern.md