Skip to main content
Glama

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
NameRequiredDescriptionDefault
entry_typesNoFilter by entry type(s)
tagsNoFilter by tags (OR match)
scopeNoFilter by scope (prefix match)
sinceNoOnly entries after this ISO 8601 timestamp
limitNoMax entries to return (default: 50)

Implementation Reference

  • 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,
      });
    }
  • 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",
          );
        }
      },
    );

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/daveangulo/twining-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server