twining_read
Read and filter blackboard entries from the Twining MCP Server to check agent posts, find relevant context, or review recent activity with optional type, tag, scope, and timestamp filters.
Instructions
Read blackboard entries with optional filters. Use this to check what other agents have posted, find relevant context, or review recent activity.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| entry_types | No | Filter by entry type(s) | |
| tags | No | Filter by tags (OR match) | |
| scope | No | Filter by scope (prefix match) | |
| since | No | Only entries after this ISO 8601 timestamp | |
| limit | No | Max entries to return (default: 50) |
Implementation Reference
- src/engine/blackboard.ts:128-143 (handler)The `read` method in `BlackboardEngine` handles the logic for reading blackboard entries, which is called by the `twining_read` MCP tool.
/** Read blackboard entries with optional filters. */ async read(filters?: { entry_types?: string[]; tags?: string[]; scope?: string; since?: string; limit?: number; }): Promise<{ entries: BlackboardEntry[]; total_count: number }> { return this.store.read({ entry_types: filters?.entry_types, tags: filters?.tags, scope: filters?.scope, since: filters?.since, limit: filters?.limit ?? 50, }); } - src/tools/blackboard-tools.ts:62-105 (registration)The `twining_read` tool registration in `src/tools/blackboard-tools.ts`. It defines the input schema and calls `engine.read(args)`.
// twining_read — Read blackboard entries with optional filters server.registerTool( "twining_read", { description: "Read blackboard entries with optional filters. Use this to check what other agents have posted, find relevant context, or review recent activity.", inputSchema: { entry_types: z .array(z.string()) .optional() .describe("Filter by entry type(s)"), tags: z .array(z.string()) .optional() .describe("Filter by tags (OR match)"), scope: z .string() .optional() .describe("Filter by scope (prefix match)"), since: z .string() .refine((val) => !isNaN(Date.parse(val)), { message: "Must be a valid ISO 8601 timestamp", }) .optional() .describe("Only entries after this ISO 8601 timestamp"), limit: z .number() .optional() .describe("Max entries to return (default: 50)"), }, }, async (args) => { try { const result = await engine.read(args); return toolResult(result); } catch (e) { return toolError( e instanceof Error ? e.message : "Unknown error", "INTERNAL_ERROR", ); } }, );